内容简介:如何真正讓 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 丟出錯誤例外,不能修改!
這樣就搞定啦。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 不修改模板的前提下修改VisualState中的某些值
- 修改Git已提交的的Author和EMail(批量修改脚本)
- ViewGroup 默认顺序绘制子 View,如何修改?什么场景需要修改绘制顺序?
- Per.js 史上最大修改版本,2.1 版本更新,修改 5 项功能
- 通过修改环境变量修改当前进程使用的系统 Temp 文件夹的路径
- Linux下修改时区
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Mechanics of Web Handling
David R. Roisum
This unique book covers many aspects of web handling for manufacturing, converting, and printing. The book is applicable to any web including paper, film, foil, nonwovens, and textiles. The Mech......一起来看看 《The Mechanics of Web Handling》 这本书的介绍吧!