Ruby哈希等价于JavaScript的对象初始值设定项ES6速记

Ruby哈希等价于JavaScript的对象初始值设定项ES6速记,javascript,ruby,hash,ecmascript-6,shorthand,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}。不,没有这样的速记法。简短回答否 更长的答案 2015年,Shugo Maeda为此提出了一个补丁。您可以在此处阅读有关此补丁的详

在JavaScript ES6中,我们可以创建变量名变成键的对象,如下所示:

> let a = 'aaa'
'aaa'

> let b = 'bbb'
'bbb'

> { a, b }
{ a:"aaa", b:"bbb" }
Ruby是否有与哈希等价的东西

澄清:
显然,这个问题与速记符号有关。我要找的是{a,b}而不是{a:a,b:b}。

不,没有这样的速记法。

简短回答否

更长的答案

2015年,Shugo Maeda为此提出了一个补丁。您可以在此处阅读有关此补丁的详细信息:

当时马茨并不赞同这个想法,但他可能愿意在将来改变主意

同时,您可以使用Shugo的补丁,并修补您自己版本的Ruby,以自己拥有ES6哈希文本

要修补Ruby以添加哈希,请执行以下操作:

1从这里下载该修补程序,该修补程序目前适用于Ruby 2.5.0

2使用RVM安装此Ruby的修补版本。i、 e

rvm install 2.5.0 -n imphash --patch imphash.patch
然后,您可以使用RVM选择Ruby的修补版本:

rvm use 2.5.0-imphash

Imphash是隐式hash的缩写

尽管Ruby/Rails还不支持与ES6的hash速记语法等效的语法,但是已经有一些常用的习惯用法

红宝石 考虑以下方法:

def test_splat(a:, b:, c:)
  [a, b, c].inspect
end
测试数据:4,b:5,c:6收益率[4,5,6]

虽然如果您已经有一个hash={a:1,b:2,c:3}这样的hash,您可以这样简单地调用它:

> let a = 'aaa'
'aaa'

> let b = 'bbb'
'bbb'

> { a, b }
{ a:"aaa", b:"bbb" }
测试产生[1,2,3]的飞溅物

进一步的 如果有子_散列,可以使用kwarg splat运算符**将其与其他kwarg一起使用。例如,如果您有sub_hash={a:1,b:2},则调用:

test_splatsub_哈希错误:缺少关键字:c

并致电:

test_splatsub_hash,c:3生成ArgumentError:给定1的参数数目错误,应为0

但是使用splat操作符**,可以对sub_hash arg执行splat操作:

test\u splat**sub\u hash,c:3,它产生[1,2,3]

更多阅读请参阅

轨道 上述方法加上一些额外的方法对于Rails用户来说非常方便,尤其是在传入参数的控制器中

假设您有一个ActionController::Parameters对象,其属性比您需要的多,并且您想要一个子集。例如:{a:1,b:2,d:4}。哈希上的切片方法在这里非常方便

首先,允许您的参数:

允许的参数=参数。允许:a,:b,:d。to_h。符号化键

我们添加.to_h.symbol_键,因为ActionController::Parameters不支持symbol_键,而kwargs要求参数的键是符号,而不是字符串。因此.to_h将其转换为ActiveSupport::HashWithInferenceAccess,而symbol_键将哈希的键从字符串转换为符号

现在,请致电:

test\u splat**allowed\u params,c:3将产生ArgumentError:unknown关键字:d,因为d不是test\u splat方法的kwarg。尽管使用slice实现了我们想要的:


测试数据**允许的参数。切片:a,:b,c:3产生[1,2,3]

它是在中提出的,不幸的是目前被拒绝了。

不是该语言内置的。但是你觉得这个怎么样


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

我希望有,不过…:
$ irb -r './hash_shorthand.rb' 
>> x = 10
>> y = 20
>> 
>> puts hash_shorthand(binding, :x, :y)
{:x=>10, :y=>20}