2012-01-07 71 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