我该怎么做:
{:foo => ['foo', 'bar'] }
foo
是一个实际变量,返回123
。我真正想做的是:
{:1234 => ['foo', 'bar'] }
答案 0 :(得分:5)
您是否尝试过使用:
{foo => ['foo', 'bar'] }
这将导致哈希元素:
{123 => ['foo', 'bar'] }
可以使用123
或foo
你也可以在Ruby的Hashes上玩弄技巧:
foo = 123 # => 123
{ foo => [1,2] } # => {123=>[1, 2]}
{ :123 => [1,2] }
SyntaxError: (irb):3: syntax error, unexpected tINTEGER, expecting tSTRING_CONTENT or tSTRING_DBEG or tSTRING_DVAR or tSTRING_END
{ :123 => [1,2] }
^
{ foo.to_sym => [1,2] }
NoMethodError: undefined method `to_sym' for 123:Fixnum
{ foo.to_s.to_sym => [1,2] } # => {:"123"=>[1, 2]}
{ :"123" => [1,2] } # => {:"123"=>[1, 2]}
答案 1 :(得分:4)
我认为数字不能成为符号:
ruby-1.9.2-p0 > :1
SyntaxError: (irb):7: syntax error, unexpected tINTEGER, expecting tSTRING_CONTENT or tSTRING_DBEG or tSTRING_DVAR or tSTRING_END
如果您不关心使用正确的符号,可以这样做:
ruby-1.9.2-p0 > foo = "wadus"
=> "wadus"
ruby-1.9.2-p0 > { foo.to_sym => [1,2] }
=> {:wadus=>[1, 2]}
ruby-1.9.2-p0 > { foo.to_sym => [1,2] }[:wadus]
=> [1, 2]
答案 2 :(得分:3)
好吧,在散列中,键和值都可以是任何对象。您只需要确保创建一个有效的对象。 :1234
不是有效的符号。你可以用
x = {1234 => ['foo', 'bar']}
您可以使用x[1234]
访问数组。
另一方面,如果你想使用一个符号,它必须以一个字符开头,而不是一个数字:
x = {:poke => ['foo', 'bar']}
您可以使用x[:poke]
访问它。
最常见的关键是:Fixnum
,String
或Symbol
,但不仅限于此。
您也可以创建一些抽象类,并将其用作键,但我从来没有这样做过;并不意味着它不实用。