Project1

标题: yield封裝問題 [打印本页]

作者: chd114    时间: 2018-1-4 18:38
标题: yield封裝問題
本帖最后由 chd114 于 2018-1-4 18:41 编辑

@RaidenInfinity

RUBY 代码复制
  1. def sum(base = 0)
  2.     (block_given? ? inject(base) { |a, e| a + yield(e) } : inject(base, :+))
  3. end

這部分是求和的腳本
我做了一個求平均的腳本
RUBY 代码复制
  1. def avg(base = 0)
  2.     if block_given?
  3.       marry=lambda {yield}
  4.       sum(base,&marry)/size
  5.     else
  6.       0
  7.     end
  8.     #block_given? ? sum(base)yield : sum(base)
  9.     #(self.sum base yield)/size
  10.     #n=base;collect{|s|n+=yield(s)};n/size
  11.     #(block_given? ? inject(base) { |a, e| a + yield(e) } : inject(base, :+))/size
  12.   end

但是&marry似乎封裝了沒有實際效果?
出現了ArgumentError wrong number of arguments(1 for 0)的錯誤
作者: 喵呜喵5    时间: 2018-1-4 22:46
marry 接收 0个参数,sum yield 它时传递了1个参数
作者: chd114    时间: 2018-1-4 22:52
喵呜喵5 发表于 2018-1-4 22:46
marry 接收 0个参数,sum yield 它时传递了1个参数

那我這裡是不能用
  1. lambda {yield}
复制代码
嗎?還是要把block_given?改成其他條件?
作者: 喵呜喵5    时间: 2018-1-4 23:01
如果你坚持要用这种形式的话
lambda{|e| yield(e)}

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


作者: chd114    时间: 2018-1-4 23:14
喵呜喵5 发表于 2018-1-4 23:01
如果你坚持要用这种形式的话
lambda{|e| yield(e)}

第一個可行

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

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




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1