2015-04-21 2 views
0

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

Это в основном получение номера каждой буквы в str (String) и игнорирование пробелов.

Я получаю, что подсчет начинается как пустой хэш, но как он когда-либо получает буквы в виде ключей? counts[char] += 1 Я угадываю, как-то вводя ключ (буквы) и значение (количество повторов) в хэш?

def letter_count(str) 
     counts = Hash.new(0) 

     str.each_char do |char| 
     counts[char] += 1 unless char == " " 
     end 
     counts 
    end 
+2

В чем ваш вопрос? –

+0

Извините, если я не понял. Я не понимаю, как подсчеты получают ключи. Я вижу, что значения каждого ключа изменяются с помощью + = 1, но как хэш получает буквы для использования в качестве ключей? – Jeff

+0

Хеш может использовать все как ключ. Включая буквы (например, односимвольные строки). –

ответ

2

В начале подсчет представляет собой пустой хэш с 0 в качестве значения по умолчанию. Поэтому, если мы попытаемся получить значение для ключа, который в настоящее время отсутствует в хэше, возвращается 0.

Затем в каждом символе есть строка цикла. Символ рассматривается как ключ для хэша (но если char - это пробел, он ничего не делает). Мы получаем значение, хранящееся в хеше (или 0, если оно отсутствует), и увеличиваем его.

Так что для строки «как» мы получим этот ответ:

{'a' => 2, 's' => 1} 

Надеется, что это помогает!

+1

http://ruby-doc.org/core-2.2.0/Hash.html#method-c-new 0 в Hash.new (0) устанавливает значение по умолчанию как 0 для каждого элемента. Счет [char] создаст элемент с ключом «char» (инициализируется по умолчанию), если он еще не существует –

+0

okay reuben благодарит так много за это. Это именно то, что я пытаюсь выяснить, – Jeff

+0

@ReubenMallaby более точно, 'counts [char]' возвращает значение по умолчанию, если ключ не существует, без его создания. '+ =' вызывает создание ключа путем вызова ['Hash # [] ='] (http://ruby-doc.org/core-2.2.2/Hash.html#method-i-5B-5D- 3D) – Stefan

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