这个 Ruby 错别字解析是什么?

What is this Ruby typo parsing as?

提问人:Silvio Mayolo 提问时间:10/27/2023 更新时间:10/27/2023 访问量:38

问:

Ruby 有一个简洁的安全导航操作员。如果我写 ,那么它返回 ,除非碰巧是 ,在这种情况下,它只是短路并返回 。foo&.barfoo.barfoonilnil

现在,作为一个匆忙的程序员,我不小心输入了点和与号。我本来以为会出现解析错误,但我实际上得到了foo.&bar

3.1.0 :002 > foo.&bar
(irb):2:in `<main>': undefined local variable or method `bar' for main:Object (NameError)

事实上,如果我定义一个名为 的局部变量,它似乎很好。bar

3.1.0 :003 > bar = 42
 => 42 
3.1.0 :004 > foo.&bar
 => 42 

在这种情况下,解析是什么?.&

Ruby 解析

评论

0赞 pjs 10/27/2023
那么什么是?当 42 时,您给出的结果为 42。但是,如果我使用 ,例如,则产生 32。正如目前所写的那样,您的问题不可重现。foofoo.&barbarfoo = 33foo.&bar
1赞 Alexander 11/1/2023
为了将来参考,您可以尝试解析 Ruby AST 并查看结果。.在本例中,您可以看到它是一个作为选择器的节点。pp RubyVM::AbstractSyntaxTree.parse("foo.&bar")CALL:&

答:

3赞 Silvio Mayolo 10/27/2023 #1

Ruby 中缀运算符可以用显式点调用,因此以下两个是等效的。

a + b
a.+(b)

单 & 运算符也是如此,通常定义为执行“按位和”运算。Ruby 允许我们在参数列表中省略括号,除非运算符顺序需要它们。所以是真的,或者不那么模棱两可,这等价于对 的显式调用,无论类型是什么。foo.&barfoo.& barfoo.&(bar)foo & bardef &foo