rust中,对于一个 给定类型的变量(基础类型或者结构体),例子中的x,编译器保证它是有效的;但相反,一个`Option<T>`的变量,rust要求我们必须确认它是具有值的情况下,才可以使用。 换句话说,`Option<T> `中可能存在T,也可能是空值;我们必须确认它有值,并且将其转换为T才能够使用它。经过这个过程,就帮助我们甄别...
首先明确一点,Rust 核心语言中只有一种字符串类型,即字符串切片(string slice)str,它本质上是满足 ...
(s2,s3.chars().collect::<Vec<_>>());// &[char] 可以通过迭代器转换成 String,String 和 &str 可以直接对比assert_eq!(String::from_iter(s2),s3);} 代码语言:javascript 复制 哦 原来他们之间是可以相互转换的。 字符列表可以通过迭代器转换成 String, String 也可以通过chars()函数转换成字符列表。
登录后复制let num: i32 = 123; let str: String = String::from(num.to_string()); 从一个类型转换为另一个类型 我们可以使用From trait将一个类型转换为另一个类型。例如,我们将一个i32类型的变量转换为一个u32类型的变量。 登录后复制let num: i32 = 123; let new_num: u32 = u32::from(num...
String 转 &str 很有意思,在 rust 中,凡是需要用 &str 的地方,都可以直接用 &String 类型的数据。 事实上,上述转换是借助于 deref coercing 这个特性实现的。如果我们自定义的数据类型也想实现类似的自动转换,实现这个特性即可。 规则很简单,一般情况下,&str 用于只读数据,String 用于可修改的数据。
有些事情偶尔会觉得过于冗长。例如,在str和String之间进行转换,或者将引用而不是值传递给函数,这似乎是编译器可以为我解决的事情。我确信这会有一个很好的理由解释为什么它是这样的,但偶尔也会感觉rustc太正确了。 需要处理每个函数的每个结果都很是好的;这意味着程序员必须考虑每个函数调用发生了什么。有时候感觉很...
let s1 = String::from("hello"); let s2 = String::from("rust"); let s3 = format!("{}-{}", s1, s2); println!("format: {}", s3); } 我们对上面的代码做一些补充的解释。 push和insert类似,带有_str的方法接收的参数是字符串,否则只能接收单个字符。insert可以指定插入的位置,而push只能在...
将String转为&str前面也演示了,例如: 代码语言:javascript 复制 lets=String::from("hello");letslice=&s[..2];println!("{slice}");// 直接打印,没有解引用。 其中实际上还有一个问题,可能有部分读者已经注意到了,那就是我们直接打印了slice这个切片引用,而没有解引用。实际上这是因为deref 隐式强制转换...
后面要说的指针pointer、字符段str、切片slice、引用reference、单元unit(代码中写作一对小括号())、空never(在代码中写做叹号!),也属于基本类型,但是说起来比前面几类复杂,本篇中讲一部分,后面章节的内容还会融合这些数据类型。 除基本类型外最常用的类型是字符串String、结构体struct、枚举enum、向量Vector和字典Has...