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