我想遍历不同的 ruby 数组(可能还有散列)。我真的不想维护一个索引来跟踪我在每个数组中的位置。不是因为我懒,而是我习惯了 C++ 的迭代器使用方式,我认为这种方式更不容易出错。
那么有没有办法在 ruby 中获取迭代器,就像我们在 c++ 中所做的那样(这个例子并没有做太多,但它只是为了例子):
std::set< MyObject >::iterator iter1 = set1.begin();
std::set< MyObject >::iterator iter2 = set2.begin();
while(iter1 != set1.end() && iter2 != set2.end()
{
if (iter1->timestamp > iter2->timestamp)
++iter2;
else
++iter1;
}
最佳答案
Enumerable 方法仅在您提供 block 时进行迭代,否则返回 an iterator这类似于 C++ 的。例如,在 irb
中:
>> e = [1,2,3,4].each
=> #<Enumerator: [1, 2, 3, 4]:each>
>> e.next
=> 1
棘手的是 .next
与 C++ 中的 e++
非常相似,因为它返回当前值并递增迭代器。有一个 .rewind
方法,但它会将迭代器重置到开头,而不是只返回一步。
我不知道有什么方便的方法来检测迭代器的结束(除了捕获 StopIteration
异常)或确定迭代器有多大。
大概,您应该获取迭代器,将其传递给某个方法,然后该方法执行 iter.each { |x| something_interesting(x) }
某种。
因此,虽然有迭代器,但您不能真正将 C++ 直接音译为 Ruby。 OTOH,你不应该将你的 C++ 音译成 Ruby,你应该用 Ruby 编写 Ruby,用 C++ 编写 C++。
关于c++ - Ruby C++ 风格的迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5375126/