【问题标题】:Dart Set.from() vs Set.of()飞镖 Set.from() 与 Set.of()
【发布时间】:2020-01-16 01:49:09
【问题描述】:

在 dart 中,Set 类有两个不同的工厂构造函数 Set.from()Set.of()。 它们返回的结果是相同类型的。它们之间有什么用例区别吗?如何决定使用哪一个?

查看该程序的输出:

void main() {
    List<int> myList = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5];

    Set<int> mySetFrom = Set.from(myList);
    Set<int> mySetOf = Set.of(myList);

    print("mySetFrom type: ${mySetFrom.runtimeType}");
    print("mySetFrom: ${mySetFrom}");

    print("mySetOf type: ${mySetOf.runtimeType}");
    print("mySetOf: ${mySetOf}");
}

输出:

mySetFrom type: _CompactLinkedHashSet<int>
mySetFrom: {1, 2, 3, 4, 5}
mySetOf type: _CompactLinkedHashSet<int>
mySetOf: {1, 2, 3, 4, 5}

【问题讨论】:

标签: dart constructor set


【解决方案1】:

有一个很好的讨论here(它是关于List,但也适用于Set

Lasse 解释得很好。总之,如果类型没有改变,请使用iterable.toSet() 以获得更好的性能。使用Set.from() 更改类型。不要使用Set.of(),因为它基本上被新文字所包含(除非您认为of 更具可读性)。

【讨论】:

    【解决方案2】:

    类型继承揭示的差异:

    Set<Object> superSet = <Object>{'one', 'two', 'three'};
    

    Set.from() 构造函数可用于从 superSet 向下转换

    Set<String> subSet = Set<String>.from(superSet); // OK
    

    但是Set.of()不能

    Set<String> anotherSubSet = Set<String>.of(superSet); // throws an error
    // The argument type 'Set<Object>' can't be assigned to the parameter type 'Iterable<String>'.
    

    我认为Set.of() 构造函数最好使用完全相同的类型,因为性能更好。

    【讨论】:

      【解决方案3】:

      让我们看看它们:

      Set.of:

      Set&lt;E&gt;.of(Iterable&lt;E&gt; elements)

      Set.from:

      Set&lt;E&gt;.from(Iterable elements)

      你发现有什么不同吗?

      Set.of 采用 Iterable&lt;E&gt;Set.from 采用 Iterable 没有显式类型。换句话说,Set.of 对其参数进行了更强的类型检查。 Set.from 较旧,而 Set.of 是在 Dart 2 添加强类型时添加的。你通常应该使用Set.of

      https://github.com/dart-lang/sdk/issues/32959 要求改进文档以澄清这一点。

      【讨论】:

      • 当您已经拥有 E 的可迭代对象时,您应该使用 Set.of。当您有一些 Iterable&lt;X&gt; 恰好包含 E 类型的对象时,您应该使用 Set.from
      猜你喜欢
      • 2013-12-06
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      • 2019-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-15
      相关资源
      最近更新 更多