在JavaScript ES6中,我们可以创建变量名称变成这样的键的对象:
> let a = 'aaa'
'aaa'
> let b = 'bbb'
'bbb'
> { a, b }
{ a:"aaa", b:"bbb" }
Ruby是否具有与哈希相同的东西?
澄清:
显然这个问题关注速记符号。我正在寻找{a,b}
而不是{a:a,b:b}
。
答案 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速记语法等效的哈希,但是已经有一些方便的惯用语了。
请考虑以下方法:
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}
唯一的缺点是,您需要传递绑定才能访问局部变量。