方法定义中围绕参数的Ruby括号

方法定义中围绕参数的Ruby括号,ruby,Ruby,我知道许多ruby风格的指南坚持在方法定义的方法参数周围加括号。我也理解有时候方法调用在语法上是如何需要括号的 但有人能举个例子说明为什么Ruby在方法定义的参数周围需要括号吗?基本上,除了“它看起来更好”之外,我还在寻找一个原因。如果你既没有括号也没有分号,那么它将是不明确的 def foo a end # => Error because it is amgiguous. # Is this a method `foo` that takes no argument with the

我知道许多ruby风格的指南坚持在方法定义的方法参数周围加括号。我也理解有时候方法调用在语法上是如何需要括号的


但有人能举个例子说明为什么Ruby在方法定义的参数周围需要括号吗?基本上,除了“它看起来更好”之外,我还在寻找一个原因。

如果你既没有括号也没有分号,那么它将是不明确的

def foo a end # => Error because it is amgiguous.
# Is this a method `foo` that takes no argument with the body `a`, or
# Is this a method `foo` that takes an argument `a`? 
此外,如果要使用复合参数,则不能忽略括号:

def foo(a, b), c
  p [a, b, c]
end
# => Error

def foo((a, b), c)
  p [a, b, c]
end
foo([1, 2], 3) # => [1, 2, 3]

另一个例子是,当您想将散列作为参数传递给

这不起作用:

MyTable.update_all { col_a: 1, col_b: 2 }
因为{}代表的是块而不是散列

添加paren确实有效

MyTable.update_all({ col_a: 1, col_b: 2 })

在update_all的情况下,它最多需要3个散列作为参数,因此指出哪些值进入哪个散列是很重要的。

def a(b)end
否则您需要一个分号这是第一个合法的答案,解释了为什么需要它。我认为单行方法显然需要它(我从未使用过它们),而使用数组和前两个元素是我从未见过的。我甚至无法在谷歌上找到这个定义,但它确实有效!它说,如果数组中有前两个元素,则将其放入a和b中,或者将值放入a和nil中。它就像一面镜子,相当于splat。有没有指向这个的URL引用?这也可以:MyTable.update_all(col_a:1,col_b:2)OP询问有关方法定义的问题,因此答案是离题的。该示例方法调用中的哈希是多余的,可能是
MyTable.update_all col_a:1,col_b:2