我有一个字符串变量。我想使用变量作为键来创建哈希。在Ruby 1.8中,我使用了hashrocket语法,如下所示:
class BatchTestService {
static transactional = false
def springBatchService
...
}
}
在Ruby 1.9中,有一种新语法,我可以这样做:
my_key = 'arbitrary'
my_hash = {my_key => 'my_value'}
但是如何将变量转换为键?我试过了:
my_hash = {arbitrary: 'my_value'}
我是否必须继续使用Ruby 1.8语法?
答案 0 :(得分:3)
Ruby 1.9语法仅适用于Symbol
文字。除了其他任何东西,那些键不是Symbol
,或者不是文字(就像你的例子中那样),你仍然需要使用hashrocket。
答案 1 :(得分:2)
让我介绍两种方法来做你想要的。如果您不想继续使用1.8语法和hashrockets, ruby-doc.org 建议在Ruby 1.9.3中以这种方式执行此操作:
my_hash = Hash.new
my_key = "key000"
my_hash[my_key] = "my_value"
Livedemo:http://ideone.com/yqIx2M
第二个(与你想要实现的更相似)是:
my_key = "key0"
my_hash = Hash[my_key, "value00"]
puts my_hash
Livedemo:http://ideone.com/HHLyAi
答案 2 :(得分:2)
{arbitrary: 'my_value'}
是{:arbitrary => 'my_value'}
的语法糖,:arbitrary
是'arbitrary'.to_sym
的语法糖(是的,这是谎言,因为:arbitrary
实习生解释器在执行代码时读取代码和'arbitrary'.to_sym
实习生,但为了解释起见,我们假装它们是等同的)
因此,{arbitrary: 'my_value'}
可以写成{'arbitrary'.to_sym => 'my_value'}
,因为您拥有变量中的键,所以您可以使用:
my_key = 'arbitrary'
my_hash = {my_key.to_sym => 'my_value'}
请记住,当您使用to_sym
时,您冒着创建大量符号的风险,这些符号会永久保留在内存中(ish),因此您可能需要考虑使用旧语法的字符串键。有关字符串和符号之间差异的更多信息,请阅读:http://www.randomhacks.net/2007/01/20/13-ways-of-looking-at-a-ruby-symbol/