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 方法。
更好的解决方案是拥有String
的List
视图。这很容易做到:
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");
如果库暴露了用于制作UnmodifiableListView
的UnmodifiableListBase
,那就更容易了。
【讨论】:
我更新了代码以删除 linter 警告,但我可能省略了一个 mixin,因为原始版本似乎有一个悬空的with
。以上是关于Dart String 可迭代接口的主要内容,如果未能解决你的问题,请参考以下文章