关于红宝石哈希的一个令人恼火的问题

时间:2015-05-11 10:53:34

标签: ruby hash syntax

为什么ruby有时会将哈希解释为代码块?

例如,我有一个名为'required'的函数,它接受哈希,所以我这样做:

unexpected tSYMBEG

它认为这是required({ base_uri: String, endpoints: String, destination: String, credentials: Hash}) 的代码块和错误。

解决此问题的唯一方法是在其周围放置括号,使其显示为:

try { Something1(); }
catch { Something2(); }

然后开始将其作为哈希(就像我想要的那样)阅读。

我并不打算在哈希周围放置括号,令人恼火的是它不一致,有时候会有效,有时则不然。

发生了什么事?

3 个答案:

答案 0 :(得分:5)

如果省略了方法调用的括号,则必须省略围绕哈希的花括号。

答案 1 :(得分:2)

您选择了最少使用的方式。在这种情况下最常见的是省略两种类型的标点符号:

required base_uri: String, endpoints: String, destination: String, credentials: Hash

在那之后,下一个常见的方式就是parens:

required(base_uri: String, endpoints: String, destination: String, credentials: Hash)

之后,同时使用:(如果你在哈希之后有参数,这也是必要的)

required({ base_uri: String, endpoints: String, destination: String, credentials: Hash})

答案 2 :(得分:1)

没有不一致。 Ruby只使用相同的符号{}来分隔代码块和Hash构造函数操作符。

如果显示为proc / method参数,则始终视为块。由于这个原因,你需要在parens中加入一个hash参数来区分block或直接传递哈希元素,就像@Aetherus已经提到的那样。

非常一致,如果你问我。