关于红宝石CONSTANT的困惑

时间:2014-02-19 14:18:08

标签: ruby const

假设一个关于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!我想知道为什么?

2 个答案:

答案 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