2014-01-08 2 views
1

Я изучаю Ruby с помощью codeacadamy.com, и текущее задание - создать хэш со списком фильмов. Так, будучи мной, первый фильм, который я поставил в было 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_, насколько я знаю), но тогда что такое и .intern, чтобы сделать "300" действительным символом?

+1

Возможные продублируйте из http://stackoverflow.com/questions/4281397/why-cant-i-use Синтаксис синтаксиса -an-integer-as-a-key-using-the-new-ruby-1-9-2-hash – TheConstructor

+0

Не совсем, я понимаю, что его проблема была и на самом деле играла вокруг, делая почти то же самое, но я все еще не знаю, почему это позволит «300» .to_sym быть символом, так как символы должны начинаться с допустимых символов метода. –

+0

Прочитайте первые 2 строки отсюда -http: //www.ruby-doc.org/core-2.1.0/Symbol.html –

ответ

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>' 
+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} 
Смежные вопросы