c++ - Ruby C++ 风格的迭代器

标签 c++ ruby iterator

我想遍历不同的 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/

相关文章:

c++ - Visual Studio 2012 上的 OpenCV,缺少 MSVCP120D.dll

ruby-on-rails - 未定义方法 `parent' 为 nil :NilClass

ruby-on-rails - 模拟 rspec 中的错误/异常(不仅仅是它的类型)

c++ - 如何使用 BOOST_FOREACH 同时迭代两个 vector ?

c++ - GMock : How to return a fuction pointer defined by an EXPECT_CALL()

c++ - Unix/Linux C++ 的 SetConsoleCtrlHandler 等价物

ruby - 无法编译 ruby​​ 1.9.3

java - 寻找集合中的最小值

c++ - 如何遍历 map vector 中的 map ?

c++ - C++中使用前声明的规则是什么?