内容简介:如何真正讓 Ruby Constants 常數無法被修改
大概翻了一下 Effective Ruby ,覺得其中第四個 Be Awre That Constants Are Mutable 有點意思,記錄下來。
在 Ruby 裡面大寫開頭的叫做常數,Ruby 開發者可能知道這個常數是可以被事後修改的,雖然會有警告啦,但是還是被修改到了,那有沒有辦法可以真正無法被修改呢? 原來要用 freeze
,而且還需要點技巧。
讓我們看一下代碼:
X = 1 X = 2 (irb):17: warning: already initialized constant X 只是警告而已 # X 變成 2 了 :(
直接 X.freeze
是沒有用的…
X.freeze X = 3 (irb):20: warning: already initialized constant X # X 還是變成 3 了 :(
解法:要用一個 module 包起來,然後 freeze 這個 module
module Y X = 1 end Y.freeze Y::X = 2 # RuntimeError: can't modify frozen Module 丟出錯誤例外,不能修改!
接下來看看使用容器的情況:
class A
B = ["a", "b", "c"].freeze
def self.mutate
B[0] << "x"
end
end
A::B << "d"
# RuntimeError: can't modify frozen Array 丟出錯誤例外,不能修改!
A.mutate
A::B # 被修改成 ["ax", "b", "c"] 了,失敗 :(
Ruby 開發者大概已經知道只 freeze 一個容器,只能防止新增和刪除元素,不能阻止個別的元素被直接修改。所以解法是每個元素都要再 freeze 一次:
class A
B = ["a", "b", "c"].map!(&:freeze).freeze
def self.mutate
B[0] << "x"
end
end
A::B << "d"
# RuntimeError: can't modify frozen Array 丟出錯誤例外,不能修改!
A.mutate
# RuntimeError: can't modify frozen String 丟出錯誤例外,不能修改!
這樣就搞定啦。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
HTML和XHTML权威指南(第五版)
Chuck Musciano、Bill Kennedy / 技桥 / 清华大学出版社 / 2004-6-1 / 72.00元
HTML!XHTML!级联样式表!编写网页的标准很难整理,因为各种版本的Netscape和Internet Explorer在其实现方式上千差万别。《HTML与XHTML权威指南》将这些标准全部介绍给了读者。本书作者找出了各种标准和浏览器特性,并在创建网页方面为读者提出了很多建议,以便能够被更广泛的浏览者和平台所接受。 学习HTML或XHTML和学习其他任何语言一样。大部分学生都是从......一起来看看 《HTML和XHTML权威指南(第五版)》 这本书的介绍吧!