为什么我不能通过块变量注入?

时间:2014-07-11 01:58:52

标签: ruby

鉴于,

  def wrapper &block
    (1..5).inject yield
  end

  proc = Proc.new {|sum, n| sum + n }

为什么我不能打这个电话?

  wrapper &proc
  => NoMethodError: undefined method `+' for nil:NilClass

当查看内部时,我看到inject无法分配备忘录或obj,因为将proc重写为proc = Proc.new {|memo, obj| puts memo ; puts obj }会返回10次迭代。我还注意到(1..5).inject只接受一个参数,它作为初始备忘录传递的内容,从技术上讲,它不是块作为真正的参数。

2 个答案:

答案 0 :(得分:8)

这样做的方法是

def wrapper &block
  ( 1..5 ).reduce &block
end

p = proc { |a, b| a + b }

wrapper &p
#=> 15

但是在你的问题中,你有趣地试图使用yield。当您使用yield时,您不需要明确提及&block参数 - 方法无法拒绝一个块,该块始终可以由方法内的yield调用。但是,yield需要参数。使用yield实现目标的方法是:

def wrapper_2
  ( 1..5 ).reduce { |accumulator, input| yield accumulator, input }
end

这个表述仍然有点尴尬。事实证明,即使你没有指定&block参数,也有一种在方法中获取块的秘密方法,那就是在方法中使用简单的Proc.new

def wrapper_3
  ( 1..5 ).reduce &Proc.new
end

答案 1 :(得分:0)

感谢您指出相关问题!我的谷歌搜索和网站搜索机制之前没有指出我。它帮助我看到我之前发出了一个愚蠢的语法错误(我尝试了(1..5).inject([]) proc的调用),这让我误解了我所看到的内容。所以我需要的是事实上:

def wrapper proc
  (1..5).inject 0, proc
end
相关问题