关于 ruby 哈希的恼人问题

An irritating Issue about ruby hashes

为什么 ruby 有时会将散列解释为代码块?

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

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

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

解决这个问题的唯一方法是用括号括起来,这样它就变成了:

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

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

我不介意在哈希周围加上方括号,令人恼火的是它不一致,有时行得通,有时行不通。

怎么回事?

如果省略了方法调用的括号,则也必须省略散列周围的大括号。

没有不一致。 Ruby 只需使用相同的符号 {} 来分隔代码块和作为哈希构造函数运算符。

如果作为 proc/method 参数出现,它们总是 被视为一个块。因此,您需要在括号中放置一个散列参数以区分块或直接传递散列元素,如@Aetherus 已经提到的那样。

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

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

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

在那之后,下一个常见的方法就是只用括号:

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

之后,同时使用:(如果您在散列后有参数,这也是必需的)

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