0

这是 Codeacademy 中的一个练习的解决方案。为什么要symbols.push先行(s.to_sym)?为什么这两种方法会以这种顺序出现?

symbols = []

strings.each { |s| symbols.push s.to_sym }
4

1 回答 1

3

它只是在语法上“先于”。操作顺序不是严格的从左到右。根据需要评估子表达式。在这种情况下s.to_sym,是一个子表达式,它成为方法的参数symbols.push

必须在调用方法之前评估方法的参数,Ruby 解析器知道如何解决这个问题。如此s.to_sym调用,并将结果发送到symbols.push.

Ruby 还将检查运算符的优先级,例如+*决定在例如数学公式中首先评估哪些子表达式。

Ruby 方法调用约定允许您编写不带括号的函数调用,这在 Ruby 代码中很常见。这可能有助于理解

symbols.push s.to_sym

是相同的

symbols.push( s.to_sym )

这是您在其他语言中更常见的语法。

重要的是,以下内容一样:

symbols.push
s.to_sym

在这种情况下,Ruby 将分别评估这两个表达式,并且它会很高兴地对任何一行都不做任何有用的事情(不幸的是,特定于这种情况,因为它对push没有参数感到满意)。

于 2013-09-27T14:54:31.667 回答