假设一个关于CONSTANT变量的简单ruby程序:
OUTER_CONST = 99
class Const
def get_const
CONST
end
CONST = OUTER_CONST + 1
end
puts Const.new.get_const
我假设Const.new.get_const
的结果应为零,但结果为100!我想知道为什么?
答案 0 :(得分:4)
get_const
是一种方法,您在 CONST
定义之后将其称为;所以当你打电话时CONST
已经定义了。
def get_const ... end
定义了一种方法,不执行其内容;您在Const.new.get_const
行调用内容时执行其内容,因此已定义CONST
。
除此之外:如果在CONST
来电时未定义get_const
,则您不会获得nil
,而是NameError
:
class Const
def get_const
CONST
end
end
Const.new.get_const #=> NameError: uninitialized constant Const::CONST
答案 1 :(得分:2)
这是因为Ruby是dynamic并且常量查找在运行时发生。还要记住,您的脚本是按顺序评估的(即逐行评估)。
为了清晰起见,我添加了一些评论:
OUTER_CONST = 99
class Const
def get_const
CONST
end
CONST = OUTER_CONST + 1
# the CONST constant is now
# defined and has the value 100
end
# at this point the Const class
# and CONST constant are defined and can be used
# here you are calling the `get_const` method
# which asks for the value of `CONST` so the
# constant lookup procedure will now start and
# will correctly pick up the current value of `CONST`
Const.new.get_const # => 100