【问题标题】:How to use **kwarg in Dart (like in Python)如何在 Dart 中使用 **kwarg(就像在 Python 中一样)
【发布时间】:2021-09-14 07:35:37
【问题描述】:

我有一个关于如何在 Dart 中轻松使用 map 作为参数的问题。是否有任何简单的方法可以将映射对象的所有键值对传递给函数?

例如,我有一个地图和一个这样的函数:

const testMap = {"a": 1, "b":2};

int testFunc(a, b){
  return a + b;
}

我想像这样使用它们:

testFunct(**testMap) // not possible in dart (though possible in python)

结果应该是3。

有这样的智能解决方案吗?谢谢!


请注意**是在字典中传递参数的python方式:docs

【问题讨论】:

    标签: dart


    【解决方案1】:

    这不是你写它的直接可能的方式,但你可以使用Function.apply做类似的事情。

    您必须将参数作为位置传递,然后您需要知道顺序:

    const testMap = {"a": 1, "b":2};
    
    int testFunc(a, b){
      return a + b;
    }
    
    void main() {
      print(Function.apply(testFunc, testMap.values.toList()));
    }
    
    

    或者你必须使用命名的参数然后映射键应该是符号:

    const testMap = {#a: 1, #b:2};
    
    int testFunc({required int a, required int b}){
      return a + b;
    }
    
    void main() {
      print(Function.apply(testFunc, [], testMap));
    }
    

    Dart 区分位置参数和命名参数,所以如果你想通过名字来引用一个参数,它应该是命名的。

    前一种方法很危险,因为您不使用地图的名称。它应该只是const testArguments = [1, 2];,而不是包含对您没有帮助的地图。

    使用Function.apply 不是类型安全的。它与使用 dynamic 或 Function 类型调用某些东西一样类型安全——这意味着根本不安全——因此请谨慎使用,仅在必要时使用。

    【讨论】:

    • 很好的答案!顺便说一句,这可能有点离题,但是尖号 (#) 的作用是什么?它是双引号字符串的缩写吗?我搜索了 dart 文档,但无法轻松找到它。谢谢!
    • 像#foo 这样的符号文字 是一种创建代表源名称foo 的Symbol 对象的方法。它是运行时系统用来表示源名称的一种特殊对象,通常在Function.apply、Invocation 中提供给noSuchMethod 和dart:mirrors。使用Symbol 而不是String 来保存名称允许Web 编译器将变量重命名为更短的名称(最小化)以减少程序的下载大小,而不会破坏Function.apply 和noSuchMethod。 #foo 与 const Symbol("foo") 相同。
    猜你喜欢
    • 2023-01-25
    • 2019-03-13
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 2011-02-27
    • 1970-01-01
    相关资源
    最近更新 更多