Ruby哈希相当于JavaScript的对象初始化程序ES6的简写

时间:2016-05-21 16:22:12

标签: javascript ruby hash ecmascript-6 shorthand

在JavaScript ES6中,我们可以创建变量名称变成这样的键的对象:

> let a = 'aaa'
'aaa'

> let b = 'bbb'
'bbb'

> { a, b }
{ a:"aaa", b:"bbb" }

Ruby是否具有与哈希相同的东西?

澄清: 显然这个问题关注速记符号。我正在寻找{a,b}而不是{a:a,b:b}

5 个答案:

答案 0 :(得分:11)

不,没有这样的速记符号。

答案 1 :(得分:5)

简短回答没有。

更长的答案

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是隐式哈希的缩写)

答案 2 :(得分:1)

它是在Ruby #15236 - Add support for hash shorthand中提出的,很遗憾,目前已被拒绝。

答案 3 :(得分:0)

尽管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运算符**将其与其他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运算符**,您可以对s sub_hash arg进行splat:

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 }slice上的Hash方法在这里非常方便。

首先,允许您的参数:

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方法来说不是一个难题。尽管使用slice实现了我们想要的:

test_splat(**permitted_params.slice(:a, :b), c: 3)产生"[1, 2, 3]"

答案 4 :(得分:0)

语言未内置。但是您对此怎么看?

https://gist.github.com/smtlaissezfaire/e81356c390ae7c7d38d435ead1ce58d2

def hash_shorthand(source_binding, *symbols)
  hash = {}

  symbols.each do |symbol|
    hash[symbol] = source_binding.local_variable_get(symbol)
  end

  hash
end

$ irb -r './hash_shorthand.rb' 
>> x = 10
>> y = 20
>> 
>> puts hash_shorthand(binding, :x, :y)
{:x=>10, :y=>20}

唯一的缺点是,您需要传递绑定才能访问局部变量。