#slice #string #concat #str #concatenate

无std str-concat

连接两个相邻的字符串切片

1个不稳定版本

使用旧Rust 2015

0.2.0 2020年2月6日
0.1.4 2018年6月20日
0.1.2 2018年6月20日
0.1.1 2018年6月20日
0.1.0 2018年6月20日

134无标准库

Download history 1341/week @ 2024-03-15 1118/week @ 2024-03-22 1231/week @ 2024-03-29 1044/week @ 2024-04-05 1363/week @ 2024-04-12 1612/week @ 2024-04-19 1245/week @ 2024-04-26 1440/week @ 2024-05-03 1090/week @ 2024-05-10 1588/week @ 2024-05-17 1207/week @ 2024-05-24 1275/week @ 2024-05-31 1208/week @ 2024-06-07 1150/week @ 2024-06-14 1123/week @ 2024-06-21 717/week @ 2024-06-28

4,382 每月下载量
10 个包中使用 (通过 sv-parser-parser)

MIT/Apache

19KB
151

str-concat

Crates.io Docs.rs

连接两个相邻的字符串切片。

示例

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]));
    }
}

安全性

通常不安全地连接两个相邻的切片。这已在 #8bluss/odds#25rust-lang/rust#66111rust-lang/rust#62765rust-lang/rfcs#2806tokio-rs/bytes#347 中解释。简而言之,当Rust计算对引用类型(如切片)的借用部分时,它假设这些偏移量来自同一分配。如果两个不同的分配相邻,那么此包中的 concat* 函数会立即将它们组合起来,破坏 rustc 的内部假设,从而可能导致未定义行为(UB)。因此,此包中所有函数都被标记为 unsafe。用户必须确保要连接的切片来自同一分配(相同的 StringVec<_>、…)。

另一种边缘情况是零大小类型(ZST)。对不同的ZST进行多次切片可能指向相同的内存区域。这是因为ZST的实例,包括切片,即使是不同类型也无法通过地址来识别。这是因为ZST不占用任何空间,它不会“别名”任何内存。因此,在使用ZST(或其Vec或切片)时,实际上不需要在运行时分配任何空间。相反,ZST的切片可能指向具有正确对齐的最小非零地址(例如:vec![()].as_ptr() as usize == 1)。从技术上讲,给ZST的切片任意延长是合理的,前提是它已经包含至少一个元素。然而,我们决定从语义上讲,使用这个功能没有意义。因为我们也没有办法判断两个ZST切片是否相邻,所以我们决定如果两个ZST切片被传递进行连接时,总是返回错误。有关ZST切片的此问题的进一步阅读,请参阅#5rust-lang/unsafe-code-guidelines#93rust-lang/unsafe-code-guidelines#168

许可

在以下任一许可下授权

您自行选择。

无运行时依赖