ruby – 为什么我不能传递一个块变量来注入?
发布时间:2020-12-17 03:41:18 所属栏目:百科 来源:网络整理
导读:鉴于, def wrapper block (1..5).inject yield end proc = Proc.new {|sum,n| sum + n } 为什么我不能打这个电话? wrapper proc = NoMethodError: undefined method `+' for nil:NilClass 在查看内部时,我发现注入无法分配备忘录或obj,因为将proc重写为proc
鉴于,
def wrapper &block (1..5).inject yield end proc = Proc.new {|sum,n| sum + n } 为什么我不能打这个电话? wrapper &proc => NoMethodError: undefined method `+' for nil:NilClass 在查看内部时,我发现注入无法分配备忘录或obj,因为将proc重写为proc = Proc.new {| memo,obj |提出备忘录; puts obj}返回10次迭代.我还注意到(1..5).inject只接受一个参数,它作为初始备忘录传递的内容,从技术上讲,它不是块作为真正的参数. 解决方法
做到这一点的方法是
def wrapper &block ( 1..5 ).reduce &block end p = proc { |a,b| a + b } wrapper &p #=> 15 但在你的问题中,你有趣地尝试使用yield.当你使用yield时,你不需要明确提到& block参数 – 一个方法不能拒绝一个块,它总是可以通过方法内的yield来调用.但是,收益率需要争论.使用yield来实现目标的方法是: def wrapper_2 ( 1..5 ).reduce { |accumulator,input| yield accumulator,input } end 这个表述仍然有点尴尬.事实证明,即使你没有指定& block参数,也有一种在方法中获取块的秘密方法,那就是在方法中使用unadorned Proc.new: def wrapper_3 ( 1..5 ).reduce &Proc.new end (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |