加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 02:57:22 所属栏目:百科 来源:网络整理
导读:这可能很简单,但我不明白为什么这个语句不是有效的 Ruby代码: 3.5 || 3.2 SyntaxError: unexpected tINTEGER,expecting end-of-input 为什么这个是: 3.5 || 3. #this seems nonsensical= false 为什么在我的书中这个似乎给出了一个误导性的答案 3.5 || 3.(
这可能很简单,但我不明白为什么这个语句不是有效的 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-input
3>5 || 3 >
          ^

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读