这两个表达似乎没有区别。
h = {a: 1, b: 2}
h.merge({c: 3, d: 4})
h.merge(c: 3, d: 4)
如果在使用Hash
作为参数时省略大括号,是否会出现问题?
答案 0 :(得分:7)
不,两个版本之间没有区别。
此外,当哈希是方法的最后一个参数时,省略大括号是常见的Ruby / Rails习语。比较以下常见示例:
validates :foo, { presence: true }
validates :foo, presence: true
link_to "Foos", foo_path, { class: "foo" }
link_to "Foos", foo_path, class: "foo"
答案 1 :(得分:0)
有两种“方式”或语法来声明哈希值,旧的和新的;
旧方法非常严格,因为它遵循以下公式:
括号int main() {
int biggestnum;
int i;
printf("Please enter an integer:");
scanf("%d", &biggestnum);
if (biggestnum < 0) {
printf("Didn't give me any data, goodbye.");
}
else
{
do {
printf("Please enter an integer:");
scanf("%d", &i);
if (i >= 0)
if (i > biggestnum) {
biggestnum = i;
}
} while (i >= 0);
printf("The biggest integer is: %d\n", biggestnum);
}
return (0);
}
大括号(
,空格{
,关键对象(通常是:symbol ,但可以是其他任何东西),空格,哈希火箭和空格
:one
,值对象=>
,闭包。整个过程看起来像这样:
1
跳过空格是可行的,但这不是正确的语法。
构建新语法的目的是让经常使用JSON的人们可以使用新语法,因此,新语法不是使用EXPLICIT符号(即上例中的hash_object = ({ :one => 1, :two => 2 })
),而是将键强制为符号类,并且遵循一个简单得多的公式:
括号:one
,键名(
,冒号one
,(可选空格:
),值和闭包。在新语法下,哈希创建将如下所示:
1
如您所见,新语法比旧语法简单,但灵活性不强,因为它迫使符号成为键,并且不够直观。
最后,在散列周围还有其他有用的“惯用语”或快捷方式;例如,如果您使用哈希作为方法/函数的参数,它是最后一个参数,那么您可以使用不带括号的新语法,并且Ruby将解释键/值对作为唯一参数:
hash_object = (one: 1, two: 2)
与
相同method arg1, arg2, a: 1, b: 2, c:3
我的建议是坚持旧的,刚性的形式!。 Ruby的构建对开发人员来说是直观且易于阅读的,而不是“优雅”或简短。使用旧语法将迫使您考虑自己在做什么,并且调试起来非常容易,因为您确切地知道在提供哈希时Ruby在“思考”什么。最后提醒一下:也请使用括号!不要跳过它们,否则Ruby有时可能会将您的哈希误认为是代码块。