Как конвертировать рубиновое число в символ - PullRequest
15 голосов
/ 17 января 2011

У меня есть такой массив Ruby

q_id = [1,2,3,4,5,...,100]

Я хочу перебрать массив и преобразовать в хеш, как этот

{
  :1 => { #some hash} ,  
  :2 => { #another hash},
  ...
  :100 => {#yet another hash}
}

Какой самый короткий и самый элегантный способ сделать это?

[РЕДАКТИРОВАТЬ: to_s.to_sym, будучи удобным, не так, как я этого хочу. Извиняюсь за то, что не упомянул это раньше.]

Ответы [ 8 ]

29 голосов
/ 17 января 2011

Для создания символа выполните одно из следующих действий:

42.to_s.to_sym
:"#{42}"

Представление #inspect этих шоу :"42" только потому, что :42 не является допустимым литералом Symbol.Будьте уверены, что двойные кавычки не являются частью самого символа.

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

q_id = (1..100).to_a
my_hash_indexed_by_value = {}
q_id.each{ |val| my_hash_indexed_by_value[val] = {} }

Или это:

my_hash = Hash[ *q_id.map{ |v| [v,{}] }.flatten ]

Или это:

# Every time a previously-absent key is indexed, assign and return a new hash
my_hash = Hash.new{ |h,val| h[val] = {} }

С помощью всего этого вы можете затем индексировать свой хэш напрямуюс целым числом и возвращает уникальный хеш, например

my_hash[42][:foo] = "bar"

В отличие от JavaScript, где каждый ключ к объекту должен быть строкой, хэши в Ruby принимают любой объект в качестве ключа.

3 голосов
/ 17 января 2011

Чтобы перевести целое число в символ, используйте to_s.to_sym .. например:

1.to_s.to_sym

Обратите внимание, что символ больше связан со строкой, чем целым числом.Это может быть не так полезно для сортировки.

1 голос
/ 28 августа 2017

На самом деле "символьные числа" не являются чем-то особенным в Ruby (попробуйте вызвать метод to_sym для числа).Преимущество использования символов в хэше заключается в производительности, так как они всегда имеют одинаковый object_id (попробуйте вызвать object_id для строк, логических значений, чисел и символов).

Числа являются непосредственными значениями иПодобно объектам Symbol, они всегда имеют один и тот же object_id.

В любом случае, использование нового синтаксиса хеша подразумевает использование символов в качестве ключей, но вы всегда можете использовать старый добрый синтаксис "хэш-ракеты"

awesome_hash = { 1 => "hello", 2 => "my friend" }

Читайте о непосредственных значениях здесь:

https://books.google.de/books?id=jcUbTcr5XWwC&pg=PA73&lpg=PA73&dq=immediate+values+singleton+method&source=bl&ots=fIFlAe8xjy&sig=j7WgTA1Cft0WrHwq40YdTA50wk0&hl=en&sa=X&ei=0kHSUKCVB-bW0gHRxoHQAg&redir_esc=y#v=onepage&q&f=false

1 голос
/ 28 июня 2011

Массив объектов, которые вы хотите в своем хэше, будет намного проще в использовании, не так ли?Даже хэш целых чисел будет работать очень хорошо, не так ли?

1 голос
/ 17 января 2011

Как уже говорилось,: 1 не является допустимым символом.Вот один из способов сделать то, что вы хотите, но с ключами в виде строк:

Hash[a.collect{|n| [n.to_s, {}] }]
0 голосов
/ 26 февраля 2019

Вы можете создать символические ключи с помощью Hash[]:

a = Hash[(1..100).map{ |x| ["#{x}".to_sym, {}] }]

Проверьте тип хэш-ключей:

puts a.keys.map(&:class)

=>
Symbol
...
Symbol
Symbol
0 голосов
/ 26 февраля 2019

Если вы создаете жестко запрограммированный постоянный числовой символ, есть более простой способ:

:'99'

Это приводит к тем же результатам, что и более сложные методы в других ответах:

irb(main):001:0> :'99'
=> :"99"
irb(main):002:0> :"#{99}"
=> :"99"
irb(main):003:0> 99.to_s.to_sym
=> :"99"

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

0 голосов
/ 17 января 2011

вы можете использовать 1.to_s.to_sym

, но это сделает символы вроде: "1"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...