冒險村11 - frozen_string_literal
11 - frozen_string_literal
延續 Begin from linter : rubocop 中最後 Auto-fix 提到 frozen_string_literal
的設定,這魔法般的註解到底代表什麼意思呢?
先從 Ruby 中常數(constant)變更來理解可以很容易看出 MY_CONSTANT
constant 是可以被變更的,不過我們常常在專案中或許想要寫死某個 default 值,會想要建立的是 immutable
,可以透過 ruby 提供的 freeze
方法來處理。
1 |
|
Creating immutable constants
1 |
|
testing performance with benchmark/ips
透過 benchmark-ips 來測試一定時間內可以執行最多的次數,從結果顯示可以看出約提升 50% 的速度。
1 |
|
Value objects & functional programming
也可以在 init 內使用 freeze 方法,保證 constructor 內 object 不會被改變
1 |
|
Built-in optimizations in Ruby >= 2.2
在 >= 2.2 以後的 Ruby 版本中針對 hash 使用的字串已經有做自動 freeze,不過如果版本在這之前就可能會常常看到下面的這種情況:
1 |
|
註: Immutable String literal in Ruby 3 原本 Ruby 3.0 中自動 freeze 所有字串目前也沒有後續。
最後,再回來一開始設定 frozen_string_literal
原因,到底是什麼魔法呢?
Magic Comments!
版本 >= 2.3 後的功能,這行註解起來的魔法,可以自動將該檔案內的 String 通通做 #freeze 的方法
1 |
|