1

- 编辑,已解决 -

最终创建了一个方法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

wheremethod1返回的东西不是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_methodmy_method做了反转(例如)和访问参考,或者像评论一样the Tin Manmethod1更改obj但返回原始obj,但我想知道它是否可能完成上述。

提前致谢。

4

1 回答 1

1

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

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

对于您的示例,您可能可以在 中使用字符串reverse!tap操作对象。对于您的应用程序,在内部随心所欲地操作对象tap,然后该对象将传递给您的以下方法。

于 2011-09-22T18:36:01.267 回答