查看: 2353|回复: 5

[已经解决] yield封裝問題

[复制链接]
梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

发表于 2018-1-4 18:38:35 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 chd114 于 2018-1-4 18:41 编辑

@RaidenInfinity

[pre lang="ruby"]def sum(base = 0)
    (block_given? ? inject(base) { |a, e| a + yield(e) } : inject(base, :+))
end[/pre]
這部分是求和的腳本
我做了一個求平均的腳本
[pre lang="ruby"]  def avg(base = 0)
    if block_given?
      marry=lambda {yield}
      sum(base,&marry)/size
    else
      0
    end
    #block_given? ? sum(base)yield : sum(base)
    #(self.sum base yield)/size
    #n=base;collect{|s|n+=yield(s)};n/size
    #(block_given? ? inject(base) { |a, e| a + yield(e) } : inject(base, :+))/size
  end[/pre]
但是&marry似乎封裝了沒有實際效果?
出現了ArgumentError wrong number of arguments(1 for 0)的錯誤
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png

梦石
1
星屑
23241
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2018-1-4 22:46:51 | 显示全部楼层
marry 接收 0个参数,sum yield 它时传递了1个参数
回复

使用道具 举报

梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

 楼主| 发表于 2018-1-4 22:52:49 | 显示全部楼层
喵呜喵5 发表于 2018-1-4 22:46
marry 接收 0个参数,sum yield 它时传递了1个参数

那我這裡是不能用
  1. lambda {yield}
复制代码
嗎?還是要把block_given?改成其他條件?
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复

使用道具 举报

梦石
1
星屑
23241
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2018-1-4 23:01:00 | 显示全部楼层
如果你坚持要用这种形式的话
lambda{|e| yield(e)}

不然(手机打字,未测试)
def avg(base = 0, &b)
    return 0 if size==0
    return sum(base,&b)/size
end

评分

参与人数 1赞 +1 收起 理由
chd114 + 1 认可答案

查看全部评分

回复

使用道具 举报

梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

 楼主| 发表于 2018-1-4 23:14:12 | 显示全部楼层
喵呜喵5 发表于 2018-1-4 23:01
如果你坚持要用这种形式的话
lambda{|e| yield(e)}

第一個可行

反復試了一下有點懂了,不過表達不出來···

那具體來說這樣是做了什麼呢?

点评

二楼不就说了吗,sum会传递1个参数给代码块,你却传了个只允许接收0个参数的lambda,于是就报了参数个数不一致(1 for 0)的错误  发表于 2018-1-5 09:30
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部