【问题标题】:What possible ambiguity causes this Ruby code to throw a SyntaxError?什么可能的歧义导致此 Ruby 代码抛出 SyntaxError?
【发布时间】:2014-08-13 20:21:16
【问题描述】:

这个版本的方法定义成功

def foo(bar)
  baz >= baz(bar)
end

而这个版本的方法有语法错误:

def foo(bar)
  baz >= baz bar
end

# syntax error, unexpected tIDENTIFIER, expecting keyword_do or '{' or '('

Ruby 认为我的意思是baz(>= baz bar)(它不应该工作,因为你不能用二元运算符开始表达式?)还是(baz >= baz) bar? (这没有任何意义)?

我会很感激某种解释,甚至更好的是指向 Ruby 文档的指针,它解释了为什么这个表达式如此难以解析。

【问题讨论】:

  • Ruby 认为您的意思是 (baz >= baz) bar,这完全有道理,因为那是您写的。初始实现作用于baz(bar) 的返回结果。虽然ruby 和其他语言允许您在某些情况下放弃括号,但Boolean 操作不是其中之一。
  • 谢谢@sawa,你很好地消除了我一时冲动的语气。但我仍然认为irb 提示中有一些价值,以免有人认为我编造了这个故事:)
  • @engineersmnky 我同意你的解释,如果我用我常用的语言编程,我会支持你的。令我惊讶的是 Ruby 允许您省略它们,我认为这是因为他们已经开发了一些解决歧义的方法,这种歧义通常通过在语言中强制使用方法括号来解决。我的假设得到了支持(我认为)文档ruby-doc.org/core-2.1.2/doc/syntax/precedence_rdoc.html 甚至没有在运算符优先级列表中列出方法括号。
  • 无论如何,看来我需要开发某种编码风格以避免将来出现这些错误。谢谢大家。

标签: ruby syntax


【解决方案1】:

在不使用括号传递参数时,Ruby 似乎无法与函数调用进行比较。我已经对此进行了一些测试,它似乎很全面:

irb(main):031:0> 4 < rand 5

#=>SyntaxError: (irb):31: syntax error, unexpected tINTEGER, expecting keyword_do or '{' or '('

【讨论】:

    【解决方案2】:

    我想当你这个

    2.1.2 :013 > def foo(bar)
    2.1.2 :014?>   baz >= baz bar
    2.1.2 :015?> end
    

    ruby 解释器认为你正在尝试这样做

    2.1.2 :013 > def foo(bar)
    2.1.2 :014?>   baz(>= baz(bar))
    2.1.2 :015?> end
    

    我认为这就是发生语法错误的原因。对方法使用括号始终是一种好习惯。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多