草庐IT

Enumerators

全部标签

ruby - 为什么默认情况下 Ruby (2.0 +) 中的 Enumerators 不是惰性的?

为什么RubyEnumerator默认情况下不像Enumerator::Lazy那样?有没有人想要使用非惰性Enumerator的情况?已编辑:下面是对向后兼容性答案的评论,解释了为什么我还不相信:假设我们已将这些“重大”更改添加到Ruby2.0.0,这是一个主要版本,您将在进行切换之前彻底测试您的代码(特别是如果您要生产),不是吗?编辑#2我怀疑它与效率有关(如果有任何问题请告诉我),所以我做了以下基准测试:(当然有些地方惰性更好。这可能是为了证明为什么Ruby不是一直在使用lazy?)require'fruity'require'prime'comparedolazy{g=Prim

ruby - 枚举器如何在 Ruby 1.9.1 中工作?

这个问题不是关于如何在Ruby1.9.1中使用枚举器,而是我很好奇它们是如何工作的。这是一些代码:classBunkdefinitialize@h=[*1..100]enddefeachif!block_given?enum_for(:each)else0.upto(@h.length){|i|yield@h[i]}endendend在上面的代码中我可以使用e=Bunk.new.each,然后是e.next,e.next得到每个连续的元素,但它究竟是如何暂停执行然后在正确的位置恢复的?我知道如果将0.upto中的yield替换为Fiber.yield则很容易理解,但此处并非如此。这是一

ruby - 产生多个参数的链接枚举器

我正在尝试弄清楚Ruby如何处理产生多个参数的链式枚举器。看看这个片段:a=['a','b','c']a.each_with_index.select{|pr|ppr}#prints:#["a",0]#["b",1]#["c",2]a.each_with_index.map{|pr|ppr}#prints:#"a"#"b"#"c"为什么select将参数作为数组生成,而map将它们作为两个单独的参数生成? 最佳答案 尝试:a.each_with_index.map{|pr,last|p"pr:#{pr}last:#{last}"}m

c# - 为什么.NET 没有双向枚举器?

关于SO如何实现双向枚举器(here、here)已被问过几次。我的问题不是如何(这对大多数情况来说是微不足道的),而是为什么.NET平台中不存在这样的类型。publicinterfaceIBidirectionalEnumerator:IEnumerator{boolMovePrev();}显然,有许多集合类型无法实现这一点,因为MoveNext()具有破坏性或更改基础集合的状态。但相反,许多类型可以简单地实现这一点(List、IList、LinkedList、array).为什么不存在这样的类型? 最佳答案 当你设计一个框架时,你

c# - 什么是 C# 迭代器和生成器,我该如何使用它们

我是一名VB.Net开发人员,有点像C#的新手,在查看Iterators和Generators的C#文档时,无法完全理解其用法,我有任何人可以解释(在vb中有洞察力;如果可能的话) 最佳答案 迭代器是一种生成项目序列的简单方法,无需实现IEnumerable/IEnumerator你自己。迭代器是一种返回IEnumerable的方法您可以在foreach循环中枚举。这是一个简单的例子:publicIEnumerableGetNames(){yieldreturn"Joe";yieldreturn"Jack";yieldreturn"

c# - F# 屈服! operator - 实现和可能的 C# 等价物

我目前正在学习F#,我非常喜欢yield!(yield-bang)运算符。不仅因为它的名字,当然也因为它的作用。yield!运算符基本上允许您从序列表达式中产生序列的所有元素。这对于组合枚举器很有用。因为我经常遇到大而复杂的枚举器,所以我对我们可以用来将它们分解并由更简单的枚举器组合起来的策略很感兴趣。不幸的是,yield!运算符在C#中不可用。据我所知,它的作用类似于foreach(varxinsource)yieldx;但我正在阅读的书(Petricek'sRealWorldF#-Manning)表明它具有更好的性能......那么F#编译器在这里究竟做了什么?(是的,我也可以使用