如果我说的话
void simple({foo: true, bar: false}){
print('$foo $bar');
}
是否编译为
function simple(foo, bar) ...
或它是否转动命名参数,因此它只接受一个对象作为包含object.foo和object.bar的参数。我查看了它生成的dart.js,但看起来它正在从javascript编译程序的AST,这对我来说有些疯狂。
答案 0 :(得分:4)
经过一番研究,我发现,正如Günter Zöchbauer所说,我们已经做了很多优化。
但是,由于这种优化,编译器避免(正如我在实验中看到的那样)在可能的情况下传递对象。我认为是为了表现,但我不确定
因此,在大多数情况下,Named argment会直接传递,并在编译期间解析。
为了测试这个,我写了一个虚拟代码:
<强> dummy.dart 强>
import 'dart:math';
double calcFunc({int a, int b}) {
return (a * b / (a+b)) * (new Random().nextInt(100)) ;
}
String myFunc({int a: 0, int b: 0}) {
return "Numbers : ${a + calcFunc(a: a, b : b) * (new Random().nextInt(100))}";
}
void main() {
print("Func call: ${myFunc(a: 42, b: 24)}");
print("Func 2nd call: ${myFunc(a: 21)}");
}
和代码的结果JS(没有生成所有东西)
<强> dummy.dart.js 强>
["", "main.dart", , F, {
"^": "",
myFunc: function(a, b) {
var t1 = C.C__JSRandom.nextInt$1(100);
return "Numbers : " + (a + a * b / (a + b) * t1 * C.C__JSRandom.nextInt$1(100));
},
main: function() {
P.print("Func call: " + F.myFunc(42, 24));
P.print("Func 2nd call: " + F.myFunc(21, 0));
}
},
1],
]);
就像你在这里一样,参数中没有传递任何对象,但是它们被直接替换。