我希望在Object
上定义一个方法,该方法接受一个块并将接收器应用于块。实现将如下所示:
class Object
def apply ≺ pr.call(self) end
end
2.apply{|x| x * 3} # => 6
是否已经有一种标准的方法来执行此操作或具有类似用途的方法的知名库?如果是这样,我不想重新发明轮子。
经常发生这种情况,我有一个带有可选块的方法,当没有块时,我想返回在方法中计算的一些return_value
,但是当有一个块时,我想返回应用于块的return_value
的返回值。现在,我有一些像以下几行:
def method ..., &pr
...
pr ? pr.call(return_value) : return_value
end
但我想一直写
def method ..., &pr
...
pr ? return_value.apply(&pr) : return_value
end
甚至更好,略微修改了apply
,
def method ..., &pr
...
return_value.apply(&pr)
end
答案 0 :(得分:3)
我猜Object.tap
就是你要找的东西:
"Abc".tap do |str|
puts str
end
答案 1 :(得分:1)
这与
def apply; yield self; end
不一样吗? - steenslag@steenslag是的。它是。我希望以
self
作为接收者来实现这一效果。 - sawa
这是你的意思吗?
2.instance_eval { * 3 }
# => 6
不幸的是,这不起作用。 instance_eval
只是运行代码,就像接收方是self
一样。运算符不会将self
设为接收者,因此您实际上必须写这个:
2.instance_eval { self * 3 }
# => 6
然而,作为概念证明,这是可能的:
Numeric.send(:define_method, :plus) { |x| self + x }
2.instance_eval { plus 3 }
# => 5
答案 2 :(得分:0)
(Aftwer阅读OP编辑)AFAIK写这个规范的方法是:
def purpose(*args) #no &bl or &pr
res = 42 #huge calculation
return res unless block_given?
yield res
end
p purpose(1,2)
purpose{|n| puts "from the block: #{n}"}