如何真正讓 Ruby Constants 常數無法被修改

栏目: Ruby · 发布时间: 7年前

内容简介:如何真正讓 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 丟出錯誤例外,不能修改!

這樣就搞定啦。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C语言进阶

C语言进阶

牟海军 / 机械工业出版社 / 2012-7 / 59.00元

C语言是编程语言中的一朵奇葩,虽已垂垂老矣,但却屹立不倒,诞生了数十年,仍然是最流行的编程语言之一。C语言看似简单,却不易吃透,想要运用好,更是需要积淀。本书是一本修炼C程序设计能力的进阶之作,它没有系统地去讲解C语言的语法和编程方法,而是只对C语言中不容易被初学者理解的重点、难点和疑点进行了细致而深入的解读,揭露了C语言中那些鲜为普通开发者所知的秘密,旨在让读者真正掌握C语言,从而编写出更高质量......一起来看看 《C语言进阶》 这本书的介绍吧!

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具