是否有一种更简单(更清洁)的方法将可选参数从一个函数传递到另一个函数而不是这样做:
void optional1({num x, num y}) {
if (?x && ?y) {
optional2(x: x, y: y);
} else if (?x) {
optional2(x: x);
} else if (?y) {
optional2(y: y);
} else {
optional2();
}
}
void optional2({num x : 1, num y : 1}) {
...
}
我真正想要的是:
void drawImage(canvas_OR_image_OR_video, num sx_OR_x, num sy_OR_y, [num sw_OR_width, num height_OR_sh, num dx, num dy, num dw, num dh])
至少我没有得到位置可选参数的组合爆炸,但我仍然希望有一些比if-else更多的东西。
我有一些代码使用第一个答案中提出的解决方案(传播命名可选参数的默认值,但我无法检查该值是否由初始调用者提供)。
答案 0 :(得分:8)
我被Dart的这个角落烧了好几次。我目前的指导方针,我鼓励任何人采用:
null
,并在函数体中检查它。记录传递null
时将使用的值。?
参数测试运算符。而是仅测试null
。这不会传递参数并显式传递null
完全等价,这意味着您可以始终通过显式传递参数来转发。
所以上面会变成:
void optional1({num x, num y}) {
optional2(x: x, y: y);
}
/// [x] and [y] default to `1` if not passed.
void optional2({num x, num y}) {
if (x == null) x = 1;
if (y == null) y = 1;
...
}
我认为这种模式更清晰,更容易维护,使用默认值,并避免在需要前进时令人讨厌的组合爆炸。当您覆盖方法或使用可选参数实现接口时,它还可以避免重复默认值。
然而,Dart世界的一个角落不起作用:DOM。 ?
运算符专门用于解决这样一个事实:有些JavaScript DOM方法传递null
与传递undefined
不同(即不传递任何东西)。
如果你想在Dart中转发一个内部使用?
的DOM方法,那么你将不得不处理组合爆炸。我个人希望我们可以修复这些API。
但是如果您只是编写自己的Dart代码,我真的鼓励您完全避免默认值和?
。您的用户会感谢您。
答案 1 :(得分:0)
位置参数可以选择四种情况吗?
void optional([num x = 1, num y = 1]) {
}
由于您无论如何都使用默认参数调用optional2
,这似乎是一个很好的替代品而不知道该函数的用途是什么