【问题标题】:Implicit Return in Ruby Returns Errors When Returning Two ValuesRuby 中的隐式返回在返回两个值时会返回错误
【发布时间】:2016-09-24 17:37:46
【问题描述】:

考虑以下两个代码示例:

1

    # Implicit Return
    def yo
      'swag', 'yolo'
    end

    whaat, ya = yo

    puts ya
    puts whaat

2

    # Explicit Return
    def yo
      return 'swag', 'yolo'
    end

    whaat, ya = yo

    puts ya
    puts whaat

第一个示例返回此错误:syntax error, unexpected ',', expecting keyword_end,第二个示例的工作原理就像一个冠军。

所以,这让我很好奇,因为我知道 Ruby 中有很多快捷方式(成语)(例如 2 + 2 实际上是 2.+(2) ),如果某些东西不能正常工作,请务必在语法中更清楚并使用成语出去。

因此,我的问题是 Ruby 如何在幕后处理 returns 对我来说这不应该引发错误?

【问题讨论】:

  • 'swag', 'yolo' 不是有效代码并引发异常。在#2 'swag', 'yolo' 是参数。
  • 好吧,不过这不是我的问题。我的问题是 Ruby 如何在幕后处理返回,这不应该引发错误?我知道示例 1 无效。我想知道幕后发生了什么,因为隐式返回在 Ruby 中有效,并且此代码仅在我显式返回值时才有效。
  • 我认为示例 1 也不被视为返回。
  • @cameck:隐式返回仅仅意味着返回最后一个表达式。但是您的代码在语法上无效,a, b 根本不是有效的表达式。

标签: ruby return


【解决方案1】:

方法(以及块、类定义和模块定义)隐式返回最后评估的表达式。 a, b 根本不是一个有效的表达式,甚至在语法上也不是有效的。 return a, b 一个有效的表达式:您将两个参数传递给 return 关键字。传递多个参数并省略括号是完全合法的。

出于类似的原因,foo(a, b) 有效,但foo (a, b) 无效:前者将两个参数传递给foo,后者将一个参数(a, b) 传递给foo,这在语法上是无效的.

【讨论】:

  • 完美,有道理!谢谢你:)
  • 是否可以将 Ruby 设计为将方法最后一行中的 a,b 视为 [a,b],还是会导致问题?
  • 我认为解释器会逐行读取命令。所以它只是尝试解析a,b 并失败。当时不知道是不是在最后一行。
  • @Aleksey,我希望这是真的,但很容易检查它是否是最后一行。当然,它会很乱,而且真的不会添加功能。
【解决方案2】:

我觉得可能是

def yo
  ['swag', 'yolo']
end

它应该可以工作,但它不能回答你的问题

【讨论】:

  • 因为您的“但是...”,我很想投票。很多时候都缺少这些。
  • 谢谢卡里 =)。我的想法和 Jörg 的回答一样,但我不确定。这就是我发布解决方法答案的原因。
  • 我刚好看到你的评论。不要忘记您需要“@Cary”来通知我有评论留给我。
猜你喜欢
  • 2010-11-07
  • 2014-08-11
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
  • 2011-12-04
  • 2017-07-31
相关资源
最近更新 更多