Dart String 可迭代接口

Posted

技术标签:

【中文标题】Dart String 可迭代接口【英文标题】:Dart String Iterable interface 【发布时间】:2014-10-12 01:17:02 【问题描述】:

为什么 Dart String 类不实现可迭代接口?似乎有一个明显的字符串迭代概念,即依次返回每个字符。

【问题讨论】:

【参考方案1】:

也许没有你想要的那么简洁

String s = 'foo';
s.codeUnits.forEach((f) => print(new String.fromCharCode(f)));
s.runes.forEach((f) => print(new String.fromCharCode(f)));

【讨论】:

【参考方案2】:

回答“为什么”:

Iterable 接口是一个相当重量级的接口(许多成员),用于元素集合。

虽然String 可以看作是字符的List(但 Dart 没有字符类型,所以它实际上是“单字符字符串列表”),但这不是它的主要用法,同时作为 Iterable 会混淆实际的 String 方法。

更好的解决方案是拥有StringList 视图。这很容易做到:

class StringListView extends ListBase<String> 
  final String _string;
  StringListView(this._string);

  @override
  String operator [](int index) => _string[index];

  @override
  int get length => _string.length;

  @override
  set length(int newLength) 
    throw UnsupportedError("Unmodifiable");
  

  @override
  void operator []=(int index, String v) 
    throw UnsupportedError("Unmodifiable");
  

如果库暴露了用于制作UnmodifiableListViewUnmodifiableListBase,那就更容易了。

【讨论】:

我更新了代码以删除 linter 警告,但我可能省略了一个 mixin,因为原始版本似乎有一个悬空的 with

以上是关于Dart String 可迭代接口的主要内容,如果未能解决你的问题,请参考以下文章

★Dart-7-扩展类和接口

java之List接口 迭代过程中添加元素

★Dart-6-构造类和接口

java迭代器/可迭代子接口

关于迭代器接口的问题

java SE基础(Collection接口概述)