【发布时间】:2018-10-16 05:01:02
【问题描述】:
我正在阅读这个 SO 问题:https://stackoverflow.com/a/4402761/2379703,最后一篇显示 rails render impl 的帖子很有趣。它的签名是:
def render(options = {}, locals = {}, &block)
如果第一个参数是纯字符串,它会将其分配给选项,其余的被解释为哈希并分配给本地变量。例如:
render('partial_name', key: 'value', key2:, 'value2')
结果:
options = "partial_name"
locals = {key: 'value', key2:, 'value2'}
如果你只是传递键/值对,它假定你传递了一个散列的单个参数并将其全部分配给选项并将局部变量留空:
render(partial: 'partial_name', key: 'value', key2", 'value2')
结果:
options = {partial: 'partial_name', key: 'value', key2:, 'value2'}
locals = {}
所以我的问题真正归结为:当有多个可选参数时,ruby 用来确定分配哪个参数的逻辑是什么?此外,哈希似乎使这个问题的答案更有趣,因为当作为参数传入时,哈希显然不需要用外部 {} 分隔。
次要观察,在一个测试中,我对像渲染这样的测试方法使用了相同的签名,并且我传递了以下内容:
render(key: 'value', key2: 'value2', 'string')
这会导致语法错误:
test_hash_param.rb:15: syntax error, unexpected ')', expecting =>
这是为什么?为什么不将两个键/值对分配给选项并将本地设置为'string'?
然而,这就像我想象的那样工作:
render({key: 'value', key2: 'value2'}, 'string')
【问题讨论】:
标签: ruby-on-rails ruby hash