2014-01-08 22 views
1

我正在使用codeacadamy.com學習Ruby,當前的任務是創建一個包含電影列表的哈希。所以,作爲我來說,我把在第一部電影是300爲什麼「300」.intern有效,但:300不是

movies = { 
    300: 3, 
    titanic: 1, 
    joe_versus_the_volcanoe: 3 
} 

而且我注意到,300拋出一個錯誤:

(ruby):1: syntax error, unexpected ':', expecting tASSOC 
    300: 3, 
     ^

這使得有很大的意義,但後來我嘗試使用串。

puts "300".intern 
puts "300".to_sym 
puts :300 

前兩個是有效符號,輸出300到屏幕上,但最後一個引發錯誤。我知道300應該是錯誤的,因爲它不是以有效的方法字符(a-zA-Z_,據我所知)開始,但是.to_sym.intern是做什麼來使"300"成爲一個有效的符號?

+1

可能dublicate http://stackoverflow.com/questions/4281397/why-cant-i-use -an-integer-as-a-key-using-the-new-ruby-1-9-2-hash-syntax – TheConstructor

+0

不完全是,我明白他的問題是什麼,實際上是在做幾乎完全一樣的事情,但我仍然不知道爲什麼它會讓「300」.to_sym成爲一個符號,因爲符號應該以有效的方法字符開頭。 –

+0

請閱讀此處的前兩行-http://www.ruby-doc.org/core-2.1.0/Symbol.html –

回答

4

通過說puts "300".to_sym創建的符號不是用Fixnum創建符號,而是使用字符串創建該符號。你似乎在這裏混合了Fixnum's與絃樂。

:"300"爲有效符號

:300

當你鍵入puts "300".to_sym,則返回:"300"

1.9.3-p484 :002 > "300".to_sym 
=> :"300" 

你可以很容易使你的哈希

1.9.3-p484 :013 > hsh = { 
1.9.3-p484 :014 >  :"300" => 3, 
1.9.3-p484 :015 >  :something_else => 2 
1.9.3-p484 :016?> } 
=> {:"300"=>3, :something_else=>2} 
1.9.3-p484 :017 > hsh[:"300"] 
=> 3 

,這將工作正常。

如果您嘗試將to_sym發送到Fixnum,則會更準確地說明您的問題。

1.9.3-p484 :018 > 300.to_sym 
    NoMethodError: undefined method `to_sym' for 300:Fixnum 
    from (irb):18 
    from /Users/rsahae/.rvm/rubies/ruby-1.9.3-p327/bin/irb:18:in `<main>' 
+0

通常,符號遵循變量/方法名稱規則,即第一個字符不能是數字。除非你使用引號,否則任何事情都會發生。 – Max

+1

很高興知道,謝謝。你知道爲什麼「300」:不起作用嗎? –

+0

對不起,我沒有答案,我也想知道。我的猜測是它只是解釋器的一部分,以及它如何處理特定的語法快捷方式。 – Raj

0
puts :300 

不會失敗,因爲它沒有一個有效的方法字符開始,它失敗,因爲300不是一個字符串。 puts :"300"確實有效。

+1

但'puts:a300'可以工作,而'a300'本身也不是Ruby中的字符串。 – Ajedi32

+0

@ Ajedi32好點。錯誤消息是:'語法錯誤,意外的tINTEGER,期望tSTRING_CONTENT或tSTRING_DBEG或tSTRING_DVAR或tSTRING_END',所以正確的答案可能是解釋什麼意思 - 我不知道。 – steenslag

+0

這意味着'300'在Ruby中不是一個有效的標識符:http://web.njit.edu/all_topics/Prog_Lang_Docs/html/ruby/syntax.html#ident – Ajedi32

1

您可以將幾乎任何您想要的字符放在一個符號中,而不是符號文字的:name語法。

"1 whole sentence with all sorts of characters!".to_sym 
#=> :"1 whole sentence with all sorts of characters!" 

你可以使用其中一個另類符號文字語法是:"string"語法:的

movies = { 
    :"300" => 3, 
    :titanic => 1, 
    :joe_versus_the_volcanoe => 3 
} 
#=> {:"300"=>3, :titanic=>1, :joe_versus_the_volcanoe=>3}