1个不稳定版本
使用旧Rust 2015
0.2.0 | 2020年2月6日 |
---|---|
0.1.4 |
|
0.1.2 |
|
0.1.1 |
|
0.1.0 |
|
134 在 无标准库
4,382 每月下载量
在 10 个包中使用 (通过 sv-parser-parser)
19KB
151 行
str-concat
连接两个相邻的字符串切片。
示例
use str_concat::{concat, concat_unordered, Error};
fn main() {
let s = "0123456789";
// ordered, `a` before `b`
unsafe {
// SAFETY: the slices are from the same `&str`.
assert_eq!(Ok("0123456"), concat(&s[..5], &s[5..7]));
assert_eq!(Ok("0123456"), concat_unordered(&s[..5], &s[5..7]));
}
// unordered, `b` before `a`
unsafe {
// SAFETY: the slices are from the same `&str`.
assert_eq!(Err(Error::NotAdjacent), concat(&s[5..7], &s[..5]));
assert_eq!(Ok("0123456"), concat_unordered(&s[5..7], &s[..5]));
}
}
安全性
通常不安全地连接两个相邻的切片。这已在 #8、bluss/odds#25、rust-lang/rust#66111、rust-lang/rust#62765、rust-lang/rfcs#2806 和 tokio-rs/bytes#347 中解释。简而言之,当Rust计算对引用类型(如切片)的借用部分时,它假设这些偏移量来自同一分配。如果两个不同的分配相邻,那么此包中的 concat*
函数会立即将它们组合起来,破坏 rustc
的内部假设,从而可能导致未定义行为(UB)。因此,此包中所有函数都被标记为 unsafe
。用户必须确保要连接的切片来自同一分配(相同的 String
、Vec<_>
、…)。
另一种边缘情况是零大小类型(ZST)。对不同的ZST进行多次切片可能指向相同的内存区域。这是因为ZST的实例,包括切片,即使是不同类型也无法通过地址来识别。这是因为ZST不占用任何空间,它不会“别名”任何内存。因此,在使用ZST(或其Vec或切片)时,实际上不需要在运行时分配任何空间。相反,ZST的切片可能指向具有正确对齐的最小非零地址(例如:vec![()].as_ptr() as usize == 1
)。从技术上讲,给ZST的切片任意延长是合理的,前提是它已经包含至少一个元素。然而,我们决定从语义上讲,使用这个功能没有意义。因为我们也没有办法判断两个ZST切片是否相邻,所以我们决定如果两个ZST切片被传递进行连接时,总是返回错误。有关ZST切片的此问题的进一步阅读,请参阅#5,rust-lang/unsafe-code-guidelines#93和rust-lang/unsafe-code-guidelines#168。
许可
在以下任一许可下授权
- Apache License,版本2.0,(LICENSE-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可(LICENSE-MIT或http://opensource.org/licenses/MIT)
您自行选择。