为什么“300”.intern有效但是:300不是

时间:2014-01-08 20:36:57

标签: ruby hash symbols

我正在使用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}}一个有效的符号?

3 个答案:

答案 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"确实有用。