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

时间:2013-01-30 20:19:48

标签: 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}) {
   ...
}

我真正想要的是:

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更多的东西。

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

2 个答案:

答案 0 :(得分:8)

我被Dart的这个角落烧了好几次。我目前的指导方针,我鼓励任何人采用:

  1. 不要使用默认值。而是使用隐式默认值null,并在函数体中检查它。记录传递null时将使用的值。
  2. 请勿使用?参数测试运算符。而是仅测试null
  3. 这不会传递参数并显式传递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,这似乎是一个很好的替代品而不知道该函数的用途是什么