在方法体内分配恒定

时间:2016-06-01 03:02:50

标签: ruby constants

David Flanagan撰写的“Ruby编程语言”& Yukihiro Matsumoto在4.5.2节分配给常量

中说明了以下内容
  

在方法体内不允许赋值给常量。

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

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
             ^

我尝试第二个版本,而不是使用相等的运算符赋值,我将一个空数组初始化为常量,并使用append运算符将哈希值附加到空数组。这有效!

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

我的问题是为什么第二个版本在我使用&lt;&lt;赋值运算符,但不适用于=赋值运算符。

1 个答案:

答案 0 :(得分:1)

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

从技术上讲,重新定义常数是可能的,但最好避免这种情况。