d的opnext
原文
我发现empty/front/popNext
协议在一般
(至少在Weka
代码库中)非常麻烦
,人们更喜欢opApply
(尽管有自己的问题
).
今天甚至遇见了使用现有协议
无法解决问题:如果foreach
中断了,消费
区间(比如文件流
)不应消费.使用opApply
,这很容易(闭包
返回非零
值),但是使用popNext
,这很难.我不详细
讨论细节,所以直接
跳到建议
的协议.
bool opNext(out T elem) {...}
如果"产生"
了一个元素,下个(opNext)
操作,则返回true
,如果到达了结尾
,则返回false
.
foreach (elem; range) {
...
}
只是降级到
T elem;
while (range.opNext(elem)) {
...
}
当然,该协议
可与现有
协议并存
,只是在降级
规则中优先.具体示例:
struct LinkedList {
int value;
LinkedList* next;
struct Range {
LinkedList* cursor;
bool opNext(out int val) nothrow @nogc {
if (cursor is null) {
return false;
}
val = cursor.value;
return true;
}
}
auto members() {return Range(&this);}
}
foreach (val; myList.members) {
...
}
注意:
0,对新协议也可用保存()/save()
,它只需要复制迭代器
的状态.
1,也许加上opPrev
来搞定双向区间
是可行的,但,用途不大.
2,在新协议
中更容易链接map/filter/etc
出于好奇:你认为,对比如下,其优缺点:
Option!(T) opNext() { ... }
选项(Option)
是选项
类型实现,因此包含了是否产生元素
问题.这是简化/重新
设计区间
概念的另一个建议.)
基于选项
设计的优点是不需要持久的前(front)
,更适合(如,从流
中读的)真输入区间
.
对前
方法有可引用
的持久底层数据
,这可能更加笨拙
.
mixin template NextToRange(ElementType) {
ElementType _value;
bool _haveValue;
@property {
bool empty() {
return !_haveValue;
}
ElementType front() {
assert(_haveValue);
return _value;
}
}
void popFront() {
_haveValue = nextValue(_value);
}
}
不需要
破坏很大比例
标准库就可使用它;).
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现