如何选择性地传递可选参数?

Den*_*low 7 dart

是否有一种更简单(更清洁)的方法将可选参数从一个函数传递到另一个函数而不是这样做:

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更简单的东西.

我有一些代码使用第一个答案中提出的解决方案(传播命名可选参数的默认值,但我无法检查该值是否由初始调用者提供).

mun*_*ent 9

我被Dart的这个角落烧了好几次.我鼓励任何人采用的现行指南是:

  1. 不要使用默认值.相反,使用隐式默认值null并在函数体中检查它.记录null传递后将使用的值.
  2. 不要使用?参数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代码,我真的鼓励您?完全避免默认值.您的用户会感谢您的支持.