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