如何将var分配给哈希?

时间:2012-01-07 17:57:19

标签: ruby ruby-on-rails-3 hash

我该怎么做:

{:foo => ['foo', 'bar'] } 

foo是一个实际变量,返回123。我真正想做的是:

{:1234 => ['foo', 'bar'] }

3 个答案:

答案 0 :(得分:5)

您是否尝试过使用:

{foo => ['foo', 'bar'] }

这将导致哈希元素:

{123 => ['foo', 'bar'] }

可以使用123foo

从哈希中访问

你也可以在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]访问它。

最常见的关键是:FixnumStringSymbol,但不仅限于此。

您也可以创建一些抽象类,并将其用作键,但我从来没有这样做过;并不意味着它不实用。