在方法主体中赋值常量



David Flanagan 和 Yukihiro Matsumoto 的"The Ruby Programming Language" 在 Section 4.5.2 Assign to Constants 中陈述了以下内容

不允许在方法主体中赋值常量。

我理解前提并尝试两种代码变体:

PERSONS = {}
def create_persons(filename)
  File.foreach(filename).with_index do |line, number|
    array = line.split(' ').unshift(number+1)
    hash = {:id => array[0],:first_name => array[1], :last_name => array[2], :email => array[3]}
    PERSONS = hash
  end
end

我收到一个错误:

santa.rb:13: dynamic constant assignment
    PERSONS = hash
             ^

我尝试第二个版本,其中我没有使用等于运算符进行赋值,而是将空数组初始化为常量,并使用追加运算符将哈希附加到空数组。这行得通!

PERSONS = []
def create_persons(filename)
  File.foreach(filename).with_index do |line, number|
    array = line.split(' ').unshift(number+1)
    hash = {:id => array[0],:first_name => array[1], :last_name => array[2], :email => array[3]}
    PERSONS << hash
  end
end

我的问题是为什么当我使用 <<赋值运算符时第二个版本有效,但不适用于 = 赋值运算符。

Ruby 中常量的奇怪之处在于你可以定义它们一次,但除非它们被冻结,否则可以无休止地修改它们。第一个是问题,因为您要切换PERSONS引用的对象。在第二种情况下,您要向现有对象添加某些内容,这是允许的。

从技术上讲,可以重新定义常量,但最好避免这样做。

最新更新