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

Try*_*hen 5 ruby syntax-error

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

class C
  def x
    42
  end
end
m=C.new
Run Code Online (Sandbox Code Playgroud)

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

m.x *m.x
Run Code Online (Sandbox Code Playgroud)

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

2/m.x *m.x
Run Code Online (Sandbox Code Playgroud)

这里的解析器究竟发生了什么?

我测试了Ruby 1.9.2和2.1.5.

Mar*_*oij 6

*用于operator(42 * 42)和参数解包(myfun *[42, 42]).

当你这样做时:

m.x *m.x  
2/m.x *m.x
Run Code Online (Sandbox Code Playgroud)

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

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

def myfun arg1, arg2; end
Run Code Online (Sandbox Code Playgroud)

并称之为:

myfun(*['Hello', 'World'])
Run Code Online (Sandbox Code Playgroud)

arg1设置为Hello,并arg2设置为World.

我相信规则是要确定使用的是:

  • 空间之前但不是之后*- >参数解包
  • 函数括号开始 - >参数解包
  • 其他所有 - >乘法(或者更确切地说,*操作符,因为Ruby会进行运算符重载).

好的指导方针是:

  1. 在打算参数解包时使用"可选"函数括号;
  2. *打算*运算符之前和之后使用空格(乘法).

当你运行时,Ruby实际上会警告你ruby -v:

test.rb|11 warning| `*' interpreted as argument prefix                                    
test.rb|12 warning| `*' interpreted as argument prefix
Run Code Online (Sandbox Code Playgroud)