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

关于ruby哈希的一个令人恼火的问题,ruby,hash,syntax,Ruby,Hash,Syntax,为什么ruby有时会将哈希解释为代码块 例如,我有一个名为“required”的函数,它接受散列,因此我执行以下操作: required { base_uri: String, endpoints: String, destination: String, credentials: Hash} 它认为这是一个代码块和错误意外的tSYMBEG 解决此问题的唯一方法是在其周围放上括号,使其内容如下: required({ base_uri: String, endpoints: String, d

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

例如,我有一个名为“required”的函数,它接受散列,因此我执行以下操作:

required { base_uri: String, endpoints: String, destination: String, credentials: Hash}
它认为这是一个代码块和错误
意外的tSYMBEG

解决此问题的唯一方法是在其周围放上括号,使其内容如下:

required({ base_uri: String, endpoints: String, destination: String, credentials: Hash})
然后它开始将其作为散列读取(就像我希望的那样)

我不介意在散列中加括号,令人恼火的是它不一致,有时有效,有时无效


发生了什么事?

如果省略了方法调用的括号,那么也必须省略哈希周围的大括号。

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

如果显示为proc/method参数,则它们始终被视为块。由于这个原因,您需要在parens中放置一个散列参数,以区别于前面提到的@Aetherus中的block或pass直接散列元素


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

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

required base_uri: String, endpoints: String, destination: String, credentials: Hash
在此之后,下一个常见的方法是使用paren:

required(base_uri: String, endpoints: String, destination: String, credentials: Hash)
之后,使用这两个选项:(如果在散列之后有参数,这也是必需的)


如果在本例中不使用括号,Ruby如何将哈希与块区分开来?只需删除哈希的括号即可parameters@papirtiger绝对正确。。
required({ base_uri: String, endpoints: String, destination: String, credentials: Hash})