Условные и итераторы в ruby - PullRequest
3 голосов
/ 30 марта 2020

Я пытаюсь перевести следующий код в ruby:

public void discardWeapon(Weapon w){
    if(!weapons.isEmpty()){
        boolean discarded = false;
        Iterator<WeaponType> it = weapons.iterator();   
        while(it.hasNext() && !discarded){
            WeaponType wtaux = it.next();
            if(wtaux == w.getWeaponType()){
                it.remove();
                discarded = true;
            }
        }
    }
}

Но когда дело доходит до l oop, я не могу найти практический способ сделать это в ruby. Пока у меня есть следующая структура:

def discardWeapon(w)
  if(!@weapons.empty?)
    discarded = false
    @weapons.each do |wtaux|

    end
  end
end

Но как я могу проверить, что мое условие выполняется при использовании итератора .each? Заранее спасибо.

1 Ответ

4 голосов
/ 30 марта 2020

Я не уверен, правильно ли я прочитал ваш код Java, но мне кажется, что у вас есть переменная экземпляра @weapons, которая содержит массив оружия, и вы хотите сбросить один экземпляр оружия w из этого списка.

def discard_weapon(weapon)
  index = @weapons.index(weapon)
  @weapons.delete_at(index) if index
end

Array#index возвращает индекс первого совпадения. И Array#delete_at удаляет элемент по индексу, когда был найден элемент.

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

def discard_weapon(weapon)
  @weapons.delete(weapon)
end 
...