Ruby 元编程:初始化 singleton_class 变量
- 为什么在调用
Foo.set
之前,Foo.val
返回nil
而不是"foo"
? - 是否有任何机制可以在类评估时初始化
@val
? @val = "foo" 存储在哪个范围内?
类 Foo 类<<自己 @val =“富” attr_reader :val def 设置(值) @val = val 结尾 结尾 结尾 p Foo.val # nil Foo.set("酒吧") p Foo.val #“酒吧”
- Why does
Foo.val
returnnil
instead of"foo"
before callingFoo.set
? - Is there any mechanism for initializing
@val
on class evaluation? In which scope is
@val = "foo"
stored into?class Foo class << self @val = "foo" attr_reader :val def set(val) @val = val end end end p Foo.val # nil Foo.set("bar") p Foo.val # "bar"
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以像这样在 Foo 中初始化
@val
:您的代码不是在 Foo 上初始化
@val
,而是在 Foo 的元类上初始化You can initialize
@val
in Foo like this:Your code initializes
@val
not on Foo, but on Foo's metaclassRuby 通常在解析表达式时执行它们。您的代码未按预期执行的原因是因为您正在为 Foo 的单例类设置类实例变量,但另一方面您正在访问 Foo 本身的类实例变量,即为什么它不起作用:
这就是为什么
Foo.val
在你的情况下产生nil
- 它尚未设置。在类评估上设置
val
可以通过 Victor 已经演示的方式来实现。另请参阅这篇文章有关范围的讨论。
Ruby generally executes expressions upon parsing them. The reason why your code did not perform as expected is because you are setting a class instance variable for the singleton class of Foo, but on the other hand you are accessing the class instance variable of Foo itself, that's why it doesn't work:
That's why
Foo.val
yieldsnil
in your case - it hasn't been set yet.Setting
val
on class evaluation can be achieved in the way that Victor already demonstrated.See also this post for a discussion about scope.
无需使用#set。
只需定义 #val 方法并使用 nil 保护:
No need to use #set.
Simply define #val method and use nil guard: