【问题标题】:Conditional and iterators in rubyruby 中的条件和迭代器
【发布时间】:2020-03-30 11:03:52
【问题描述】:

我正在尝试将以下代码翻译成 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;
            }
        }
    }
}

但是,当谈到 while 循环时,我真的找不到在 ruby​​ 中执行此操作的实用方法。到目前为止,我有以下结构:

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

    end
  end
end

但是,我如何在使用 .each 迭代器时检查我的条件是否满足? 提前致谢。

【问题讨论】:

  • 为什么不在您的迭代中使用 break if discarded 之类的东西?
  • 与其尝试逐行逐字逐句翻译,不如仔细考虑函数实际上试图实现什么。 Ruby 是一门非常简洁优雅的语言;您可能可以使用 ruby​​ 用一小部分代码编写丑陋的 java。
  • 这个怎么样:discarded = false; @weapons.delete_if { |weapon| discarded = true if !discarded &amp;&amp; weapon.type == w.type }
  • 如果找到函数myArray.delete_at(myArray.index(n) || myArray.length),这似乎可以解决问题。谢谢你们!

标签: java arrays ruby iterator conditional-statements


【解决方案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 

【讨论】:

    猜你喜欢
    • 2021-12-05
    • 1970-01-01
    • 2020-09-09
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 2011-10-22
    • 2016-11-10
    相关资源
    最近更新 更多