Ruby哈希相当于JavaScript的对象初始化程序ES6的简写
在JavaScript ES6中,我们可以创建对象,其中变量名称变为如下所示的键:
> let a = 'aaa' 'aaa' > let b = 'bbb' 'bbb' > { a, b } { a:"aaa", b:"bbb" }
Ruby有没有相当于哈希的东西?
澄清:显然这个问题与速记符号有关。 我正在寻找{a,b}
而不是{a:a,b:b}
。
不,没有这样的简写符号。
简短的回答没有。
更长的答案
Shugo Maeda在2015年为此提出了补丁(您可以在这里阅读有关此内容的详细信息: https : //bugs.ruby-lang.org/issues/11105 )。
当时Matz没有参与这个想法,但可能愿意在未来改变主意。
与此同时 – 您可以使用Shugo的补丁并修补自己的Ruby版本,自己拥有ES6哈希文字!
要修补Ruby以添加哈希,请执行以下操作:
1)从这里下载补丁https://gist.github.com/thechrisoshow/1bb5708933d71e0e66a29c03cd31dcc3 (目前适用于Ruby 2.5.0)
2)使用RVM安装此Ruby的修补版本。 即
rvm install 2.5.0 -n imphash --patch imphash.patch
然后,您可以使用RVM选择Ruby的修补版本:
rvm use 2.5.0-imphash
(Imphash是隐式哈希的缩写)
尽管Ruby / Rails还没有支持等同于哈希的ES6速记语法,但是有一些方便的习惯用法已经派上用场了。
ruby
考虑以下方法:
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运算符**
将它与其他kwargs一起使用。 例如,如果你有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用户派上用场,特别是在传递params时的控制器中。
假设您有一个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
方法的test_splat
。 尽管使用切片可以达到我们想要的效果:
test_splat(**permitted_params.slice(:a, :b), c: 3)
得出"[1, 2, 3]"