【发布时间】:2018-09-27 04:00:07
【问题描述】:
考虑以下代码:
c1 = Class.new { ANSWER = 42 }
#⇒ #<Class:0x00556c8fc09c60> < Object
c1.constants
#⇒ []
c1.new.class.constants
#⇒ []
c1.new.singleton_class.constants
#⇒ []
Object.constants.grep /ANS/
#⇒ [:ANSWER]
该常量似乎是在Object 上定义的。但是通过对const_set 的显式调用,常量赋值可以完美地工作:
c2 = Class.new { const_set :ANSWER, 42 }
#⇒ #<Class:0x00556c8f7f3568> < Object
c2.constants
#⇒ [:ANSWER]
c2.new.class.constants
#⇒ [:ANSWER]
c2.new.singleton_class.constants
#⇒ [:ANSWER]
我的问题是:是什么阻止了在第一个 sn-p 中将常量正确分配给 Class.new 实例?
【问题讨论】:
-
@MarcinKołodziej 似乎last answer there 阐明了他的问题,并且词汇范围在这里很重要。我们似乎需要一个明确的
class关键字来打开新范围。 -
这确实很疯狂,但认为理所当然的
define_method与明确的def的工作方式相似,也许这是故意的。 -
Class.new { self::ANSWER = 42 }可以解决问题,如果您想更明确一点,请使用Class.new { |c| c::ANSWER = 42 }。