加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读