2

我正在 codewars.com 上提交 Ruby 谜题的解决方案,并试验我是如何锁定在测试环境中以应对挑战之一。

我可以重新定义用于测试我的解决方案的类,但它们是在我提交代码后由系统定义的。如果我冻结这些对象,系统将无法覆盖它们,但在尝试写入时会引发运行时错误。

我对 Ruby 还很陌生,所以我不确定哪些部分(除了虚假和真实性)是不可能覆盖的。我是否可以使用 Ruby 代码强制修改冻结对象以静默失败而不是终止程序,或者是否与赋值运算符或类似操作等不可触及的事物绑定在一起?

4

1 回答 1

0

这里真正的答案是,如果您以后可能想修改一个对象,您不应该冻结它。这是“冻结”物体的整个概念所固有的。但是既然你问了,请注意你可以测试一个对象是否被冻结:

 obj.frozen?

因此,如果那些讨厌RuntimeError的 s 让您失望,一种解决方案是使用如下保护子句:

 obj.do_something! if !obj.frozen?

如果你想让保护子句隐式,你可以使用猴子补丁重新定义“问题”方法:

 class Array
   # there are a couple other ways to do this
   # read up on Ruby metaprogramming if you want to know
   alias :__pop__ :pop
   def pop
     frozen? ? nil : __pop__
   end
 end

如果您希望您的代码与任何和所有 Ruby 库/gem 无缝协作,那么像这样向内置方法添加行为可能不是一个好主意。在这种情况下,我怀疑它会导致任何问题,但无论何时你选择开始 hack Ruby 的核心类,你都必须为可能的后果做好准备。

于 2013-10-19T12:23:49.003 回答