Ruby条件与迭代器使用:Java转Ruby代码的循环实现疑问
解决Ruby中遍历集合并删除首个匹配元素的问题
嘿,我来帮你搞定这个Java转Ruby的问题!你的Java代码核心逻辑是:遍历武器集合,找到第一个和传入武器的类型匹配的元素,删除它后立刻停止遍历。在Ruby里我们可以用更简洁的方式实现,同时要避开遍历中直接修改集合可能引发的异常,下面给你几种可行方案:
方案1:用find_index定位后删除(最简洁)
这种方式先找到第一个匹配元素的索引,再通过索引删除,逻辑清晰且符合Ruby风格:
def discard_weapon(w) # 如果集合为空直接返回,省去冗余判断 return if @weapons.empty? # 找到第一个匹配武器类型的元素索引 match_index = @weapons.find_index { |wtaux| wtaux == w.weapon_type } # 如果找到匹配项,删除对应索引的元素 @weapons.delete_at(match_index) if match_index end
方案2:用each_with_index遍历+手动控制停止
这个方案最贴近你原来Java代码的逻辑,通过标志位控制遍历停止,同时用索引删除元素避免遍历异常:
def discard_weapon(w) return if @weapons.empty? discarded = false @weapons.each_with_index do |wtaux, index| # 已经找到并删除的话,直接跳过后续循环 next if discarded if wtaux == w.weapon_type @weapons.delete_at(index) discarded = true end end end
方案3:用delete_if配合标志位(Ruby化的遍历删除)
delete_if是Ruby专门用来删除集合中符合条件元素的方法,我们可以加一个标志位让它只删除第一个匹配项:
def discard_weapon(w) return if @weapons.empty? discarded = false @weapons.delete_if do |wtaux| # 已经删除过的话,不再匹配后续元素 next false if discarded # 判断当前元素是否匹配目标类型 is_match = wtaux == w.weapon_type # 如果匹配,标记为已删除,后续不再处理 discarded = true if is_match is_match end end
额外提示:Ruby命名规范
Ruby社区通常使用蛇形命名法,所以建议把方法名从discardWeapon改成discard_weapon,属性获取从w.getWeaponType()改成w.weapon_type(你需要在Weapon类里用attr_reader :weapon_type来暴露这个属性哦)。
内容的提问来源于stack exchange,提问作者thegreenhoodie
相关产品推荐
相关产品推荐

