Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Ruby中的布尔语句会给出错误?_Ruby_Syntax_Boolean Expression - Fatal编程技术网

为什么Ruby中的布尔语句会给出错误?

为什么Ruby中的布尔语句会给出错误?,ruby,syntax,boolean-expression,Ruby,Syntax,Boolean Expression,这可能很简单,但我不明白为什么这个语句不是有效的Ruby代码: 3.>5 || 3.>2 SyntaxError: unexpected tINTEGER, expecting end-of-input 为什么这个是: 3.>5 || 3.> #this seems nonsensical => false 为什么在我的书中,这个似乎给出了一个误导性的答案 3.>5 || 3.>(2) => false 然而,这一条给出了“正确”的答案 R

这可能很简单,但我不明白为什么这个语句不是有效的Ruby代码:

3.>5 || 3.>2 
SyntaxError: unexpected tINTEGER, expecting end-of-input
为什么这个是:

3.>5 || 3.> #this seems nonsensical
=> false
为什么在我的书中,这个似乎给出了一个误导性的答案

3.>5 || 3.>(2)
=> false
然而,这一条给出了“正确”的答案


Ruby对空间敏感,与本网站中使用的语法荧光笔不同,Ruby在解析运算符时使用“maximummunch”

3。pNext,code3.5||3.(2)/code解析为code3.>(5||3.>(2))
,因为Ruby神奇的消失括号。按照您的样式指南,在几乎所有二进制运算符周围添加空格。少数不应该使用的惯用用法是
&
.
***
,等等。

这里的混淆是由于使用
使Ruby将比较解析为方法调用,而不是使用更普通的二进制运算符,如
3>2
。在Ruby中,诸如
>
之类的操作符是最终的,但是解析器有一些特殊情况,允许您使用更熟悉的语法

如果你想象有一个叫做
gt
的方法处理整数,你用它而不是
重写你的例子,它可能会更清楚地说明发生了什么

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

3.gt 5 || 3.gt 2
哪个Ruby试图解析为

3.gt (5 || 3.gt) 2
最后的
2
是Ruby抱怨的
意外的tINTEGER

第二个示例,
3.>5 | | 3.>
将被解析为如下内容:

3.gt (5 || 3.gt)
这似乎毫无意义,因为我们知道
gt
实际上是二进制运算符
>
,它应该有第二个运算符。因为Ruby解析它就像它是一个方法一样,所以它无法知道应该有多少个参数。据解析器所知,
gt
方法可能不需要任何参数(我们可以让monkey-patched
不需要参数)。由于表达式
5 | | 3.>
的求值与
5
短路,因此
3.>
部分永远不会执行,因此不会发生错误

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

eval'3>5 | | 3>'
SyntaxError:(eval):1:语法错误,输入意外结束
3>5 || 3 >
^
最后一个示例,
3.>(5)| 3.>(2)
,将被解析为:

3.gt(5) || 3.gt(2)
由于括号中没有歧义,而且很明显,
2
是方法调用的一个参数,因此您得到了正确的答案

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