代码之家  ›  专栏  ›  技术社区  ›  ryanprayogo

是否有类似于Java/C++上的for循环的Ruby版本?

  •  9
  • ryanprayogo  · 技术社区  · 15 年前

    是否有类似于Java/C(++)中的for循环的Ruby版本?

    for (int i=0; i<1000; i++) {
        // do stuff
    }
    

    原因是我需要根据迭代的索引执行不同的操作。看起来Ruby的每个循环只有一个for?

    我说得对吗?

    9 回复  |  直到 15 年前
        1
  •  12
  •   nas    15 年前

    是的,您可以将每个_与_索引一起使用

    collection = ["element1", "element2"]
    collection.each_with_index {|item,index| puts item; puts index}
    

    “index”变量在每次迭代期间为您提供元素索引

        2
  •  15
  •   FMc TLP    15 年前

    Ruby倾向于使用迭代器而不是循环;您可以使用Ruby强大的迭代器获得所有循环函数。

    有几种选择,假设您有一个大小为1000的数组“arr”。

    1000.times {|i| puts arr[i]}
    0.upto(arr.size-1){|i| puts arr[i]}
    arr.each_index {|i| puts arr[i]}
    arr.each_with_index {|e,i| puts e} #i is the index of element e in arr
    

    所有这些示例都提供相同的功能

        3
  •  11
  •   AndyG    7 年前

    怎么样 step

    0.step(1000,2) { |i| puts i }
    

    相当于:

    for (int i=0; i<=1000; i=i+2) {
        // do stuff
    }
    
        4
  •  6
  •   Munish    12 年前

    只要条件为true,while循环就会执行其主体零次或多次。

    while <condition>
        # do this
    end
    

    for (initialization;, condition;, incrementation;){
        //code 
    }
    

    initialization;
    for(, condition;, ) {
        //code
        incrementation;
    }
    

    initialization;
    while(condition)
        # code
        incrementation;
    end 
    

    注意,“while”(和“until”和“for”)循环没有引入新的作用域;以前存在的局部变量可以在循环中使用,之后创建的新局部变量将可用。

        5
  •  5
  •   erik    15 年前

    在Ruby中 for 循环可以实现为:

    1000.times do |i|
      # do stuff ...
    end
    

    each_with_index 语法可能是最好的:

    collection.each_with_index do |element, index|
      # do stuff ...
    end
    

    然而 循环速度较慢,因为它同时提供 element index 循环每次迭代的对象。

        6
  •  2
  •   Sagiv Ofek    11 年前
    for i in 0..100 do
      #bla bla
    end
    
        7
  •  1
  •   Waseem    15 年前
        8
  •  1
  •   TK.    15 年前

    times each_with_index . 大约快6倍。运行下面的代码。

    require "benchmark"
    
    TESTS = 10_000_000
    array = (1..TESTS).map { rand }
    Benchmark.bmbm do |results|
      results.report("times") do
        TESTS.times do |i|
          # do nothing
        end
      end
    
      results.report("each_with_index") do
        array.each_with_index do |element, index|
          # Do nothing
        end
      end
    end
    

    Rehearsal ---------------------------------------------------
    times             1.130000   0.000000   1.130000 (  1.141054)
    each_with_index   7.550000   0.210000   7.760000 (  7.856737)
    ------------------------------------------ total: 8.890000sec
    
                          user     system      total        real
    times             1.090000   0.000000   1.090000 (  1.099561)
    each_with_index   7.600000   0.200000   7.800000 (  7.888901)
    
        9
  •  1
  •   horseyguy    15 年前

    当我只需要数字(不想重复)时,我更喜欢这样:

    (0..10000).each do |v|
        puts v
    end