与 Java 相比,解释 Ruby 循环

Explain Ruby loops compared to Java

在 Java 中,您必须指定要增加的值以及增加的数量。在 Ruby 中,您似乎可以将数组的每个值设置为某个随机变量并自动递增。这让我非常烦恼,因为即使我明白发生了什么,我也无法理解如何获得更好的控制。如果我想增加 2 或减少怎么办?这是来自 codecademy 的示例。

odds = [1,3,5,7,9]

# Add your code below!
odds.each do |item|
    item *= 2
    print item
end

我知道它是在遍历数组中的每个元素,但是项目来自哪里?你只是把它从天空中拉出来然后 ruby 将它初始化为你正在迭代的特定元素吗?另外,您如何指定要增加的方式?如果我只想要数组中的所有其他元素怎么办?

您提供的 Ruby 代码片段与此 Java 片段基本相同:

  int[] odds = {1, 3, 5, 7, 9};

  for(int item : odds) {
     item *= 2;
     System.out.println(item);
  }

Ruby 和 Java 都提供集合的迭代器。如果需要,它们还提供其他循环或迭代结构。

each 是一个 iterator 方法,它与代码 block 一起工作:它迭代数组中的项目(或字典),按照数组中给定的顺序,并一次传递一个迭代值。

item 设置为调用 each 方法的对象中的每个值。

一般语法是:

ARRAY.each do |var| CODE-USING-var end

ARRAY.each {|var| CODE-USING-var }

两种语法具有相同的含义。在较大的代码块上使用 do - end 对有一个约定,但这只是一个约定。

有一个名为 each_with_index 的相关方法,它在每次迭代时产生两个值:项目值和该项目在对象中的索引(从 0 开始)。

示例: <pre>#!/usr/bin/env ruby # words = %w( now is the time for all good men ) def show_words list puts "---" list.each_with_index do |word,x| puts "word #{x} = #{word}" end end show_words words show_words words.reverse show_words words.sort </pre>

调用如下:

./t2.rb
---
word 0 = now
word 1 = is
word 2 = the
word 3 = time
word 4 = for
word 5 = all
word 6 = good
word 7 = men
---
word 0 = men
word 1 = good
word 2 = all
word 3 = for
word 4 = time
word 5 = the
word 6 = is
word 7 = now
---
word 0 = all
word 1 = for
word 2 = good
word 3 = is
word 4 = men
word 5 = now
word 6 = the
word 7 = time

你那里没有循环。它只是 Array class 的一种方法,yield 将每个项目依次放入一个块中。

请注意,这与 Java 没有什么不同,事实上,完全 等同于 java.lang.Iterable.forEach:

List<Integer> odds = Arrays.asList(1, 3, 5, 7, 9 );

odds.forEach(item -> {
  item *= 2;
  System.out.println(item);
});

Ruby 中 Array#each 的实现看起来有点像这样:

class Array
  def each
    howmany = size
    i = -1

    while i+=1 < howmany
      yield self[i]
    end
  end
end