在Ruby中,链上的最后一个方法如何访问初始对象

时间:2011-09-22 18:16:38

标签: ruby reference method-chaining

- 编辑,解决 -

结束创建方法Object#rec以完成我需要的工作,结果就是:

#$l stores the last object on which Object#rec was called
$l=nil;class Object;def rec;$l=self;end;end

class String
    attr_accessor :ref
    alias_method :old_reverse, :reverse
    def reverse
        self.rec.old_reverse
    end
    def my_method
        $l.ref + ' ' + self
    end
end

a = "Hello"
b = "dlroW" ; b.ref = a

p b.reverse.my_method #=> Hello World

如果有人有更好的方法,问题仍然存在。

- 编辑,解决 -


问题:

我遇到类似的情况:

obj.method1.method2

其中method1返回obj以外的内容,我需要method2再次访问obj,因为它拥有我需要的引用。


例如:

class String
    attr_accessor :ref
    def my_method(b)
        b.ref + ' ' + self
    end
end

a = "Hello"
b = "dlroW" ; b.ref = a

#I want my_method to access 'b.ref' without having to pass 'b'
p b.reverse.my_method(b) #=> Hello World

替代:

我知道如果我使用b并且obj.my_method同时进行了反转(例如)和访问引用,或者像{{{{}所评论,我可以避免再次传递my_method 1}} the Tin Man更改method1但返回原始obj,但我想要的是知道是否可以完成上述操作。

提前致谢。

1 个答案:

答案 0 :(得分:1)

听起来有点像你在寻找Object.tap

  

向块生成x,然后返回x。此方法的主要目的是“利用”方法链,以便对链中的中间结果执行操作。

对于您的示例,您可以在reverse!内使用String tap来操纵对象。对于您的应用程序,在tap内根据需要操作对象,然后该对象将传递给您的以下方法。