- 编辑,解决 -
结束创建方法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
,但我想要的是知道是否可以完成上述操作。
提前致谢。
答案 0 :(得分:1)
听起来有点像你在寻找Object.tap
:
向块生成x,然后返回x。此方法的主要目的是“利用”方法链,以便对链中的中间结果执行操作。
对于您的示例,您可以在reverse!
内使用String tap
来操纵对象。对于您的应用程序,在tap
内根据需要操作对象,然后该对象将传递给您的以下方法。