2012-01-07 73 views

回答

3

那么,在一个散列中,键和值都可以是任何对象。你只需要确保你正在创建一个有效的对象。 :1234不是有效的符号。您可以使用

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

您可以使用x[1234]访问该阵列。

在另一方面,如果你想使用一个符号,它必须以字符开始,而不是一个数字:

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

你将它用x[:poke]访问。

最常见的关键是:FixnumStringSymbol,但不限于它们。你也可以有一些你创建的抽象类,并用它作为关键,但我从来没有这样的需要;并不意味着它不实际。

+0

你打我4分钟:) – fguillen 2012-01-07 18:36:34

+0

@fguillen我没有真正打扰提供任何证据。所以,你的答案可能比我的准确一些。 :) – omninonsense 2012-01-07 18:40:13

+0

所有有效的答案,但是,':1234'不是一个有效的符号。感谢您的支持 – 2012-01-07 20:27:31

5

您是否尝试过使用:

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

这将导致一个哈希元素:

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

,可从哈希使用或者123foo访问。


您还可以在Ruby的哈希表做手脚:

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]} 
+0

啊,您的观点更重要。 〜好吧,我会离开我的。有人可能会发现它“教育”。 – omninonsense 2012-01-07 18:33:29

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] 
+0

数字字符串可以是符号。你只需要使用正确的语法,如':“123”',这相当于''123“.to_sym',它在功能上等同于'123.to_s.to_sym'。 – 2012-01-07 22:40:50