gpt4 book ai didi

ruby - "public"、 "private"和 "protected"方法究竟做了什么?

转载 作者:太空宇宙 更新时间:2023-11-03 16:16:28 24 4
gpt4 key购买 nike

几乎所有关于 Ruby 中 OOP 的体面资源都说明了访问修饰符的存在 - 关键字 publicprivateprotected - 并展示了如何正确使用它们。很少有人解释这些修饰符不是关键字,而是实际的方法,调用它们会修改 future 在这个特定类中定义的所有方法的可见性。但是,我找不到任何关于如何他们实际上是这样做的信息。他们是否更改了一个特殊的内部变量,或者他们是否更改了当前范围/绑定(bind)的属性,或者他们是否设置了一些特定的解释器标志,或者......或者什么?

我自己做了一些研究,但它让我比以前更加困惑。考虑以下代码片段:

class Test
public
define_method :public_define_method do
puts 'Public define_method'
end

private
define_method :private_define_method do
puts 'Private define_method'
end

public
def public_def
puts 'Public def'
end

private
def private_def
puts 'Private def'
end
end

t = Test.new

t.public_define_method
t.private_define_method
t.public_def
t.private_def

#Output:
#> Public define_method
#> Private define_method
#> Public def
#> sandbox.rb:29:in `<main>': private method `private_def' called for #<Test:0x00000001cdfd38> (NoMethodError)

我一直认为 defdefine_method 的一种优化语法糖,具有创建新变量可见性范围的额外怪癖,但显然,似乎有更重要的是 - 使用 def 创建的方法受 private/public 修饰符的影响,而使用 define_method 创建的方法则受不是。此外,define_method doesn't have任何与更改方法的可见性相关的参数,这使我得出结论,关于它的信息必须存储在类中,而不是方法本身——因此应该由访问修饰符设置标志。但为什么 defdefine_method 如此不同?后台发生了什么?它是否检查访问修饰符方法设置的标志,然后将自己添加到类的私有(private)/ protected 方法的一些特殊隐藏寄存器中?..

总之,我很困惑,如果有人能澄清这个问题,我会很高兴。提前致谢!

最佳答案

是吗?

公开 http://apidock.com/ruby/Module/public

With no arguments, sets the default visibility for subsequently defined methods to public. With arguments, sets the named methods to have public visibility.

来源:

static VALUE
rb_mod_public(int argc, VALUE *argv, VALUE module)
{
secure_visibility(module);
if (argc == 0) {
SCOPE_SET(NOEX_PUBLIC);
}
else {
set_method_visibility(module, argc, argv, NOEX_PUBLIC);
}
return module;
}

私有(private) http://apidock.com/ruby/Module/private

With no arguments, sets the default visibility for subsequently defined methods to private. With arguments, sets the named methods to have private visibility.

来源:

static VALUE
rb_mod_private(int argc, VALUE *argv, VALUE module)
{
secure_visibility(module);
if (argc == 0) {
SCOPE_SET(NOEX_PRIVATE);
}
else {
set_method_visibility(module, argc, argv, NOEX_PRIVATE);
}
return module;
}

protected http://apidock.com/ruby/Module/protected

With no arguments, sets the default visibility for subsequently defined methods to protected. With arguments, sets the named methods to have protected visibility.

来源

static VALUE
rb_mod_protected(int argc, VALUE *argv, VALUE module)
{
secure_visibility(module);
if (argc == 0) {
SCOPE_SET(NOEX_PROTECTED);
}
else {
set_method_visibility(module, argc, argv, NOEX_PROTECTED);
}
return module;
}

但是,这对于此信息的实际应用并没有真正帮助。您可能会在 What are the differences between "private", "public", and "protected methods"? 等问题上找到更多适用于现实世界的信息和 Why does Ruby have both private and protected methods? .

关于ruby - "public"、 "private"和 "protected"方法究竟做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43075366/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com