迭代器(不是迭代器)上的 Lambda 迭代

2024-01-29

我经常读到在迭代器上调用 Lambda 函数是不可能的。直到现在我也一直抱着这样的信念。然而,阅读 Franco Ponticelli 和 Lee-McColl-Sylvester 所著的《Professional Haxe》一书,了解如何使对象成为 Iterable 或 Iterator,这让我想到了一个似乎有效的技巧:至少在我刚刚测试的简单情况下是这样。

诀窍是简单地声明一个 iterator() 函数insideIterator 类,返回itself(是的,很奇怪,但不是那么不连贯)。

我不知道这在一般情况下是否有效,但是这个简单的示例在 Haxe 2 和 Haxe 3 上都可以编译并正常工作(http://try.haxe.org/#b764F http://try.haxe.org/#b764F):

using Lambda;

class IntIter2 {
    var min : Int;
    var max : Int;

    public inline function new( min : Int, max : Int ) {
        this.min = min;
        this.max = max;
    }

    public inline function hasNext() { return min < max; }
    public inline function next() { return min++; }

    // here goes the magic/weirdness/abomination
    public function iterator():IntIter2 { return this; }
}

class Test {
    public static function main() {
        var evenNumbers = new IntIter2(3, 10)
            .filter( function (n:Int):Bool return n % 2 == 0 )
            .list()  // unneeded, in fact...
        ; 
        trace(evenNumbers.toString());      
        // list even numbers in the series, ie {4, 6, 8}
    }
}

为什么它有效(至少在这里)

“在 haXe 标准库中,定义了两个非常常用的 typedef:Iterator 和 Iterable。

它们的定义如下:

typedef Iterator<T> = { 
    function hasNext() : Bool; 
    function next() : T;
}
typedef Iterable<T> = {
    function iterator() : Iterator<T>; 
}

” - Haxe Professional 由 Franco Ponticelli 和 Lee-McColl-Sylvester 设计

因此,将 iterator() 添加到 Iterator 类使其成为可迭代的,并可与 Lambda 函数一起使用。或者事情总是这么简单?


在 Haxe 存储库上查看这个(开放的)问题:

Lambda 应该支持 Iterator 以及 Iterable #1914 https://github.com/HaxeFoundation/haxe/issues/1914

线程中的最后评论实际上是您所建议的 - 它可以工作,但是更改“迭代器”的定义以使每个迭代器本身都是“可迭代的”是一个重大更改,并且在 Haxe 3 期间不太可能更改.也许适用于 Haxe 4 :)

另一个选项是使用允许隐式转换的抽象来创建可与 Iterable 和 Iterator 一起使用的类型“Iter”:

abstract Iter<T>(Iterator<T>) from Iterator<T> to Iterator<T> {
  inline function new(it:Iterator<T>)
    this = it;

  @:from static public inline function fromIterable(it:Iterable<T>) {
    return new Iter(it.iterator());
  } 
}

我在该问题的评论中写到了这一点:https://github.com/HaxeFoundation/haxe/issues/1914#issuecomment-19380450 https://github.com/HaxeFoundation/haxe/issues/1914#issuecomment-19380450

您可以使用 Iter 创建您自己的自定义 Lambda 助手,该助手可与 Iterable 和 Iterator 配合使用。

祝你好运 :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

迭代器(不是迭代器)上的 Lambda 迭代 的相关文章

随机推荐

  • 命名约定(单数或复数名称类)

    我有一个class对商店进行建模 所以它具有以下属性 name 描述 address phone etc 我应该命名它吗ShopInfo or 商店信息 任何链接到命名约定 如果你有一个类的对象 它只是信息for one店铺 该对象描述了一
  • iOS Swift:从 CNContactProperty 中获取用户选择的电话号码作为字符串[重复]

    这个问题在这里已经有答案了 正如标题所示 在我使用 swift 的 iOS 应用程序中 我有一个 CNContactProperty 对象 我想从中提取电话号码作为字符串 用户从中选择联系人后 CNContact 属性通过委托协议函数从标准
  • 我该如何清理这个 lambda?

    我有一个在多个 LINQ 查询中多次使用的表达式 因此我将其分离到它自己的返回该表达式的方法中 该函数的 lambda 部分看起来有点混乱 有人想尝试重构它并使其更具可读性和 或更小吗 private Expression
  • 使用不同的替换顺序替换字符串中与单个模式匹配的多个位置

    Using stringr包中 很容易以矢量化方式执行正则表达式替换 问题 我该如何执行以下操作 替换中的每个单词 hello world your make world hello pos 不同的替代品 例如数量不断增加 1 2 3 4
  • Eclipse RCP 4 与 NetBeans Platform 8 对比:选择什么?

    我即将为我的公司启动一个相当大的应用程序 由于它必须是跨平台的 我们指向 Java 本来会喜欢 C 但探索了 Xamarin 生态系统 而 Mac 部分似乎远远落后于休息包 现在 我正在将 Netbeans 8 和 Eclipse 4 作为
  • 如何通过蓝牙 android 发送/接收字符串到另一部 android 手机

    在我的 Android 应用程序中 我想通过蓝牙将字符串从一台设备发送到另一台设备 可用设备显示在列表视图中 我想在不配对的情况下发送字符串 我无法在设备之间建立连接 任何人都可以帮助我建立连接并发送字符串 我有很多示例 但无法弄清楚文件传
  • 如何在 emacs 艺术家模式下在矩形内写入文本?

    我正在 emacs 中学习艺术家模式 发现它非常有趣 我想创建形状并在其中写入文本 就像我们可以使用其他可以绘制形状的软件一样 但是 当我在矩形内键入一些字符时 形状会变形 垂直线会移动一些字符 Please see attached im
  • zend smtp 邮件在 100 多封邮件后崩溃

    在发送新闻通讯类的邮件时 我遇到了这个奇怪的问题 在 for 循环中 我循环访问数据库中的所有用户 并尝试向他们发送一封包含一些基本信息的 HTML 邮件 现在的问题是 前 200 封左右的邮件运行良好 但随后脚本崩溃并给出以下错误 War
  • 使用 NSDate() 快速创建未来日期

    我收到错误 调用中缺少参数 编码器 的参数 以下代码 var components NSDateComponents components setValue 1 forComponent NSCalendarUnit CalendarUni
  • Pygame 事件队列

    我想知道是否有一种使用方法poll or get 而不从队列中删除事件 在我的游戏中 我检查不同位置的输入 不仅在主循环中 有时我需要在不同位置检查相同的事件 但是当我检查它时 它会将其从队列中删除 我尝试使用peek 但问题是我无法获得与
  • Zend ACL 动态断言

    我想限制我的用户只能编辑 删除他们添加的评论 我在 youtube 上找到了一个名为 intergral30 的人的示例 并按照他的指示进行操作 现在我的管理员帐户可以编辑 删除所有内容 但我的用户无权访问他自己的评论 这是代码 资源 cl
  • .h 文件有什么意义?

    我知道 h 文件应该有 类声明 函数原型 和外部变量 对于全局变量 但让它成为一个有什么意义吗 h文件 我尝试重命名我的 h文件到一个 c文件 它仍然有效 We can name our file to be anything but we
  • 为什么我不需要引用“System.dll”来使用“System”命名空间?

    我正在处理指定 不要使用任何外部库 的作业 所以我创建了一个 C 应用程序 我做的第一件事就是默认删除所有 dll 的引用 包括 System dll 但是 我仍然可以将其添加到我的代码中 using System using System
  • PostgreSQL全文搜索和保留字,保留一些单词

    我正在使用 Postgresql 和英语字典进行完整的测试搜索 当我想接收带有一些英语单词的记录时 我得到了真实的结果 And so SELECT id FROM table1 WHERE ts vector1 to tsquery it
  • BlockingCollection(Of T) 的目的是什么

    我试图在 NET 4 上新的并行堆栈的上下文中理解 BlockingCollection 的用途 The MSDN http msdn microsoft com en us library dd267312 VS 100 aspx文档说
  • 迭代器(不是迭代器)上的 Lambda 迭代

    我经常读到在迭代器上调用 Lambda 函数是不可能的 直到现在我也一直抱着这样的信念 然而 阅读 Franco Ponticelli 和 Lee McColl Sylvester 所著的 Professional Haxe 一书 了解如何