- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要对 OutputRange
及其用途进行一些说明。它表示类似于发送到 stdout 的流式元素输出,并且需要支持 put()
方法,该方法:
determines the capabilities of the range and the element at compile time and uses the most appropriate method to output the element.
输出 元素,但到哪里 以及什么目的?
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); // nothing is printed to stdout, should it?
writeln(s); // [2, 3, 4, 5]
}
在上面的代码中,我们在切片上调用了 put()
,因此我们丢失了 1,但是“100”去了哪里? MultiFile这个例子感觉有点做作。 OutputRange
的更实用的用例会更好。
一件小事,put
为什么叫put
?在其他语言中,put
用于对某些集合进行插入或添加操作。我觉得很困惑。
更新:看起来我们需要保留原始切片的副本以防止元素丢失。
int[] arr = [1, 2, 3, 4, 5];
auto s = arr;
s.put(100);
writeln(arr); // [100, 2, 3, 4 ,5];
我发现上面的内容很困惑,也许我错过了 OutputRange
背后的概念 :(
最佳答案
首先,阅读put
的文档:http://dpldocs.info/experimental-docs/std.range.primitives.put.html
值得注意的是:
Tip: put should not be used "UFCS-style", e.g. r.put(e). Doing this may call R.put directly, by-passing any transformation feature provided by Range.put. put(r, e) is prefered.
所以不要调用s.put(x)
,而是调用put(s, x);
。
它还讨论了您的更新中发生的事情:
put treats dynamic arrays as array slices, and will call popFront on the slice after an element has been copied.
Be sure to save the position of the array before calling put.
您还会注意到文档经常使用“复制”一词。那么,put
将项目放在哪里,为什么?
在哪里 取决于输出范围。 put
是一个通用接口(interface),可以根据目标对象执行各种操作。有些人可能会将其流式传输到标准输出,有些人可能会将其放入数据缓冲区,有些人可能会做一些完全不同的事情。
在您使用的数组切片的情况下,库将其解释为固定大小的缓冲区,并且其put
将数据复制到其中。
实现看起来像
copy element to buffer
advance buffer
update buffer's remaining space
这就是为什么您需要在开头保留对切片的单独引用,否则它会复制并前进,所以它看起来就像消失了一样。为什么它会这样做?
int[32] originalBuffer;
int[] buffer = originalBuffer[];
put(buffer, 5);
put(buffer, 6); // since the last one advanced the remaining space, this next call just works
最后实际使用了多少缓冲区?这是前进的另一个用途:你可以减去它:
int[] usedBuffer = originalBuffer[0 .. $ - buffer.length];
我们只取出原始文件中的所有内容,除了剩余的内容作为输出范围中的剩余空间。
其他范围可能会保留内部计数。 http://dpldocs.info/experimental-docs/std.range.primitives.put.html#examples 处的文档示例显示了一个带有动态内部缓冲区的示例。
static struct A {
string data;
void put(C)(C c) if (isSomeChar!C) {
data ~= c;
}
}
它的 put
方法将字符复制到一个内部字符串中,因此它会根据需要增长,然后 data.length
告诉您它有多大。 (stdlib 的 appender
就像这样顺便说一句)
输出范围接口(interface)非常小 - 它真正需要的只是一个 put
函数,然后它没有指定你用它做什么。想象一下,如果它正在写入 stdout,那么长度无关紧要,根本不需要将数据返回给用户。这也是它不使用 ~=
附加运算符的原因 - 它不一定附加任何内容。
所以回顾一下:它去了哪里,为什么?视对象而定! OutputRange/put 是经过深思熟虑的通用接口(interface),旨在收集数据并用它来做……一些事情。它是一个最终目的地,因此不支持像其他范围一样的链接。
使用内置切片,它会向其中复制数据并提升位置以使其准备好接受更多数据。这需要你做更多的工作来跟踪它,但为通用使用提供了很大的灵 active 和效率。尽管专门针对您的特定需求,但您可能会更好地使用其他功能。如果要附加,请尝试 http://dpldocs.info/appender例如。
关于d - D 中 OutputRange 和 put() 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59115028/
我正致力于通过 OAuth 合并外部 API,但对 expires_in 属性的用途有点迷惑。通过阅读,应该对 api token 的使用进行防御性编码,因为您应该预料到 token 在任何时候都可能
有人可以概述或总结一下 Spring 框架上下文中 bean 的用途吗? 我了解标准的 Java bean(没有 arg 构造函数、getter/setter,通常是序列化的),但 Spring be
使用 OpenGL 4.1 和 ARB_separate_shader_objects,我们能够在着色器程序中存储着色管道的不同阶段。众所周知,要使用这些,我们需要将它们附加到程序管道对象,然后绑定(
正如我从文档中了解到的那样,“MoveIteratorFactory”的目的是生成每一步都需要执行的 Action 。 “getSize”方法的移动子集有多大? “createOriginalMove
请解释 CMakeLists.txt 中这一行的目的是什么: 包括(InstallRequiredSystemLibraries) 我在 CMake 示例中看到这一行,但找不到好的解释,为什么我需要它
这里是新手。我仍在尝试理解在多个布局中运行单个进程或目的的概念。 例如,我想在我的申请中添加“提交后”功能。有一个包含标题、内容等文本框的主布局,以及一个链接到另一个布局以选择类别的按钮。我的问题是,
我在看 Box Oauth2.0 View Controller : https://github.com/box/box-ios-sdk-v2/blob/master/BoxSDK/OAuth2/B
我编写了一个将字符串复制到系统剪贴板的 Java 应用程序。构造函数使用 Clipboard.setContents(Transferable contents, ClipboardOwner own
阅读此文后:http://sourcemaking.com/design_patterns/command 我还是不太明白为什么我们需要这个。 最佳答案 想法是,如果命令被封装为对象,那么这些命令可以
我知道 c++ 中的模板是做什么的,但是今天我看到了一些奇怪的代码: template <> void swap(foo &a, foo &b) { a.name = b.name; a.
我不太明白 C# Collections 中 IEnumerator 的用途是什么。它的用途是什么,为什么要使用它? 我试着在线查看 http://msdn.microsoft.com/en-us/l
不幸的是,我今天做了一些代码考古(同时重构了一些旧的危险代码)并发现了这样的小化石: # line 7 "foo.y" 能在里面找到如此古老的宝藏,我完全惊呆了。我在 C 编程的网站上阅读了它。然而,
您能否澄清一下此注释的实际用途? - 如果我们没有使用数据库中的 SQL 表定义定义相应的约束,会发生什么情况。当我们尝试插入时,hibernate 会检查唯一性吗?或者这就是DB的目的吗?如果 hi
我在视频教程中看到过这段代码: const navToggle = ["Menu"].join(""); $(".site-header").prepend(navToggle); 我明白它的基本作用
我想知道这个成员函数的 scroll_to(TextBuffer::iterator& iter, double within_margin = 0)参数 within_margin。 API 是这样
我想知道是否可以将子目录提交到目录例如,假设您有 site.com/directory 可以将子目录提交到目录。我即将开始为希望她的网站在搜索引擎中排名靠前的客户进行一些搜索引擎优化。我知道实现此目的
STL 迭代器的用途是什么?为什么程序员要创造这个概念? 最佳答案 迭代器允许您将算法与容器分开。只要您有开始和结束迭代器,并且知道迭代器的功能(随机访问等),您就可以在迭代器指定的范围内进行操作。例
NSData *responseData = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&respons
我正在编写代码,使用通用的 linux i2c 驱动程序 linux/i2c-dev.h 实现一个简单的 i2c 读/写功能 我对 ioctl 感到困惑:I2C_SLAVE 内核文档说明如下: You
在尝试克隆可变集合时,我最初的方法是对 mutable.Cloneable 特征使用 clone() 方法。但是,这取决于创建引用副本的 java.Object.clone 实现,而不是深拷贝。通过测
我是一名优秀的程序员,十分优秀!