ruby delete_at tune up - PullRequest
       1

ruby delete_at tune up

0 голосов
/ 22 апреля 2011

У меня есть рабочий код, но он мне не нравится, он мне очень не нравится.У меня есть две разные коллекции, и я хочу удалить элементы с соответствующими ключами из одной коллекции.Я «выбрал», что пользователь выбрал из «выбора».Поэтому я хочу отображать «варианты», которые еще не выбраны.Вот код:

@picked.each do |p|
  i = 0
  @choices.each do |c|
    if p.choices_id == c.id 
      @choices.delete_at(i)
      break
    end
    i += 1
  end
end

end

Мне не нравится переменная "i", в частности.Просто подумал, что увижу, что другие могут сделать с этим.

Ответы [ 3 ]

2 голосов
/ 22 апреля 2011
@choices.reject! { |c| @picked.index { |p| p.choices_id == c.id } }
2 голосов
/ 22 апреля 2011

each_with_index и with_index для Ruby 1.9 +

И улучшения для вашего кода

choices_ids = @picked.map(&:choices_id)
@choices.delete_if{ |c| choices_ids.include? c.id }

api: delete_if

UPD

Также вы всегда можете просто позвонить по этому номеру:

@choices - @picked.map(&:choices).flatten

или

@choices -= @picked.map(&:choices).flatten
0 голосов
/ 23 апреля 2011

Ruby поддерживает пересечение и разность для множеств:

picked  = %w[1 2 3]
choices = %w[1 2 3 4 5]

choices - picked # => ["4", "5"]

EDIT:

class Pick
  attr_reader :choices_id
  def initialize(id)
    @choices_id = id
  end
end

class Choice
  attr_reader :id
  def initialize(id)
    @id = id
  end
end

# cobble up some collections of objects 
picked = %w[1 2 3].map{ |p| Pick.new(p) }
choices = %w[ 1 2 3 4 5].map{ |c| Choice.new(c) }

choices.map{ |c| c.id } - picked.map{ |p| p.choices_id } # => ["4", "5"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...