我正在使用codeacadamy.com学习Ruby,目前的任务是创建一个包含电影列表的哈希。所以,作为我,我放的第一部电影是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
做什么{{ 1}}一个有效的符号?
答案 0 :(得分:4)
您通过说puts "300".to_sym
创建的符号不是使用Fixnum创建符号,而是使用字符串创建符号。你似乎在这里混合了Fixnum和字符串。
:"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>'
答案 1 :(得分: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}
答案 2 :(得分:0)
puts :300
不会失败,因为它不以有效的方法字符开头,因为300不是字符串而失败。 puts :"300"
确实有用。