是否有一种更简单(更清洁)的方法将可选参数从一个函数传递到另一个函数而不是这样做:
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}) {
...
}
Run Code Online (Sandbox Code Playgroud)
我真正想要的是:
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])
Run Code Online (Sandbox Code Playgroud)
至少我没有得到位置可选参数的组合爆炸,但我仍然希望有一些比if-else更简单的东西.
我有一些代码使用第一个答案中提出的解决方案(传播命名可选参数的默认值,但我无法检查该值是否由初始调用者提供).
我被Dart的这个角落烧了好几次.我鼓励任何人采用的现行指南是:
null
并在函数体中检查它.记录null
传递后将使用的值.?
参数test运算符.相反,只是测试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;
...
}
Run Code Online (Sandbox Code Playgroud)
我认为这种模式更清晰,更容易维护,使用默认值,并避免在需要前进时令人讨厌的组合爆炸.当您覆盖方法或使用可选参数实现接口时,它还可以避免重复默认值.
然而,Dart世界的一个角落不起作用:DOM.该?
运算符专门用于解决这样一个事实:有一些JavaScript DOM方法,其中传递null
与传递不同undefined
(即不传递任何东西).
如果你试图在Dart中转发一个内部使用的DOM方法,?
那么你将不得不处理组合爆炸.我个人希望我们可以修复这些API.
但是,如果您只是编写自己的Dart代码,我真的鼓励您?
完全避免默认值.您的用户会感谢您的支持.
归档时间: |
|
查看次数: |
1509 次 |
最近记录: |