ruby乘法语句中的星号前空格语法

ruby乘法语句中的星号前空格语法,ruby,syntax-error,Ruby,Syntax Error,在添加一些空白以使代码更具可读性(与上面的代码对齐)时,我遇到了以下问题: class C def x 42 end end m=C.new 现在,这将给出“错误数量的参数”: 这将给出“语法错误,意外的tSTAR,预期$end”: 解析器中到底发生了什么 我使用Ruby 1.9.2和2.1.5进行了测试。*用于运算符(42*42)和参数解包(myfun*[42,42]) 当您这样做时: m.x *m.x 2/m.x *m.x Ruby将此解释为参数解包,而不是*运算符(

在添加一些空白以使代码更具可读性(与上面的代码对齐)时,我遇到了以下问题:

class C
  def x
    42
  end
end
m=C.new
现在,这将给出“错误数量的参数”:

这将给出“语法错误,意外的tSTAR,预期$end”:

解析器中到底发生了什么


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

*
用于运算符(
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'])
这样称呼它:

def myfun arg1, arg2; end
myfun(*['Hello', 'World'])
arg1
设置为
Hello
arg2
设置为
World

我相信这些规则是为了确定使用哪一种:

  • *
    ->参数解包之前而不是之后加空格
  • 函数括号开始->参数解包
  • 其他一切->乘法(或者更确切地说,是
    *
    操作符,因为Ruby没有操作符重载)
良好的指引包括:

  • 当您打算解包参数时,请使用“可选”函数括号
  • 如果要使用
    *
    运算符(乘法),请在
    *
    之前和之后使用空格
  • 当您运行
    Ruby-v
    时,Ruby实际上会警告您这一点:

    test.rb|11 warning| `*' interpreted as argument prefix                                    
    test.rb|12 warning| `*' interpreted as argument prefix
    
    用简单的语言:

    当你说

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

    由于在
    m
    上定义了一个
    x
    方法,该方法接受任何参数,因此您得到的是“参数数目错误”错误

    当你打电话的时候

    m.x * m.x
    
    它将
    *
    视为
    x
    的一个方法,该方法接受“Fixnum”类型的对象,在Ruby中,接受参数的
    *
    方法是为“Fixnum”类定义的。所以,这和打电话一样

    m.x.*(m.x)
    
    因此它起作用了


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

    怀疑与此有关,但错误消息没有太大帮助+1代表ruby-v。这个的确切语法规则是否有文档记录?@trygveflat当有Ruby时(单击底部的“我同意”),我试图查找它,但现在没有足够的时间来解释标准规范语言;-)