虽然 Ruby / Rails 还不支持与 ES6 的哈希速记语法等效,但已经有一些方便的习惯用法经常派上用场。
红宝石
考虑以下方法:
def test_splat(a:, b:, c:)
[a, b, c].inspect
end
test_splat(a: 4, b: 5, c: 6) 产生"[4, 5, 6]"
虽然如果你已经有一个像hash = { a: 1, b: 2, c: 3 }这样的哈希,你可以简单地这样调用它:
test_splat(hash) 产生"[1, 2, 3]"
进一步
如果您有 sub_hash,您可以使用 kwarg splat 运算符 ** 将它与其他 kwarg 一起使用。例如,如果您有sub_hash = { a: 1, b: 2 },则调用:
test_splat(sub_hash) 产生ArgumentError: missing keyword: c
并调用:
test_splat(sub_hash, c: 3) 产生ArgumentError: wrong number of arguments (given 1, expected 0)
但使用 splat 运算符 **,您可以执行 splat sub_hash arg:
test_splat(**sub_hash, c: 3) 产生"[1, 2, 3]"
更多阅读请看https://www.justinweiss.com/articles/fun-with-keyword-arguments/
导轨
上面的方法加上一些额外的方法可以为 Rails 用户派上用场,尤其是在传入参数的控制器中。
假设你有一个ActionController::Parameters 对象,它的属性比你需要的多,并且你想要一个子集。例如:{ a: 1, b: 2, d: 4 }。 Hash 上的 slice 方法在这里非常方便。
首先,允许你的参数:
permitted_params = params.permit(:a, :b, :d).to_h.symbolize_keys.
我们添加.to_h.symbolize_keys 因为ActionController::Parameters 不支持symbolize_keys,并且kwargs 要求args 的键是符号,而不是字符串。因此.to_h 将其转换为ActiveSupport::HashWithIndifferentAccess,symbolize_keys 将哈希的键从字符串转换为符号。
现在,打电话:
test_splat(**permitted_params, c: 3) 将按预期产生ArgumentError: unknown keyword: d,因为d 不是test_splat 方法的kwarg。虽然在这里使用 slice 实现了我们想要的:
test_splat(**permitted_params.slice(:a, :b), c: 3) 产生"[1, 2, 3]"