为什么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是方法调用的参数,因此您得到正确的答案. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |