与 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
在 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