【发布时间】: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 中不调用。
我该怎么做呢?是否有一些我可以重写的隐式方法,或者我可以利用 Object 或 BasicObject 类中的一些功能?
注意:在情况 1 和 2 中,返回实际对象,但在情况 3 和 4 中,不返回对象。有关我具体了解的信息,请参阅 cmets。
【问题讨论】:
-
您要解决的真正问题是什么?
-
@muistooshort
clean_up是一种资源密集型方法。如果只需要调用 obj[x](单个元素),我可以简单地清理该单个元素,然后将其返回给用户(通过覆盖 [] 运算符)。但是,如果需要完整的数组,我需要确保该数组的每个元素在返回之前都已“清理”。而且我只想在请求对象(完整数组)时这样做(即上面的案例 1 和 2) -
你的问题不清楚。您是否假设
obj.some_method和f = obj[0]的返回值不是obj?如果是这样,你必须写那个。 -
@sawa 没错,更新了问题。
-
#1 和 #2 在“请求”元素方面不做任何事情。在案例 #1 中,
a现在指向obj,但它没有复制它。在案例 #2 中,您根本没有做任何事情。我相信要完成你想要的,你需要覆盖each,除了[]之外可能还有其他一些方法
标签: ruby