【问题标题】:Why is this value not being implicitly returned in Ruby?为什么这个值没有在 Ruby 中隐式返回?
【发布时间】:2019-08-27 01:47:47
【问题描述】:

我认为在使用 Ruby 时,表达式的最后一行会隐式返回,而不必使用“return”关键字。但是,在下面的代码中,只有使用 return 关键字时才会返回正确的值。

def find_the_cheese(ings)
  cheese_types = ["cheddar", "gouda", "camembert"]
  i = 0
  while i < ings.length do
    if cheese_types.include?(ings[i])
      ings[i]  #=> only works if 'return' keyword is in front of it
    end
    i += 1
  end
  nil
end

find_the_cheese(["water", "gouda", "crackers"])

第 5 行的 if 语句应该计算为真,因此它应该返回 ings[i] 的值,即“gouda”。但是,如果我不在值前面写“return”,那么整个事情的计算结果为 nil。但如果我写“return”,那么它给出了正确的答案。 在其他时候使用 ruby​​ 时,我忽略了 return 关键字,它返回了我期望的值,那么为什么有时它会起作用而有时却不起作用呢?

【问题讨论】:

  • “我认为在使用 Ruby 时,表达式的 最后一行 会被隐式返回” – 提示 #1:方法的最后一行是什么? “第 5 行 上的 if 语句”——提示 #2:第 5 行是最后一行吗?
  • 在 Ruby 中,您很少需要使用索引、显式计数器变量和低级循环来遍历数组。鉴于 Ruby 丰富的 Enumerable 模块,几乎总有一种更简洁的方式。例如,您的上面的代码可以重写为:ings.find { |ing| cheese_types.include?(ing) }——它可以在没有明确的return 的情况下工作。

标签: ruby return implicit


【解决方案1】:

在你的函数中,nil 作为最后一行,所以除非你使用 return 在此之前离开函数,否则你将始终以 nil 结束,因此始终返回 nil,因为 Ruby正如您自己所说,隐式返回最后评估的表达式。

简而言之,你必须使用return,因为第5行不是函数的最后一行,如果没有它,它将一直运行到nil。因此将返回它。

【讨论】:

  • “最后一行” 可能会产生误导。最好想想“最后一个计算的表达式”
猜你喜欢
  • 2021-01-11
  • 1970-01-01
  • 2019-03-15
  • 2013-03-25
  • 2012-12-17
  • 2021-12-09
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多