pub struct OsString { /* private fields */ }
Expand description
一种类型,可以表示拥有的,可变的平台原生字符串,但可以廉价地与 Rust 字符串互转换。
对这种类型的需求源于以下事实:
-
在 Unix 系统上,字符串通常是非零字节的任意序列,在许多情况下解释为 UTF-8。
-
在 Windows 上,字符串通常是非零的 16 位值的任意序列,如果有效,则将其解释为 UTF-16。
-
在 Rust 中,字符串始终是有效的 UTF-8,其中可能包含零。
OsString
和 OsStr
通过同时表示 Rust 和平台原生字符串值来弥合这一差距,特别是允许 Rust 字符串在可能的情况下免费转换为 “OS” 字符串。
这样的结果是 OsString
实例不是 * NUL
终止的; 为了传递给例如 Unix 系统调用,您应该创建一个 CStr
。
OsString
到 &OsStr
如同 String
到 &str
: 每对中的前一个都是拥有所有权的字符串; 后者是借用的。
注意,OsString
和 OsStr
在内部不一定要以平台固有的形式保存字符串。在 Unix 上,字符串被存储为 8 位值的序列,在 Windows 上,字符串是基于 16 位值的,正如刚才所讨论的,字符串实际上也被存储为 8 位值的序列,用一种不太严格的 UTF-8 变体编码。
这对于理解处理容量和长度值时很有用。
OsString
容量
容量对从有效 unicode 创建的 OS 字符串使用 UTF-8 字节单位,对其他内容使用未指定编码的字节单位。在给定的目标上,所有 OsString
和 OsStr
值都使用相同的容量单位,因此以下将起作用:
use std::ffi::{OsStr, OsString};
fn concat_os_strings(a: &OsStr, b: &OsStr) -> OsString {
let mut ret = OsString::with_capacity(a.len() + b.len()); // 这将分配
ret.push(a); // 这不会进一步分配
ret.push(b); // 这不会进一步分配
ret
}
Run创建一个 OsString
来自 Rust 字符串: OsString
实现了 From<String>
,因此您可以使用 my_string.into()
从普通 Rust 字符串创建 OsString
。
**从切片: **就像您可以从一个空的 Rust String
开始,然后用 String::push_str
将一些 &str
子字符串切片放入其中一样,您也可以使用 OsString::new
方法创建一个空的 OsString
,然后使用 OsString::push
方法将字符串切片推入其中。
提取整个操作系统字符串中的借用引用
您可以使用 OsString::as_os_str
方法从 OsString
获取 &OsStr
; 这实际上是对整个字符串的借用引用。
Conversions
Implementations§
source§impl OsString
impl OsString
sourcepub fn into_string(self) -> Result<String, OsString>
pub fn into_string(self) -> Result<String, OsString>
1.9.0 · sourcepub fn with_capacity(capacity: usize) -> OsString
pub fn with_capacity(capacity: usize) -> OsString
创建一个至少具有给定容量的新 OsString
。
该字符串将能够保存至少 capacity
长度单位的其他 OS 字符串,而无需重新分配。
此方法允许分配多于 capacity
的单元。
如果 capacity
为 0,则不会分配该字符串。
请参见有关编码和容量单位的主要 OsString
文档信息。
Examples
use std::ffi::OsString;
let mut os_string = OsString::with_capacity(10);
let capacity = os_string.capacity();
// 无需重新分配即可完成此推送
os_string.push("foo");
assert_eq!(capacity, os_string.capacity());
Run1.63.0 · sourcepub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError>
pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError>
尝试在给定的 OsString
中为至少 additional
多个长度单位保留容量。
该字符串可能会保留更多空间来推测性地避免频繁的重新分配。
调用 try_reserve
后,如果返回 Ok(())
,容量将大于等于 self.len() + additional
。
如果容量已经足够,则不执行任何操作。即使发生错误,此方法也会保留内容。
请参见有关编码和容量单位的主要 OsString
文档信息。
Errors
如果容量溢出,或者分配器报告失败,则返回错误。
Examples
use std::ffi::{OsStr, OsString};
use std::collections::TryReserveError;
fn process_data(data: &str) -> Result<OsString, TryReserveError> {
let mut s = OsString::new();
// 预先保留内存,如果不能,则退出
s.try_reserve(OsStr::new(data).len())?;
// 现在我们知道在我们复杂的工作中这不能 OOM
s.push(data);
Ok(s)
}
Run1.9.0 · sourcepub fn reserve_exact(&mut self, additional: usize)
pub fn reserve_exact(&mut self, additional: usize)
1.63.0 · sourcepub fn try_reserve_exact(
&mut self,
additional: usize
) -> Result<(), TryReserveError>
pub fn try_reserve_exact( &mut self, additional: usize ) -> Result<(), TryReserveError>
尝试在给定的 OsString
中为至少 additional
更多长度单位保留最小容量。
调用 try_reserve_exact
后,如果返回 Ok(())
,则容量将大于或等于 self.len() + additional
。
如果容量已经足够,则不执行任何操作。
请注意,分配器可能会为 OsString
提供比它请求更多的空间。
因此,不能依靠容量来精确地最小化。
如果希望将来插入,则首选 try_reserve
。
请参见有关编码和容量单位的主要 OsString
文档信息。
Errors
如果容量溢出,或者分配器报告失败,则返回错误。
Examples
use std::ffi::{OsStr, OsString};
use std::collections::TryReserveError;
fn process_data(data: &str) -> Result<OsString, TryReserveError> {
let mut s = OsString::new();
// 预先保留内存,如果不能,则退出
s.try_reserve_exact(OsStr::new(data).len())?;
// 现在我们知道在我们复杂的工作中这不能 OOM
s.push(data);
Ok(s)
}
Run1.19.0 · sourcepub fn shrink_to_fit(&mut self)
pub fn shrink_to_fit(&mut self)
Methods from Deref<Target = OsStr>§
sourcepub fn to_string_lossy(&self) -> Cow<'_, str>
pub fn to_string_lossy(&self) -> Cow<'_, str>
任何非 Unicode 序列都将替换为 U+FFFD REPLACEMENT CHARACTER
。
Examples
使用无效的 Unicode 在 OsStr
上调用 to_string_lossy
:
// 注意,由于 Unix 和 Windows 表示字符串的方式不同,我们不得不使该示例复杂化,使用不同的源数据和通过不同的平台扩展来设置示例 `OsStr`。
// 可以理解,实际上,仅通过收集用户命令行参数,您就可以得到这样的示例无效序列。
#[cfg(unix)] {
use std::ffi::OsStr;
use std::os::unix::ffi::OsStrExt;
// 此处,值 0x66 和 0x6f 分别对应于 'f' 和 'o'。
// 值 0x80 是一个单独的连续字节,在 UTF-8 序列中无效。
let source = [0x66, 0x6f, 0x80, 0x6f];
let os_str = OsStr::from_bytes(&source[..]);
assert_eq!(os_str.to_string_lossy(), "fo�o");
}
#[cfg(windows)] {
use std::ffi::OsString;
use std::os::windows::prelude::*;
// 在此,值 0x0066 和 0x006f 分别对应于 'f' 和 'o'。
// 值 0xD800 是一个单独的替代一半,在 UTF-16 序列中无效。
let source = [0x0066, 0x006f, 0xD800, 0x006f];
let os_string = OsString::from_wide(&source[..]);
let os_str = os_string.as_os_str();
assert_eq!(os_str.to_string_lossy(), "fo�o");
}
Runsourcepub fn to_os_string(&self) -> OsString
pub fn to_os_string(&self) -> OsString
1.9.0 · sourcepub fn len(&self) -> usize
pub fn len(&self) -> usize
返回此 OsStr
的长度。
请注意,这不会以 OS 字符串形式返回字符串中的字节数。
返回的长度是 OsStr
使用的底层存储的长度。
如 OsString
简介中所讨论的,OsString
和 OsStr
以最适合于原生平台和 Rust 字符串形式之间的廉价相互转换的形式存储字符串,这两种形式在存储大小和编码方面可能都大不相同。
此数字对于传递给其他方法 (例如 OsString::with_capacity
) 以避免重新分配非常有用。
请参见有关编码和容量单位的主要 OsString
文档信息。
Examples
use std::ffi::OsStr;
let os_str = OsStr::new("");
assert_eq!(os_str.len(), 0);
let os_str = OsStr::new("foo");
assert_eq!(os_str.len(), 3);
Run1.53.0 · sourcepub fn make_ascii_lowercase(&mut self)
pub fn make_ascii_lowercase(&mut self)
将此字符串就地转换为其 ASCII 小写等效项。
ASCII 字母 ‘A’ 到 ‘Z’ 映射到 ‘a’ 到 ‘z’,但是非 ASCII 字母不变。
要返回新的小写值而不修改现有值,请使用 OsStr::to_ascii_lowercase
。
Examples
use std::ffi::OsString;
let mut s = OsString::from("GRÜßE, JÜRGEN ❤");
s.make_ascii_lowercase();
assert_eq!("grÜße, jÜrgen ❤", s);
Run1.53.0 · sourcepub fn make_ascii_uppercase(&mut self)
pub fn make_ascii_uppercase(&mut self)
将此字符串就地转换为其 ASCII 大写等效项。
ASCII 字母 ‘a’ 到 ‘z’ 映射到 ‘A’ 到 ‘Z’,但是非 ASCII 字母不变。
要返回新的大写值而不修改现有值,请使用 OsStr::to_ascii_uppercase
。
Examples
use std::ffi::OsString;
let mut s = OsString::from("Grüße, Jürgen ❤");
s.make_ascii_uppercase();
assert_eq!("GRüßE, JüRGEN ❤", s);
Run1.53.0 · sourcepub fn to_ascii_lowercase(&self) -> OsString
pub fn to_ascii_lowercase(&self) -> OsString
返回此字符串的副本,其中每个字符都映射为其等效的 ASCII 小写字母。
ASCII 字母 ‘A’ 到 ‘Z’ 映射到 ‘a’ 到 ‘z’,但是非 ASCII 字母不变。
要就地小写该值,请使用 OsStr::make_ascii_lowercase
。
Examples
use std::ffi::OsString;
let s = OsString::from("Grüße, Jürgen ❤");
assert_eq!("grüße, jürgen ❤", s.to_ascii_lowercase());
Run1.53.0 · sourcepub fn to_ascii_uppercase(&self) -> OsString
pub fn to_ascii_uppercase(&self) -> OsString
返回此字符串的副本,其中每个字符都映射为其等效的 ASCII 大写字母。
ASCII 字母 ‘a’ 到 ‘z’ 映射到 ‘A’ 到 ‘Z’,但是非 ASCII 字母不变。
要就地将值大写,请使用 OsStr::make_ascii_uppercase
。
Examples
use std::ffi::OsString;
let s = OsString::from("Grüße, Jürgen ❤");
assert_eq!("GRüßE, JüRGEN ❤", s.to_ascii_uppercase());
Run1.53.0 · sourcepub fn eq_ignore_ascii_case<S: AsRef<OsStr>>(&self, other: S) -> bool
pub fn eq_ignore_ascii_case<S: AsRef<OsStr>>(&self, other: S) -> bool
检查两个字符串是否为 ASCII 不区分大小写的匹配项。
与 to_ascii_lowercase(a) == to_ascii_lowercase(b)
相同,但不分配和复制临时文件。
Examples
use std::ffi::OsString;
assert!(OsString::from("Ferris").eq_ignore_ascii_case("FERRIS"));
assert!(OsString::from("Ferrös").eq_ignore_ascii_case("FERRöS"));
assert!(!OsString::from("Ferrös").eq_ignore_ascii_case("FERRÖS"));
RunTrait Implementations§
1.52.0 · source§impl<'a> Extend<&'a OsStr> for OsString
impl<'a> Extend<&'a OsStr> for OsString
source§fn extend_one(&mut self, item: A)
fn extend_one(&mut self, item: A)
extend_one
#72631)1.52.0 · source§impl<'a> Extend<Cow<'a, OsStr>> for OsString
impl<'a> Extend<Cow<'a, OsStr>> for OsString
source§fn extend_one(&mut self, item: A)
fn extend_one(&mut self, item: A)
extend_one
#72631)1.52.0 · source§impl Extend<OsString> for OsString
impl Extend<OsString> for OsString
source§fn extend_one(&mut self, item: A)
fn extend_one(&mut self, item: A)
extend_one
#72631)