使用hash作为参数时,没有花括号会有区别吗?

时间:2016-02-27 06:48:30

标签: ruby hash literals

这两个表达似乎没有区别。

h = {a: 1, b: 2}
h.merge({c: 3, d: 4})
h.merge(c: 3, d: 4)

如果在使用Hash作为参数时省略大括号,是否会出现问题?

2 个答案:

答案 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有时可能会将您的哈希误认为是代码块。