【发布时间】:2016-11-11 19:07:56
【问题描述】:
为什么以下两个代码 sn-ps 不会产生相同的输出? push 和 |= 之间的区别很棘手。我想|= 是一个任务可能会有所作为?最重要的是,常量实际上以后不会发生变化,我猜不是吗?
代码来自this question 的答案。你可以看到它in action here。
class LibraryItem
ATTRIBUTES = ['title', 'authors', 'location']
end
class LibraryBook < LibraryItem
ATTRIBUTES.push('ISBN', 'pages']
end
puts LibraryItem::ATTRIBUTES
puts LibraryBook::ATTRIBUTES
> ["title", "authors", "location", "ISBN", "pages"]
> ["title", "authors", "location", "ISBN", "pages"]
和
class Foo
ATTRIBUTES = ['title','authors','location']
end
class Bar < Foo
ATTRIBUTES |= ['ISBN', 'pages']
end
puts Foo::ATTRIBUTES
puts Bar::ATTRIBUTES
> ["title", "authors", "location"]
> ["title", "authors", "location", "ISBN", "pages"]
【问题讨论】:
-
在第一个例子中,
ATTRIBUTES在这两种情况下都引用了 same 数组,在一个地方修改它意味着另一个地方也会看到更改。在第二个中,您正在为Bar创建一个新数组,而不是更改共享数组,这会产生您想要的行为。 -
所以是分配决定了一切?这意味着如果我的类得到子类,任何子类都可以更改“常量”?
-
这段代码无法编译。
-
@QPaysTaxes Ruby 是一种解释型语言。
-
@RyanBemrose 哎呀,是的。我的意思是说第一个会引发语法错误。
标签: ruby class constants immutability