在Ruby中,有Object#freeze个选项,可以防止进一步修改对象:

class Kingdom
  attr_accessor :weather_conditions
end

arendelle = Kingdom.new
arendelle.frozen? # => false
arendelle.weather_conditions = 'in deep, deep, deep, deep snow'
arendelle.freeze
arendelle.frozen? # => true
arendelle.weather_conditions = 'sun is shining'
  # !> RuntimeError: can't modify frozen Kingdom

script = 'Do you want to build a snowman?'.freeze
script[/snowman/] = 'castle of ice'
  # !> RuntimeError: can't modify frozen String

然而,没有Object#unfreeze个.有没有办法解冻一个冰冻的王国?

推荐答案

不,根据documentation for Object#freeze:

没有办法解冻冻结的物体.

冻结状态存储在对象中.调用freeze设置冻结状态,从而防止进一步修改.这包括修改对象的冻结状态.

关于您的示例,您可以指定一个新字符串:

script = 'Do you want to build a snowman?'
script.freeze

script = script.dup if script.frozen?
script[/snowman/] = 'castle of ice'
script #=> "Do you want to build a castle of ice?"

Ruby 2.3引入了String#+@,因此可以编写+str而不是str.dup if str.frozen?

Ruby相关问答推荐

为什么 rdoc 注释似乎以两个井号/井号符号开头?

如何返回此 OOP Ruby 代码最后一行中的变量?

在 Ruby 中使用委托维护相同的类

如何使用 define_method 指定方法默认参数?

你如何称呼 Ruby 中的 &: 运算符?

C# 中的 typeof 保留字是否有 Ruby 类似功能?

构造Ruby的现代方法是什么?

ruby:对两个或多个数组的对应成员求和

出于调试目的,如何打印有关 NET:HTTPRequest 的信息?

创建一个哈希值作为数组和默认值作为空数组

Rails 控制台中没有数据库连接

在文件中搜索字符串的最佳方法是什么?

从 Ruby 程序中创建 beep声的最简单方法是什么?

Vim 用 ruby​​ 语法高亮显示很慢

如何在控制台中禁用 MongoDB 日志(log)消息?

无法正确自动生成 Ruby DevKit 配置文件

Ruby 中方法名称的限制是什么?

如何理解 strptime 与 strftime

Lisp 和 Erlang 原子、Ruby 和 Scheme 符号.它们有多大用处?

如何判断数组是否有重复项?