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
引用的对象。在第二种情况下,您要向现有对象添加某些内容,这是允许的。
从技术上讲,可以重新定义常量,但最好避免这样做。