一个关于ruby哈希的恼人问题

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

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

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

它认为它是一块代码和错误的unexpected tSYMBEG

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

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

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

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

这是怎么回事?

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

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

 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}) 

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

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

非常一致,如果你问我的话。