gpt4 book ai didi

ruby - 如何确定恒定的可访问性?

转载 作者:数据小太阳 更新时间:2023-10-29 07:07:01 25 4
gpt4 key购买 nike

Ruby 似乎在持续可访问性方面经历了数次变化。对于 Ruby 1.9.2,在问答中有关于常量可访问性的描述 here ,但那里写的不再是真的。

在 Ruby 2.3 中,如果我在类中定义了一个常量:

class A
Foo = :a
end

我无法通过 instance_evalclass_eval 访问它:

A.new.instance_eval{Foo} # => error
A.class_eval{Foo} # => error
A.instance_eval{Foo} # => error

虽然我可以从类主体访问它:

class A; Foo end # => :a

从 Ruby 2.3 开始,常量可访问性是如何工作的?如果可能,请解释 Ruby 中持续可访问性的历史变化以及导致这些变化的论点。

最佳答案

注:以下答案基于Ruby 2.2,未在2.3上验证

根据 Module#class_eval 的文档

Evaluates the string or block in the context of mod, except that when a block is given, constant/class variable lookup is not affected.

虽然下面的代码出错了,

A.class_eval{Foo} # uninitialized constant Foo (NameError)

以下在对字符串进行evaled 时有效。

A.class_eval("Foo") #=> :a

Constant 似乎也需要模块名称或类名称才能正确评估。以下作品:

A.class_eval{self::Foo} #=> :a

那么,这些:

A.new.instance_eval {self.class::Foo} #=> :a
A.instance_eval {self::Foo} #=> :a

关于ruby - 如何确定恒定的可访问性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35005972/

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