代码之家  ›  专栏  ›  技术社区  ›  Asher postmodern

Ruby枚举器-为什么要异常结束?

  •  7
  • Asher postmodern  · 技术社区  · 14 年前

    在Ruby中迭代一个块就足够简单了——它完成得很干净,然后继续执行其余的代码。

    另一方面,使用枚举器进行迭代会更加混乱。如果调用:每个都不带块,则返回枚举器。:然后可以在枚举器上调用Next以获取每个下一个迭代值。

    然后是奇怪的部分——当迭代完成时,它抛出一个异常:“迭代在结束时到达”。结果是它甚至不返回值。

    例如:

    test = [ 'test_value' ]
    enumerator = test.each
    enumerator.next
    >> "test_value"
    enumerator.next
    >> StopIteration: iteration reached at end
    

    这是因为枚举器可以返回nil值吗?答案只有在我发布这篇文章的时候才会出现(所以我还是要发布它),但看起来情况肯定是这样的。

    如果是这样,这是处理此类问题的典型方法吗?使用异常处理基本上按预期执行的代码似乎很奇怪。

    2 回复  |  直到 11 年前
        1
  •  7
  •   mikej heading_to_tahiti    14 年前

    你是正确的,原因是 nil 枚举器不能作为有效值返回。为了回答这是否是典型的问题,Python使用同样的方法处理它,并使用一个名为 StopIteration .

    >>> my_list = [1,2,3]
    >>> i = iter(my_list)
    >>> i.next()
    1
    >>> i.next()
    2
    >>> i.next()
    3
    >>> i.next()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration
    

    当然,大多数时候 next 不是直接呼叫的( each 或A for 相反,使用循环),因此这种底层机制不会经常公开。

        2
  •  4
  •   Jon Smock    14 年前

    是的,nil仍然是一个结果,这与没有返回值不同。它基本上和访问内存中不存在的变量或位置相同。这就是为什么你想要一个例外而不是返回一个零。听上去你是这么想的:—)

    推荐文章