https://www.ruby-lang.org/en/news/2019/12/25/ruby-2-7-0-released/
Module#name, true.to_s, false.to_s, and nil.to_s now always return a frozen String.
使用的一个 Gem 里面莫名其妙地抛出一个 FrozenError
FrozenError in XxxxxController#action
can't modify frozen String: ""
本地调试了好久才找到关键行:
foo = bar.to_s
foo.gsub!(/正则/,"")
当 bar
为 true
, false
或 nil
的时候,foo
就自动 frozen
了,再 gsub!
的时候就报 FrozenError
加个判断就可以 fix 了:
foo.gsub!(/正则/,"") unless foo.frozen?
也可以 duplicate
一下,但这应该会多创建一个 object,浪费资源,降低执行速度
foo = bar.to_s.dup
比较奇怪的是,这个 Gem 在 Linux 服务器上的 Ruby 2.7.0 并不报错,只在本地 macOS 10.14 上报错。