d的输出区间

D的输出区间

原文

import std.stdio;
import std.range;

void main() {
    int[] arr = [1, 2, 3, 4, 5];
    auto s = arr;
    writeln(s); // [1, 2, 3, 4, 5]
    s.put(100); // 无输出,对吗?
    writeln(s); // [2, 3, 4, 5] 
}
//
int[] arr = [1, 2, 3, 4, 5];
auto s = arr;
s.put(100);
writeln(arr); // [100, 2, 3, 4 ,5];

文档
put不应使用"UFCS"风格,如r.put(e).这样做可能会直接调用R.put,绕过Range.put提供的转换功能.首选put(r,e).
put数组切片对待动态数组,并在复制元素后在切片上调用popFront.
调用put之前,一定要保存数组位置.
put放对象在哪里,为什么?
哪里取决于输出区间是什么.put是可根据目标对象实现各种事情的通用接口.可能流式传输到标准输出,可能会放进数据缓冲区,等等.
你这里,库把它解释为固定大小的缓冲区,并把复制数据put(放)到其中.实现就像:

复制数据至缓冲
步进缓冲
更新缓冲剩余空间

因此需要在开始时保留切片的单独引用,否则它会复制并前进,所以东西刚刚消失了.为什么它会这样做呢.

int[32] originalBuffer;
int[] buffer = originalBuffer[];
put(buffer, 5);
put(buffer, 6);
 // 上个步进空间,该调用依然工作.

最后实际使用了多少缓冲区?这是步进另一用法:可减去它来计算

int[] usedBuffer = originalBuffer[0 .. $ - buffer.length];

只取原始文件中的所有内容,除了输出区间中剩余空间.示例
示例用动态内部缓冲区显示.

static struct A {
    string data;
    void put(C)(C c) if (isSomeChar!C) {
        data ~= c;
    }
}

put方法复制字符内部串中,因此会按需增长,然后data.length告诉你有多大了.(顺便,stdlibappender类似)
输出区间接口非常小,只需要put函数,也不要求你.如果正在写入标准输出,长度不重要,不必返回数据给用户.因而不用~=附加符.
它去了哪里,为什么?视对象而定!输出区间/put就是收集数据并处理它.它就是最终目的地,因此不像其他区间那样支持链接.
使用内置切片,它复制数据给它,并步进位置来准备接受更多数据.你需要跟踪,得到了很大的灵活性和效率.追加器文档

posted @   zjh6  阅读(15)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示