【问题标题】:Haxe construct to mimic PHP list() = each() in Haxe 2.10Haxe 构造以模仿 Haxe 2.10 中的 PHP list() = each()
【发布时间】:2014-08-18 17:11:37
【问题描述】:

您可能知道某些语言中的这种结构,例如 PHP 和 Perl:

var $a = ["Apple", "Banana", "Pear", "Orange"];
list($p1, $p2, $p3, $p4) = each($a);
echo $p1;  // Apple
echo $p2;  // Banana
echo $p3;  // Pear
echo $p4;  // Orange

它通常用于 while 循环,例如while (list($key, $val) = each($fruit)) echo "$key: $val;"。但不仅在循环中。

在一行中,您可以影响来自数据库中一行的不同列的两个或三个变量,或者像上面的示例一样从数组中获取标量值。

它的另一种用法是与拆分结合使用,尤其是在脚本中:

list($a, $b, $c) = split("/", "papa/tango/charlie");    // this is PHP code again.

是否有可能使用 Haxe 实现这一目标或类似的目标?

例如,假设 with 有一个静态函数 assignTo(可能是一个宏),我们可以想象这样的用法:

using ArrExt;

class Test {
    public static function main() {
        [13, "Bobby Fisher", "USA"].assignTo(age, name, country);  // macro would *define* those vars, no declaration needed
        trace(age);
        trace(name);
        trace(country);
    }
}

我更多的是寻找 Haxe 2.10 解决方案,但欢迎使用 Haxe 3 解决方案,因此它对每个人都有用。

【问题讨论】:

  • 如果可能的话,需要使用宏来完成。我不知道任何预先存在的,尽管 Nadako 有一个看起来很接近:github.com/nadako/haxe-thingies#unpack
  • 我试过了,但看起来你必须使用构建宏,这意味着你需要任何使用它的类来拥有“实现 ArrUnpacker”,而不是“使用 ArrExt”在要使用语法的每个类上处理代码。所以这是可能的,但在这一点上,IMO 付出的努力多于其价值。
  • 出于好奇,这是因为我们写的是using吗?如果我们改为写ArrExt.assignTo([13, "Bobby Fischer", "USA"], age, name, country); 会怎样?我也想试一试,但我害怕在我的机器上并行安装 Haxe 3 可能会破坏任何东西,而在 Haxe 2 中编写它超出了我对其宏系统的理解。
  • 我可能做错了什么,但是无论是显式调用宏,还是通过“使用”,我都遇到了unknown identifier age 错误,尽管宏在代码 - 我猜编译器会在运行宏之前检查标识符?不过我可能做错了...在邮件列表中询问专家意见:)
  • 逻辑上宏“扩展”应该是第 1 步,然后是第 2 步检查标识符,作为编译传递的一部分。我的猜测是问题是宏在 block 内创建变量,即在 { ... } 内,然后就像在该块内创建一个局部变量,外部不可见。

标签: haxe


【解决方案1】:

该功能称为解构赋值,有时也称为解包。 除了编写宏函数,还有一种更简单的方法……使用模式匹配(在 Haxe 3 中)!

switch ["Apple", "Banana", "Pear", "Orange"] {
    case [p1, p2, p3, p4]:
        trace(p2); //"Banana"
}

它看起来不同,但功能上是一样的。

【讨论】:

  • 该死的,我从未见过。它可以与动态数组一起使用吗?我的意思是一个方法返回的数组,编译器在编译时不知道它的内容?
  • 是的,只要数组长度匹配,它就可以工作。
  • 有点奇怪但也很有趣。我会赞成的。
【解决方案2】:

list() 在赋值左侧是 PHP 语言结构,而不是函数(!)。如果haxe 语言不支持此功能,则无法使用。

【讨论】:

  • 我问是因为我想知道是否会出现任何原始答案。考虑到有些人设法使用宏来做些什么,我不知何故想知道这是否真的不可能。
  • 好的,当然。我不是 haxe 专家,只是想指出,list() 不是 lamda 函数。宏可能会起作用。请注意,我已经编辑了您的问题,因为在 PHP 中,list() 不能在 for 循环中使用(语法错误),但在 while 循环中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多