【问题标题】:Explain Ruby loops compared to Java与 Java 相比,解释 Ruby 循环
【发布时间】:2015-06-06 18:35:30
【问题描述】:

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

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

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

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

【问题讨论】:

  • Java 也有迭代器,所以这不应该让你大吃一惊,除非你对 Java 的理解不像你想象的那么扎实。
  • 似乎 Ruby 为您做了很多事情,而在 Java 中您必须自己做所有事情。我不习惯。
  • 这是一件好事。学会爱它。
  • each 是一种收集方法。它接收作为参数的blockdoend 之间的所有内容都是一个块。如each 文档中所述,Ruby 会将给定的块代码应用于每个集合项。在此块中,您可以为当前项目命名(在示例代码中,仅称为 item)。 Java 8 似乎有类似的方法使用Lambdas
  • 嗯,您将 for 循环与 foreach 循环混淆了

标签: java ruby arrays loops iteration


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    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开始)。

    示例:

    #!/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
    

    这里是调用:

    ./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
    

    【讨论】:

    • 所以我猜你可以使用 each_with_index 过滤 x,这样你就可以随心所欲地增加。
    • 是的,如果您希望遍历数组的子部分,最好对其进行过滤,然后对所需的项目运行each。例如:somearray.grep(/somepattern/).each{|item| process(item)}。但是,您可以像您建议的那样使用each_with_index 轻松过滤x 的值
    【解决方案3】:

    你所拥有的不是循环。它只是Array 类的一个方法,yields 每个项目依次成为一个块。

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

    List<Integer> odds = Arrays.asList(1, 3, 5, 7, 9 );
    
    odds.forEach(item -> {
      item *= 2;
      System.out.println(item);
    });
    

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

    class Array
      def each
        howmany = size
        i = -1
    
        while i+=1 < howmany
          yield self[i]
        end
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      相关资源
      最近更新 更多