- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
来自 Rust 标准库 implementation of unzip
:
fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB) where
FromA: Default + Extend<A>,
FromB: Default + Extend<B>,
Self: Sized + Iterator<Item=(A, B)>,
{
struct SizeHint<A>(usize, Option<usize>, marker::PhantomData<A>);
impl<A> Iterator for SizeHint<A> {
type Item = A;
fn next(&mut self) -> Option<A> { None }
fn size_hint(&self) -> (usize, Option<usize>) {
(self.0, self.1)
}
}
let (lo, hi) = self.size_hint();
let mut ts: FromA = Default::default();
let mut us: FromB = Default::default();
ts.extend(SizeHint(lo, hi, marker::PhantomData));
us.extend(SizeHint(lo, hi, marker::PhantomData));
for (t, u) in self {
ts.extend(Some(t));
us.extend(Some(u));
}
(ts, us)
}
这两行:
ts.extend(SizeHint(lo, hi, marker::PhantomData));
us.extend(SizeHint(lo, hi, marker::PhantomData));
实际上不要对 ts
或 us
进行任何扩展,因为 SizeHint
的 next
方法返回 无
。这样做的目的是什么?
最佳答案
这是一个很酷的把戏。通过提供此大小提示,它为 ts
和 us
提供了为循环中的 extend
调用保留空间的机会。根据documentation
size_hint()
is primarily intended to be used for optimizations such as reserving space for the elements of the iterator, but must not be trusted to e.g. omit bounds checks in unsafe code. An incorrect implementation ofsize_hint()
should not lead to memory safety violations.
请注意,SizeHint
的创建是必要的,因为 for 循环中的 extend
调用是使用 Some
值(可选
实现了 Iterator
特性),Some
值的 size_hint
是 (1, Some(1))
。这对预分配没有帮助。
但是查看 Vec
的代码, 这将无效(在 HashMap
和 VecDeque
中均无效)。其他 Extend
实现可能不同。
执行 ts.extend(SizeHint(lo, hi, marker::PhantomData));
不会触发 resize
,因为 next
返回 None
。也许有人应该写一个补丁。
impl<T> Vec<T> {
fn extend_desugared<I: Iterator<Item = T>>(&mut self, mut iterator: I) {
// This function should be the moral equivalent of:
//
// for item in iterator {
// self.push(item);
// }
while let Some(element) = iterator.next() {
let len = self.len();
if len == self.capacity() {
let (lower, _) = iterator.size_hint();
self.reserve(lower.saturating_add(1));
}
unsafe {
ptr::write(self.get_unchecked_mut(len), element);
// NB can't overflow since we would have had to alloc the address space
self.set_len(len + 1);
}
}
}
}
关于rust - Iterator::unzip 中 SizeHint 的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37074656/
我有一个包含许多 zip 文件的文件夹。我需要获取这些 zip 文件中的任何一个,将其解压缩并从压缩文件中获取特定文件。我为此使用 IO::Uncompress::Unzip 模块。我的 perl 脚
如果我有一个三元组列表,我想要三个单独的列表。还有比这更好的方法吗: (listA, listB, listC) = (list.map(_._1), list.map(_._2). list.map
有人可以帮我移植我的代码吗void * uzFile = unzOpen("zip 文件名"); 使用 minizip 中的 unzOpenCurrentFilePassword 吗?我想用密码保护我
我编写了一段简单的代码,用于使用 unzip 提取 zip 文件。当未设置输出目录时它工作正常但返回错误是目录已设置 "Archive: /home/vishvesh.kumar/tempFolder
我正在尝试解压缩位于 Android 设备的 SDCARD 上的文件。如果 ZIP 文件只包含文件而不包含文件夹,则一切正常。但是,我希望应用程序解压缩的生产文件包含多个目录和子目录。这是我遇到问题的
您好,我已经从 Windows 7 创建并将其放入服务器。现在我正在将文件从服务器下载到我的 SD 卡中。但是当我开始解压缩时它显示错误, java.util.zip.ZipException: E
我正在尝试使用 yauzl 解压缩文件。然而 example in the repo不显示如何解压缩到文件夹。它只是说: readStream.pipe(somewhere); 有没有一种简单的方法可
我有一个 foo: seq 我想拆分元组项,然后将结果存储到两个变量中,每个变量是 seq 我想知道是否有更漂亮的方法来做到这一点,例如 let item1, item2 = foo |> ?????
标准库在List上提供了unzip方法: scala>val l = List((1, "one"), (2, "two"), (3, "three"), (4, "four"), (5, "five
Minizip 有没有办法直接从缓冲区中提取文件?通常你会使用一个 unzFile 实例,但这对我来说不是一个选项(我直接在缓冲区中获取压缩数据,我不从磁盘读取它)。 最佳答案 来自 the auth
本文整理了Java中jodd.io.ZipUtil.unzip()方法的一些代码示例,展示了ZipUtil.unzip()的具体用法。这些代码示例主要来源于Github/Stackoverflow/M
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 6年前关闭。 Improve this
因此,我有这个元组列表(n = 2),我应该“解压”巫婆,然后创建一个新的列表,如下所示:对于类似val的元组列表,它=(1,“一个”):: (2,“two”):: nil:(int,string)a
我有以下代码,其中 fac 返回 (MyType, OtherType): let l = (-1..13).map(|x| { fac(x).0 }).collect::>(); 它有效,但
我有几个zip文件,我想在其他路径中解压缩,只解压缩具有某些特征的文件,所以我在linux中执行以下命令: unzip -q -o ./path1/*/"*.zip" Key/* -d /path2/
我的程序使用 HTTP 通过网络读取 gzipped 文件。 我需要我的程序能够解压缩内容并解析它,即使不是所有的 gzip 文件都到达了。 可以吗? 如果是这样,可以用 C++ 完成吗?如果是,怎么
我发现以下行为出乎意料: $ mkdir tmp && cd tmp/ $ for example in a b c ; do echo $example > $example.txt ; done
我正在使用 npm 的 unzip 模块来提取 zip 存档的内容。我需要知道它何时完成提取以及文件已完全写入磁盘。 我的代码: fs.createReadStream('master.zip').p
本文整理了Java中io.fabric8.utils.Zips.unzip()方法的一些代码示例,展示了Zips.unzip()的具体用法。这些代码示例主要来源于Github/Stackoverflo
本文整理了Java中org.jboss.as.patching.ZipUtils.unzip()方法的一些代码示例,展示了ZipUtils.unzip()的具体用法。这些代码示例主要来源于Github
我是一名优秀的程序员,十分优秀!