新手问题 返回值问题

drine · 2014年12月29日 · 最后由 yct21 回复于 2014年12月30日 · 1614 次阅读

rolls = dice.inject(Hash.new(0)) { |result, element| result[element] += 1; result; }

这里如果在 后面的 result 前加个 return,最后这段代码所在的函数返回的是一对哈希值,如果只是用 result,就返回的是个数字。 我可以理解为

  • 如果只用 result,返回的值就送到了所在代码块的所有者(dice)那里。
  • 如果用 return result,那就是把值返回给所在函数。 **

这样理解正确吗?下面是全部的代码。

def score(dice)
  return 0 if dice == []
  sum = 0
  rolls = dice.inject(Hash.new(0)) { |result, element| result[element] += 1; result;}
  rolls.each { |key, value| 


    # special condition for rolls of 1
    if key == 1  
      sum += 1000 | value -= 3 if value >= 3
      sum += 100*value
      next
    end
    sum += 100*key | value -= 3 if value >= 3
    sum += 50*value if key == 5 && value > 0
  }
  return sum
end


测试数据可以用 score(2,2,2) 数字在 1-6 之间。

在 ruby 中,block 基本可以看做是一个非 object 版本的 proc. 和 lambda 的不同点在于,proc 中的 return 是直接退出定义 proc 的 scope.

def double(&proc)
  yield * 2
end

def test
  double do
    return 1 # 直接退出 test 函数
  end 
end

test # => 1

如果希望一个 callable object 在 return 时只退出自身的 scope, 可以使用 lambda.

def double(p)
  p.call * 2
end

def test
  double lambda {return 1} 
end

test # => 2
需要 登录 后方可回复, 如果你还没有账号请 注册新账号