【问题标题】:Ruby stop and move to next iteration of for loopRuby 停止并移动到 for 循环的下一次迭代
【发布时间】:2013-03-18 13:14:17
【问题描述】:

我有一个内部带有 if elsif 语句的 for 循环。在第一个 if 中,如果满足条件,我希望它停在那里并继续循环的下一次迭代。

这是我正在尝试做的一个非常简化的版本:

array = [1,2,3,4,"x"]
for i in 0..(array.count -1)
    if array[i] == "x"
        #start next for loop iteration without executing the elsif
    elsif array[i] < 3
        puts "YAY!"
    end
end

我真正想做的是遍历一个数组,其中除了一个元素之外的所有元素都是整数,但其中一个是字符串。在字符串元素上,我需要循环(无论哪种最好)来跳过其余代码并进入循环的下一次迭代。这很重要,因为第二个 if 语句使用 'array_element

所以我想要 arr[x][3] 这是我尝试过的,但它给了我 8 8 8 8 而不是单个 8。

arr = [[1,2,3,"4"], [5,6,7,8], [9,10,11,12]] 

    arr.each{|x| 
    x.each {|i| 
        next if x[3].instance_of? String 
        if x[3] < 12 puts x[3] 
        end 
} 
}

好的,这行得通!谢谢iAmRubuuu!!

arr = [1,2,3,"4"], [5,6,7,8], [9,10,11,12], [13,14,15,"16"], [17,18,19,20]]

arr.each_with_index{|x, i| 

    next if x.last.instance_of? String

    if x.last < 21
    puts x.last
    end
}

给我输出

8
12
20

【问题讨论】:

  • 编辑过的原始问题
  • 我已经添加了一个答案,希望对您有所帮助。
  • 我已经给你答案了,试着去理解,好好做事。
  • 是的 iAmRubuuu 非常感谢您的帮助!我的程序现在进展顺利。再次感谢

标签: ruby loops for-loop escaping iteration


【解决方案1】:

不要使用for in,使用each

(0..10).each do |i|
  next if i == 5

  if i == 10
    puts "YAY!"
  end
end

【讨论】:

  • 啊,好吧,所以“下一个”是说如果满足条件则继续进行下一次迭代?你认为你可以一步一步地向我解释你的代码在做什么吗?
  • 实际上这段代码给了我和以前一样的错误......让我准确解释一下我想要做什么。我正在遍历一个数组,其中除了一个元素之外的所有元素都是整数,但其中一个是字符串。在字符串元素上,我需要循环(无论哪种最好)来跳过其余代码并进入循环的下一次迭代。这很重要,因为第二个 if 语句使用 'array_element
  • @kingweaver88:你想跳过字符串吗?使用这个:next if i.is_a?(String)
【解决方案2】:

根据您的编辑,希望以下是您正在寻找的:

arr = [1, 2, 3, "11", 11]
arr.each do |x|
  next if x.instance_of? String
  puts "#{x} is #{x.class}"
end

输出:

1 is Fixnum
2 is Fixnum
3 is Fixnum
11 is Fixnum

编辑

代码:

arr = [[1,2,3,"4"], [4,5,6,7], [8,9,10,11]] 

arr.each{|x|
x.each{ |i|
next if i.instance_of? String
puts "#{i} is #{i.class}"
}
}

输出:

1 is Fixnum
2 is Fixnum
3 is Fixnum
4 is Fixnum
5 is Fixnum
6 is Fixnum
7 is Fixnum
8 is Fixnum
9 is Fixnum
10 is Fixnum
11 is Fixnum

V_1(来自您在我的回答帖子中的第一条评论)

arr = [[1,2,3,"4"], [4,5,6,7], [8,9,10,11]] 
puts arr[1].last,arr.last.last

输出:

7
11

V_2(来自您在我的回答帖子中的第一条评论)

arr = [[1,2,3,"4"], [4,5,6,7], [8,9,10,11]] 
arr.each_with_index{ |x,i|
next if i == 0
#p x,i
p "last element of inner array:#{x.last}"
}

输出:

"last element of inner array:7"
"last element of inner array:11"

【讨论】:

  • 好吧,让我把事情复杂一点,看看这将如何扩展以满足我的目的。假设您有一个数组数组,那么如果 arr = [[1,2,3,"4"], [4,5,6,7], [8,9,10,11]] 我想迭代 arr[x][3] --> 输出应该是 7 11,我该怎么做?
  • hmm 我明白你在这里做了什么,除了你正在遍历每个元素。如果我只想要每个内部数组中的第 4 个元素,这会起作用吗?所以我想要 arr[x][3] 这是我尝试过的,但它给了我 8 8 8 8 而不是单个 8.arr = [[1,2,3,"4"], [5,6, 7,8], [9,10,11,12]] arr.each{|x| x.each {|i|下一个 if x[3].instance_of?字符串 if x[3]
  • 好的,您的第 2 版解决方案可以满足我的需要...但是我对那里发生的事情有点困惑,您介意解释一下 .each_with_index 发生了什么吗?在我的实际代码中,字符串可能会在内部数组中随机弹出,它并不总是索引为 0 的数组......我该怎么做?
  • 我尝试将 i == 0 替换为 i.instance_of? String 但我收到错误 `
  • 啊,如果我使用 x.last.instance_of?字符串代替 i == 0 然后就可以了!!非常感谢您的帮助!!
猜你喜欢
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 2016-02-25
  • 1970-01-01
相关资源
最近更新 更多