【问题标题】:Is there a method for in place modification on Object in ruby?有没有一种方法可以在 ruby​​ 中对 Object 进行就地修改?
【发布时间】:2018-10-08 19:18:24
【问题描述】:

我找不到允许使用返回值的任意方法对象实现就地修改对象的方法。

我希望做的是

class MyClass
  def return_modified_my_class_instance
    ...
  end
end

object = MyClass.new
object.in_place!(&:return_modified_my_class_instance)

但我对自己实现这一点不感兴趣。我只想在 ruby​​ 中的 Object 上存在 in_place! 等效项时这样做

【问题讨论】:

  • 你能澄清一下吗? object.in_place!(&:return_modified_my_class_instance) 到底应该做什么?这应该用object.return_modified_my_class_instance 替换object 吗?你在寻找类似Object#tap 的东西吗?也许一个具体的例子会有所帮助。
  • 感谢您的提问!我很高兴尝试澄清。有一些实例方法返回同一类的新实例(例如 ActiveRecord 范围方法)我想调用该方法,例如在发送中,但是我希望该方法修改正在调用该方法的对象
  • 我可以做同样的事情:whatever = whatever.modified_instance_of_same_class
  • 但如果它确保保留当前的祖先就更好了
  • Object#tap,如果有 tap! 变体将当前实例修改为 tap 中最后一条语句的任何返回值

标签: ruby


【解决方案1】:

这是不可能的。修改任何对象的方法只能知道如何操作所有对象共有的状态,那是没有的。

一个可以用新对象替换 Ruby 中任何对象的方法是不可能的,因为对象引用不能在 Ruby 中更改它们的类。

听起来您是一名 Smalltalk 程序员,并且您正在寻找与 become: 等效的程序?这在 Ruby 中是不可能的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    • 2013-03-08
    • 1970-01-01
    相关资源
    最近更新 更多