【问题标题】:How to access or iterate parameters in Dart如何在 Dart 中访问或迭代参数
【发布时间】:2014-09-14 12:51:06
【问题描述】:

在一个带有可选参数的函数中,我想打印所有传入的参数,不仅是值,还有每个参数的标识符。例如,下面是一个带有可选命名参数的函数。我使用地图实例打印出 arg 名称及其值,这就是我所需要的。

Map temp = new Map();

argumentTest({String a, String b, String c: "DDD"}){
  if (a != null) {
    temp.addAll({"a":a});
  }

  if (b != null) {
    temp.addAll({"b":b});
  }

  if (c != null) {
    temp.addAll({"c":c});
  }
}

void main() {
  argumentTest(a:"AAA");
  print('$temp'); //{a: AAA, c: DDD}

}   

虽然丑陋,但它有效。但是,有什么看起来像的吗?

Map temp = new Map();

argumentTest({String a, String b, String c: "DDD"}){
  arguments.forEach((arg) => temp.addAll({"arg": arg}));
}

void main() {
  argumentTest(a:"AAA");
  print('$temp'); //of course, not working.
}

永远感谢你们。

【问题讨论】:

  • 你可以使用反射库。
  • 实际上dart:mirrors 但我从未见过使用仅镜像字段和方法/函数来访问局部变量的方法。无法知道传递了哪些参数。您只能检查参数值是否为null 或您指定的默认值,但该值也可能已由调用方传递。

标签: arguments dart optional-parameters


【解决方案1】:

您可以简化解决方法

Map temp = new Map();

argumentTest({String a, String b, String c: "DDD"}) {
  ({'a': a, 'b': b, 'c': c}).forEach((k, v) {
    if(v != null) temp[k] = v;
  });
}

要支持不同于null 的默认值,您需要扩展一点 - 例如像

argumentTest({String a, String b, String c: "DDD"}) {
  ({
      'a': [a, null], 'b': [b, null], 'c': [c, "DDD"]
  }).forEach((k, v) {
    if(v[0] != v[1]) temp[k] = v[0];
  });
}

【讨论】:

  • 我进一步缩短了它。您应该注意,它不会检查 c 是否已通过,因为如果调用者省略了 c 的值,但您在解决方法中使用了相同的代码,则 c 将获得值。
  • 更加优雅。谢谢Zöchbauer 先生。但是,你能再解释一下第二个版本吗?
  • 如果调用者省略了参数,则为参数分配默认值(如果未指定默认值,则默认值为null)。我的第二个版本创建了一个映射,其参数名称为键,值为包含实际参数值和默认值的列表。 forEach 不只是与null 比较,而是检查参数值是否与默认值不同(v[0] 是实际值,v[1] 是默认值)。这有点麻烦,因为默认值必须维护两次 - 在参数列表和分配给映射的列表中。
  • 我明白了,第二个从正在创建的地图中删除了默认值。 :)
  • 第二个仅将这些参数添加到temp,其中实际值与默认值不同(我认为这是您问题中示例的意图)。当您尝试找出传递了哪些参数时,这是您可以获得的最接近的值 - 至少据我所知。
【解决方案2】:

在 Dart 中没有这样的东西。但是,如果你想为自动化测试构建模拟对象,你可以看看at this article,它展示了如何使用mock package

【讨论】:

    【解决方案3】:

    我不相信这是可能的(即使使用镜子)。您的变量的名称将在缩小期间更改。您拥有的“凌乱”编码器确实是以您可以访问的方式保存它们的唯一方法。

    【讨论】:

    • 缩小不会阻止反射,但镜像库不为此用例提供任何功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-21
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 2011-03-17
    • 1970-01-01
    相关资源
    最近更新 更多