一种将self应用于proc的方法

时间:2012-03-06 20:13:25

标签: ruby ruby-1.9.3 proc-object

我希望在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

3 个答案:

答案 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}"}