代码之家  ›  专栏  ›  技术社区  ›  barlop Sandeep

在Ruby中,当向一个方法传递多个散列时,调用中是否必须使用括号?

  •  -1
  • barlop Sandeep  · 技术社区  · 7 年前

    def abc x,y
    end
    

    abc {4,5},{6,4} <-- syntax error, unexpected ',', expecting '}'

    1 回复  |  直到 7 年前
        1
  •  2
  •   barlop Sandeep    7 年前

    Mu指出,如果将多个散列作为非文本(即变量)传入,则可以传递多个不带括号的散列。

    但除此之外,对于字面哈希,

    关键字参数是当方法的参数包含冒号时,例如。 def blah x:, y: blah y:2,x:3 . 有时您必须查看参数以确定参数是否是关键字参数,例如,如果您有一个用abcx:3调用的方法 def abc x: 在这种情况下,您使用关键字参数调用它。或者可能是 def abc x 在这种情况下,您使用散列来调用它,省略了{}。

    当一个调用没有括号时,只能传递一个哈希值,而该哈希值必须是最后一个参数。你可以跳过它周围的{}。

    注意-我不是专家,但是关于关键字参数是否是散列类型的相关问题,据我所知,在编写Ruby3之前,它们是,但是有一个建议是Ruby3有一个不同于散列的“真实”关键字参数 https://bugs.ruby-lang.org/issues/14183

    关键字参数不能是多值的。

    此外,哈希可以自动转换为关键字参数。(例如,如果一个方法是用一个关键字参数来定义的,那么您可以在。 {x:"a"} x:"a" (x是一个参数名)。

    我将添加一个关于块和括号的点,因为用{}完成的块看起来有点像散列,尽管它不是散列。块对是否需要括号有一定的影响。

    abc {} ,即{}是块而不是散列,并且块不算作参数。因此,这一呼吁适用于 def abc 定义abc x

    即使在其他参数之后传递块,块之前也不应该有逗号,如果用{}完成的块跟在一些参数之后,则需要括号,但是如果用{}完成的块 do .. end 跟随一些参数,你不需要括号

    建议在有多个参数时使用括号,除非是DSL(领域特定语言)。 Do you leave parentheses in or out in Ruby?

    推荐文章