Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 为什么可以';我不能传递一个要注入的块变量吗?_Ruby - Fatal编程技术网

Ruby 为什么可以';我不能传递一个要注入的块变量吗?

Ruby 为什么可以';我不能传递一个要注入的块变量吗?,ruby,Ruby,鉴于 为什么我不能打这个电话 def wrapper &block (1..5).inject yield end proc = Proc.new {|sum, n| sum + n } 当查看内部时,我看到inject无法分配memo或obj,因为将proc重写为proc=proc.new{{memo,obj | put memo;put obj}将返回10次零迭代。我还注意到,(1..5).inject只接受一个参数,它作为初始备忘传入,从技术上讲,它不会将块

鉴于

为什么我不能打这个电话

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

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

方法是

  wrapper &proc
  => NoMethodError: undefined method `+' for nil:NilClass
但在你的问题中,你有趣地尝试使用
yield
。使用
yield
时,无需明确提及
&block
参数–方法无法拒绝块,该块始终可由方法内部的
yield
调用。但是,
yield
需要参数。使用
yield
实现目标的方法是:

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

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

wrapper &p
#=> 15
这个公式仍然有点笨拙。事实证明,即使不指定
&block
参数,也有一种秘密方法可以在方法内部获得块,即在方法内部使用未经修饰的
Proc.new

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

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

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

可能是重复的,你测试过吗?当我按照您在问题中指定的方式调用
wrapper&proc
来尝试您的
wrapper
时,它给了我一个错误。因此,我还将调用更改为仅为wrapper-proc,这很好。我遇到的下一个同样难倒我的步骤是:
summer=Proc.new{sum,n{sum+n}
rap=Proc.new{| Proc |(1..5)。注入0,Proc}
<代码>咖喱=rap.curry<代码>咖喱[夏季]导致:
TypeError:#不是符号
:别再犯愚蠢的错误了!我需要这个:
rap=Proc.new{Proc}(1..5)。注入0,&Proc}
现在,瞧,它工作了。这就是我结束的地方,鲍里斯:嗯,当定义一个Proc时,你可以说
Proc{a,b{a+b}
,而不是
Proc.new{a,b}
def wrapper proc
  (1..5).inject 0, proc
end