【问题标题】:Calling a method every time an object is referenced每次引用对象时调用方法
【发布时间】:2014-02-23 17:45:06
【问题描述】:

假设我有一个类如下

class MyClass < Array
  def clean_up
    #clean up array
  end
end

以下是它的一些使用示例:

obj = MyClass.new

#I call some methods on obj

a = obj           #1
obj               #2
obj.some_method   #3
f = obj[0]        #4

我有什么方法可以强制调用clean_up,仅当对象本身被返回时(即没有方法调用它)。

更具体地说,我希望在案例 1 和 2 中调用 clean_up,但在案例 3 和 4 中不调用。

我该怎么做呢?是否有一些我可以重写的隐式方法,或者我可以利用 ObjectBasicObject 类中的一些功能?

注意:在情况 1 和 2 中,返回实际对象,但在情况 3 和 4 中,不返回对象。有关我具体了解的信息,请参阅 cmets。

【问题讨论】:

  • 您要解决的真正问题是什么?
  • @muistooshort clean_up 是一种资源密集型方法。如果只需要调用 obj[x](单个元素),我可以简单地清理该单个元素,然后将其返回给用户(通过覆盖 [] 运算符)。但是,如果需要完整的数组,我需要确保该数组的每个元素在返回之前都已“清理”。而且我只想在请求对象(完整数组)时这样做(即上面的案例 1 和 2)
  • 你的问题不清楚。您是否假设obj.some_methodf = obj[0] 的返回值不是obj?如果是这样,你必须写那个。
  • @sawa 没错,更新了问题。
  • #1 和 #2 在“请求”元素方面不做任何事情。在案例 #1 中,a 现在指向 obj,但它没有复制它。在案例 #2 中,您根本没有做任何事情。我相信要完成你想要的,你需要覆盖each,除了[]之外可能还有其他一些方法

标签: ruby


【解决方案1】:

你可以定义一个访问对象的方法:

class MyClass < Array
  def clean_up
    puts 'cleaning up the array now'
  end

  def get
    clean_up
    self
  end
end

m = MyClass.new
m.get.class
# cleaning up the array now
# => MyClass

【讨论】:

  • 这是一个解决方案,但问题是我无法控制对象的使用。所以我不能让每个人都开始使用m.get 代替m
【解决方案2】:

我不认为你能做到这一点,因为调用 obja = obj 实际上并没有调用 obj (MyClass) 对象。同样,您将能够更改控制台中打印的内容(如果您正在使用它),但我想这不是您想要的。

以下是一些关于类似问题的有趣主题: Modifying the default return value of an object belonging to an extended class Ruby Class Return Value

【讨论】:

    猜你喜欢
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    相关资源
    最近更新 更多