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]"

Interesting Posts