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

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;
            }
        }
    }
}

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

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

    end
  end
end

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

3
thegreenhoodie 30 Мар 2020 в 14:03
1
Почему бы не что-то вроде break if discarded внутри вашей итерации?
 – 
Marek Lipka
30 Мар 2020 в 14:05
3
Вместо того, чтобы пытаться переводить это объявление построчно, тщательно подумайте о том, чего функция на самом деле пытается достичь. Ruby — очень лаконичный и элегантный язык; вы, вероятно, можете написать эту уродливую java в части кода, используя ruby.
 – 
Tom Lord
30 Мар 2020 в 14:08
1
Как насчет этого: discarded = false; @weapons.delete_if { |weapon| discarded = true if !discarded && weapon.type == w.type }
 – 
Tom Lord
30 Мар 2020 в 14:13
Если найдена функция myArray.delete_at(myArray.index(n) || myArray.length), кажется, что она может помочь. Спасибо вам обоим!
 – 
thegreenhoodie
30 Мар 2020 в 14:16

1 ответ

Я не уверен, правильно ли я прочитал ваш 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 
4
spickermann 30 Мар 2020 в 14:22