星际之前的空格会破坏ruby乘法语句中的语法

时间:2014-12-15 14:09:54

标签: ruby syntax-error

虽然添加一些空格以使代码更具可读性(与上面的代码对齐),但我遇到了这个:

class C
  def x
    42
  end
end
m=C.new

现在这将给出#34;错误的参数数量":

m.x *m.x

这将给出"语法错误,意外的tSTAR,期待$ end":

2/m.x *m.x

解析器究竟发生了什么?

我使用Ruby 1.9.2和2.1.5进行了测试。

2 个答案:

答案 0 :(得分:6)

*用于运算符(42 * 42)和参数解包(myfun *[42, 42])。

当你这样做时:

m.x *m.x  
2/m.x *m.x

Ruby将此解释为参数解包,而不是*运算符(即乘法)。

如果您不熟悉它,参数解包(有时也称为“splat”或“splats”)意味着您可以拥有这样的函数:

def myfun arg1, arg2; end

并称之为:

myfun(*['Hello', 'World'])

arg1设置为Helloarg2设置为World

我认为规则是确定使用哪个:

  • *之后的空格,但 - >论证解包
  • 功能括号的开始 - >论证解包
  • 其他所有 - >乘法(或更确切地说,*运算符,因为Ruby执行运算符重载)。

好的指导方针是:

  1. 在打算参数解包时使用“可选”函数括号;
  2. 当您打算使用*运算符(乘法)时,请在*之前和之后使用空格。
  3. 当您运行ruby -v时,Ruby会实际警告您:

    test.rb|11 warning| `*' interpreted as argument prefix                                    
    test.rb|12 warning| `*' interpreted as argument prefix
    

答案 1 :(得分:3)

用简单的语言:

当你说

m.x *m.x

它在内部调用m.x(*m.x),即它将*m.x视为m.x的splat参数。

因为,在x上定义了m方法,它接受任何参数,你得到“错误的参数数量”错误。

致电时

m.x * m.x

它将*视为x的方法,它接受类型为'Fixnum'的对象,而在Ruby中,为{Fixnum'类定义了带参数的*方法。所以,它与调用

相同
m.x.*(m.x)

因此它有效!

我希望这有助于您了解问题,如果需要澄清,请随时发表评论。