【发布时间】: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