这是 Codeacademy 中的一个练习的解决方案。为什么要symbols.push
先行(s.to_sym)
?为什么这两种方法会以这种顺序出现?
symbols = []
strings.each { |s| symbols.push s.to_sym }
它只是在语法上“先于”。操作顺序不是严格的从左到右。根据需要评估子表达式。在这种情况下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
没有参数感到满意)。