получить перечисляемый ruby ​​(.select, .min, .max) в качестве ссылки, а не копии - PullRequest
2 голосов
/ 05 марта 2012

Я делаю кучу вещей с массивом хэшей и изучаю тонну.

Я пытаюсь перебрать массив, изменить некоторые значения, удалить некоторые и т. Д. И т. Д.

Я думаю, потому что я использую такие вещи, как

    find_best = original_array.select{|h| h[:score]>15}

Я заканчиваю новым массивом совпадений, а не набором указателей на исходный массив.

Поэтому, когда я говорю (в качестве примера)

   find_best.each do |something|
            #manipulate somehow
   end

Эти изменения не отражаются в original_array.

Я думаю, я мог бы merge find_best в original_array, хотя я не совсем уверен, как это сделать, или это правильно.

Самая большая проблема, с которой я сталкиваюсь, это когда я говорю

 while find_best.length>0
       #do some stuff that recalculates find_best
        find_best = original_array.select{|h| h[:score]>15} #so I'm resetting the loop for find_best and exit if all the work is done. 
 end

Ответы [ 2 ]

3 голосов
/ 05 марта 2012

Как уже отмечал Никлас в комментарии, select, map и другие создают новые массивы, но содержат сами объекты из исходного массива, а не их копии.

Обратите внимание:

a = [{foo: 1, bar: 'a'}, {foo: 3, bar: 'b'}, {foo: 2, bar: 'c'}]
#=> [{:foo=>1, :bar=>"a"}, {:foo=>3, :bar=>"b"}, {:foo=>2, :bar=>"c"}]
a.max_by{|e| e[:foo]}[:bar] = 'GOTCHA!'
a
#=> [{:foo=>1, :bar=>"a"}, {:foo=>3, :bar=>"GOTCHA!"}, {:foo=>2, :bar=>"c"}]

См? Элемент исходного массива был изменен.

2 голосов
/ 05 марта 2012

То, что вам нужно, это delete_if или delete перечисление Ruby.

Вот пример:

ruby > jasdeep = {:a => 123, :b => 999, :c => 1, :d => 12, :e => 6}
 => {:a=>123, :b=>999, :c=>1, :d=>12, :e=>6} 
ruby > jasdeep.class
 => Hash 
ruby > jasdeep.delete_if {|key, val| val < 15 }
 => {:a=>123, :b=>999} 
ruby > jasdeep
 => {:a=>123, :b=>999} 

Здесь мы модифицируем оригинальный хэш, я надеюсь, что это решит вашвопрос.

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