【发布时间】:2013-08-21 05:28:36
【问题描述】:
我有一个名为Some 的类。 Some 的每个方法都返回一个字符串。
但我想要所有方法return self。只需要在最后加上return self就可以了,但是有没有更简单更聪明的方法呢?
我不能篡改原来的类,所以请考虑一下。
我不知道该尝试什么。请帮忙。
【问题讨论】:
-
我对引发这个问题的环境非常好奇......
我有一个名为Some 的类。 Some 的每个方法都返回一个字符串。
但我想要所有方法return self。只需要在最后加上return self就可以了,但是有没有更简单更聪明的方法呢?
我不能篡改原来的类,所以请考虑一下。
我不知道该尝试什么。请帮忙。
【问题讨论】:
我认为您只能将self 添加为每个方法的最后一条语句。不用写return self,只写self就够了。
更新
根据您上次的编辑,如果您不想再次开课,我认为您可以使用Method#receiver。
class Demo
def foo
# code
end
end
bar = Demo.new # => #<Demo:0x115c7d0>
bar.method(:foo).receiver # => #<Demo:0x115c7d0>
【讨论】:
我相信return self 是最简单的方法
【讨论】:
如果你不想能够链接方法而不是在调用之间调用接收器你可以尝试用这样的东西包装你的对象:
class Foo
def foo1_method
puts 'foo1_method'
end
def foo2_method
puts 'foo2_method'
end
end
class Chainable
attr_reader :receiver
def initialize(obj)
@receiver = obj
end
def method_missing(method, *args, &blk)
if @receiver.respond_to?(method)
@receiver.send(method, *args, &blk)
self
else
super
end
end
def respond_to?(method)
if @receiver.respond_to? method
true
else
super
end
end
end
obj = Foo.new
chainable = Chainable.new obj
chainable.foo1_method.foo2_method
如果你想取回原始对象你可以这样得到它
chainable.receiver
【讨论】: