Ruby 方法调用如何与运算符优先级交互?

Ruby 方法调用如何与运算符优先级交互?,ruby,methods,operator-precedence,Ruby,Methods,Operator Precedence,我很好奇方法调用与运算符优先级的关系。在irb中,我看到: var = puts(5) 5 => nil var => nil 这意味着对puts的调用具有比赋值运算符更高的优先级,因为nil(puts(5)的返回值)被赋值给var,而不是方法调用本身。因为nil被赋值给var(正如我们在第4行看到的),我猜puts(5)是在赋值操作符之前被调用的 在Stackoverflow线程中,每个人都同意方法调用的优先级低于每个运算符 然而,该网站列出了这些问题。作为方法调用的运算符,并表

我很好奇方法调用与运算符优先级的关系。在irb中,我看到:

var = puts(5)
5
=> nil
var
=> nil

这意味着对puts的调用具有比赋值运算符更高的优先级,因为nil(puts(5)的返回值)被赋值给var,而不是方法调用本身。因为nil被赋值给var(正如我们在第4行看到的),我猜puts(5)是在赋值操作符之前被调用的

在Stackoverflow线程中,每个人都同意方法调用的优先级低于每个运算符

然而,该网站列出了这些问题。作为方法调用的运算符,并表示它是最高优先级的运算符

如果这第二个网站确实是准确的,我不确定是否有一个隐含的。当您调用main上的方法时,使用运算符(因此,关于作为高优先级运算符是否足以解释上面的irb会话)

一般来说,我对Ruby在遇到一行代码时的工作顺序很好奇,因此如果您知道任何资源以一种可访问的方式解释了这一点,我会感兴趣阅读它们

编辑:谢谢你的回答。也许我对我的基本问题不够清楚,这些问题是理论性的而不是实践性的(因此可以说是“过度思考”,这取决于你喜欢思考的程度):

  • 是。从技术上讲是运营商,还是从技术上讲不是运营商
  • 有一个新的方法吗。每次你调用一个方法的时候都在幕后的某个地方
  • 运算符是Ruby决定对一行代码求值顺序的基本方式,还是除了运算符及其优先级/关联性/算术性之外还有其他因素

谢谢你想得太多了。您的表达式基本上是这样的:
x=something
。所以,必须首先计算右侧,然后才能完成赋值

你想得太多了。您的表达式基本上是这样的:
x=something
。所以,必须首先计算右侧,然后才能完成赋值

我猜你来自JavaScript或类似的背景。在可能的情况下:

函数put(…args){args.forEach(arg=>console.log(arg));}
var x;
(x=看跌期权)(5);

看跌期权(x)我猜你来自JavaScript或类似背景。在可能的情况下:

函数put(…args){args.forEach(arg=>console.log(arg));}
var x;
(x=看跌期权)(5);

看跌期权(x)以下是如何打印AST

2.6.3 :008 > RubyVM::AbstractSyntaxTree.parse('x = puts(5)')
 => #<RubyVM::AbstractSyntaxTree::Node:SCOPE@1:0-1:11> 
2.6.3 :009 > pp _
(SCOPE@1:0-1:11
 tbl: [:x]
 args: nil
 body:
   (LASGN@1:0-1:11 :x
      (FCALL@1:4-1:11 :puts (ARRAY@1:9-1:10 (LIT@1:9-1:10 5) nil))))
 => #<RubyVM::AbstractSyntaxTree::Node:SCOPE@1:0-1:11> 
2.6.3:008>RubyVM::AbstractSyntaxTree.parse('x=put(5)'
=> # 
2.6.3:009>pp_
(SCOPE@1:0-1:11
tbl:[:x]
args:nil
正文:
(LASGN@1:0-1:11:x
(FCALL@1:4-1:11(ARRAY@1:9-1:10 (LIT@1:9-1:10(零)
=> # 

我正在使用ruby 2.6。这种方法可以解决任何解析疑问。因为这种情况并不明显,正如其他答案所说,如果你有
x=expr
,那么需要首先评估
expr
,因为我们谈论的是一种严格的语言,对于惰性语言,你只需要在评估
x
时评估
expr
,但这是另一个主题,这里是如何打印AST

2.6.3 :008 > RubyVM::AbstractSyntaxTree.parse('x = puts(5)')
 => #<RubyVM::AbstractSyntaxTree::Node:SCOPE@1:0-1:11> 
2.6.3 :009 > pp _
(SCOPE@1:0-1:11
 tbl: [:x]
 args: nil
 body:
   (LASGN@1:0-1:11 :x
      (FCALL@1:4-1:11 :puts (ARRAY@1:9-1:10 (LIT@1:9-1:10 5) nil))))
 => #<RubyVM::AbstractSyntaxTree::Node:SCOPE@1:0-1:11> 
2.6.3:008>RubyVM::AbstractSyntaxTree.parse('x=put(5)'
=> # 
2.6.3:009>pp_
(SCOPE@1:0-1:11
tbl:[:x]
args:nil
正文:
(LASGN@1:0-1:11:x
(FCALL@1:4-1:11(ARRAY@1:9-1:10 (LIT@1:9-1:10(零)
=> # 

我正在使用ruby 2.6。这种方法可以解决任何解析疑问。因为这种情况并不像其他答案所说的那样明显,如果你有
x=expr
,那么需要首先评估
expr
,因为我们谈论的是严格的语言,对于惰性语言,你只需要在评估
x
时评估
expr
,但这是另一个主题

“而不是方法调用本身”-不确定你如何想象方法调用的赋值(这不是该调用的结果)。你能想象如果RHS不是一个“更高优先级”而不是赋值,生活会是什么样子吗?这会使赋值毫无用处。”而不是方法调用本身”“我不太明白你在这里的意思。您可以指定一个方法引用,但“调用本身”是该调用的结果。@3limin4t0r我刚开始学习编程,所以可能违反了关于变量是什么的一些基本规则,但似乎每次调用var时,它都可能打印5并返回nil,而不是只返回nil,这不是它(大约)在每种语言中的工作方式。分配值时,需要知道要分配的值。该值是赋值语句的RHS。将对RHS进行全面评估。对于
put(5)
而言,评估结果会导致打印
5
的副作用,返回值为
nil
。赋值是RHS的结果,即
nil
。有副作用是无关紧要的。我刚刚找到了一种使用RubyVM::AbstractSyntaxTree的方法,我认为::AST是<2.6,而::AbstractSyntaxTree是>=2.6“而不是方法调用本身”-不确定你如何想象方法调用的分配(这不是调用的结果)。你能想象如果RHS不是一个“比赋值更高的优先级”?它会使赋值无效。“而不是方法调用本身”--我不太确定我是否理解你在这里的意思。你可以分配一个方法引用,但是“调用本身”“是该调用的结果。@3limin4t0r我刚开始学习编程,所以可能我违反了关于变量是什么的一些基本规则,但似乎每次调用var时,它都可能打印5并返回nil,而不是只返回nil。这不是(大约)每种语言的工作原理。分配值时,需要知道要分配的值。该值是赋值语句的RHS。将对RHS进行全面评估。对于
put(5)
e