2016-02-10 3 views
-1

У меня есть эта ошибка NoMethodError (undefined method 'each' for 8:Fixnum): со ссылкой на эту строку кода:NoMethodError (неопределенный метод `каждый» для 8: Fixnum):

my_hash.key("free").each{|key| my_array.push(key)} 

То, что я пытаюсь сделать, это «для каждой записи в my_hash который имеет значение «бесплатно», добавьте его в my_array ». Это происходит, потому что my_hash.key («бесплатно») возвращает только одно значение? Если да, то как я могу изменить это, чтобы делать то, что я желаю?

здесь больше окружающего кода для справки:

my_hash = Hash.new 
    (8..18).each {|i| my_hash[i] = "free"} 
    my_array = Array.new 

    ... 

    hour_array.each{|hour| my_hash[hour] = "busy"} #this is to show that not every key will have value "free" 
    ... 
    my_hash.key("free").each{|key| my_array.push(key)} 

Любые объяснения были бы очень признательны, так как я новичок в Ruby, спасибо!

ответ

1

Нечто подобное возможно ?:

my_array = [] 
my_hash = {key1: "not free", key2: "free", key3: "free", key4: "not free", key5: "free"} 

my_hash.select{|k,v| my_hash[k] == "free" ? my_array << k : false } 

p my_hash 
p my_array 

возвращается:

{:key1=>"not free", :key2=>"free", :key3=>"free", :key4=>"not free", :key5=>"free"} 
[:key2, :key3, :key5] 
+0

Я хотел бы сохранить ключи, а не значения, в my_array –

+0

@SCraig ok Я изменил свой код (все, что я сделал, это изменить 'v' на' k' в блоке кода 'select'. Посмотрите. –

+0

@SCraig просто обновил возвращаемые значения, которые в любом случае не должны влиять на предыдущий код. –

0

my_hash.key("free") возвращает один ключ, а не массив, как вы, вероятно, ожидали.

Можно выбрать все ключи, имеющие нужное значение с помощью:

# fails⇒ my_hash.key("free") 
my_hash.group_by(&:last)["free"].map(&:first) 

Здесь группа хэш элементов по значению, а затем выберите группу, имеющую "free" значение и, в конце концов, карта его обратно к ключам ,

+0

ОК, не group_by навсегда изменить порядок записей хэш? –

+0

В чем проблема с чтением документации по ['group_by'] (http://ruby-doc.org/core-2.2.3/Enumerable.html#method-i-group_by) или ее попыткой? Нет, это не так, поскольку все неиспользованные методы для перечислений в ruby ​​будут мутировать вновь созданный объект. – mudasobwa

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