2012-01-07 2 views
1

Как бы я это сделать:Как назначить var в хеш?

{:foo => ['foo', 'bar'] } 

foo является актуальной переменной, которая возвращает 123. То, что я действительно пытаюсь сделать, это:

{:1234 => ['foo', 'bar'] } 

ответ

3

Ну, в хэше и ключом, и значением может быть любой объект. Вам просто нужно убедиться, что вы создаете действительный объект. :1234 не является допустимым символом. Вы можете использовать

x = {1234 => ['foo', 'bar']} 

Вы бы получить доступ к массиву, используя x[1234].

На другой ноте, если вы хотите использовать символ, он должен начинаться с символа, а не цифра:

x = {:poke => ['foo', 'bar']} 

И вы сможете получить доступ, используя это x[:poke].

Чаще всего ключевыми словами являются: Fixnum, String или Symbol, но не ограничиваясь ими.

У вас также может быть некоторый абстрактный класс, который вы создали, и использовать его в качестве ключа, но у меня никогда не было необходимости в этом; не означает, что это не практично.

+0

Ты бил меня в течение 4 минут :) – fguillen

+0

@fguillen Я действительно не удосужился предоставить какие-либо доказательства. Итак, ваш ответ, вероятно, немного точнее моего. :) – omninonsense

+0

Все действительные ответы, но да, ': 1234' не является допустимым символом. Спасибо, что очистили это. –

5

Вы пытались использовать:

{foo => ['foo', 'bar'] } 

Это приведет к хэш-элемент:

{123 => ['foo', 'bar'] } 

и могут быть доступны из хэша, используя либо 123 или foo.


Вы также можете играть трюки на хэши в 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

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'. –

Смежные вопросы