为什么Ruby中的这个布尔语句会出错?

为什么Ruby中的这个布尔语句会出错?,第1张

概述这可能很简单,但我不明白为什么这个语句不是有效的 Ruby代码: 3.>5 || 3.>2 SyntaxError: unexpected tINTEGER, expecting end-of-input 为什么这个是: 3.>5 || 3.> #this seems nonsensical=> false 为什么在我的书中这个似乎给出了一个误导性的答案 3.>5 || 3.>(2)=> f 这可能很简单,但我不明白为什么这个语句不是有效的 Ruby代码:

3.>5 || 3.>2 SyntaxError: unexpected tINTEGER,expecting end-of-input

为什么这个是:

3.>5 || 3.> #this seems nonsensical=> false

为什么在我的书中这个似乎给出了一个误导性的答案

3.>5 || 3.>(2)=> false

然而,这个给出了“正确”的答案

3.>(5) || 3.>(2)=> true
解决方法 这里的混乱是由于使用.使Ruby将比较解析为方法调用,而不是更普通的二元运算符,例如3>. 2.在Ruby运算符中,例如>最终是 handled as methods,但解析器有特殊情况允许您使用更熟悉的语法.

如果你想象有一个名为gt on integers的方法,你用它来重写你的例子而不是>它可能更清楚它发生了什么.

你的第一个例子,3> 5 || 3.> 2,相当于:

3.gt 5 || 3.gt 2

Ruby试图解析为

3.gt (5 || 3.gt) 2

最后两个是Ruby抱怨的意外tINTEGER.

第二个例子,3> 5 || 3.>将被解析为这样的东西:

3.gt (5 || 3.gt)

这似乎是荒谬的,因为我们知道gt实际上是二元运算符>它应该有第二个运算符.由于Ruby正在解析它,好像它是一个方法,它无法知道应该有多少个参数.至于解析器知道gt方法可能不期望任何参数(我们可以修补猴子>不期望参数).自评价表达式为5 || 3.>短路到5,3.部分永远不会执行,所以不会发生错误.

如果您编写相同的表达式但不使用.,Ruby解析器知道这是一个二元运算符,并期望第二个运算符:

eval '3>5 || 3 >'SyntaxError: (eval):1: Syntax error,unexpected end-of-input3>5 || 3 >          ^

最后一个例子,3.>(5)|| 3.>(2),将被解析为:

3.gt(5) || 3.gt(2)

由于括号没有歧义,很明显2是方法调用的参数,因此您得到正确的答案.

总结

以上是内存溢出为你收集整理的为什么Ruby中的这个布尔语句会出错?全部内容,希望文章能够帮你解决为什么Ruby中的这个布尔语句会出错?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1287717.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存