【翻译】在Rust中字符串如何匹配?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【翻译】在Rust中字符串如何匹配?相关的知识,希望对你有一定的参考价值。
参考技术A How to match a String against string literals in Rust?在Rust中字符串如何匹配?
I'm trying to figure out how to match a String in Rust.
我试图弄清楚Rust中是如何匹配一个字符串类型的。
I initially tried matching like this, but I figured out Rust cannot implicitly cast from std::string::String to &str.
我最初这样尝试,但是我发现Rust不能隐式的从std::string::String转化为&str。
This has the error:
这里的错误:
I then tried to construct new String objects, as I could not find a function to cast a String to a &str.
接着我尝试创建一个新的String对象,因为我不能找到一个方法将String转化为一个&str。
This gave me the following error 3 times:
编译器给我提示了如下的错误3次:
How to actually match Strings in Rust?
那在Rust中到底是如何匹配String的呢?
You can do something like this:
你可以这样处理:
There's also an as_str method as of Rust 1.7.0:
在Rust1.7.0之后,你也可以使用as_str方法:
stringthing.as_str() is probably the most straightforward of all the answers; I don't like as_ref because it's unnecessarily general, which can lead to bugs, and not as explicit, it isn't completely clear that as_ref() is going to be a &str, as_str is simple and clear.
在所有答案中,stringthing.as_str()方法可能是最直接的。我不喜欢as_ref方法,因为它通常是不必要的,这样做会导致bug并且是不显示的,as_ref()是否会是一个&str类型不是那么清楚,而as_str方法简单明了。
@Zorf You are right. The answer was accepted when as_str did not exist yet. I changed the accepted answer but thank all people who answered this question!
@Zorf 你是正确的。之前as_str不存在时我接受的这个答案。我已经更改了接受的答案,但还是要感谢所有回答这个问题的同学。
如何将字符串与字符串文字匹配?
【中文标题】如何将字符串与字符串文字匹配?【英文标题】:How to match a String against string literals? 【发布时间】:2014-10-12 13:23:17 【问题描述】:我试图弄清楚如何在 Rust 中匹配 String
。
我最初尝试像这样匹配,但我发现 Rust 不能从 std::string::String
隐式转换为 &str
。
fn main()
let stringthing = String::from("c");
match stringthing
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
这有错误:
error[E0308]: mismatched types
--> src/main.rs:4:9
|
4 | "a" => println!("0"),
| ^^^ expected struct `std::string::String`, found reference
|
= note: expected type `std::string::String`
found type `&'static str`
然后我尝试构造新的String
对象,因为我找不到将String
转换为&str
的函数。
fn main()
let stringthing = String::from("c");
match stringthing
String::from("a") => println!("0"),
String::from("b") => println!("1"),
String::from("c") => println!("2"),
这给了我 3 次以下错误:
error[E0164]: `String::from` does not name a tuple variant or a tuple struct
--> src/main.rs:4:9
|
4 | String::from("a") => return 0,
| ^^^^^^^^^^^^^^^^^ not a tuple variant or struct
如何在 Rust 中实际匹配 String
s?
【问题讨论】:
stringthing.as_str()
可能是所有答案中最直接的;我不喜欢as_ref
,因为它过于笼统,可能导致错误,而且不那么明确,as_ref()
是否会成为&str
并不完全清楚,as_str
简单明了.
@Zorf 你是对的。当as_str
尚不存在时,答案被接受。我更改了接受的答案,但感谢所有回答此问题的人!
【参考方案1】:
更新
使用.as_str()
原因
.as_str()
更简洁,并强制执行更严格的类型检查。特征 as_ref
是为多种类型实现的,并且它的行为可能会针对类型 String
进行更改,从而导致意外结果。同样,如果输入参数改变了类型,当该类型实现 as_ref
特征时,编译器不会发出问题信号。
文档建议使用as_str
以及https://doc.rust-lang.org/std/string/struct.String.html、https://doc.rust-lang.org/std/primitive.str.html
旧答案:
as_slice
已弃用,您现在应该改用 trait std::convert::AsRef
:
match stringthing.as_ref()
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
_ => println!("something else!"),
请注意,您还必须明确处理包罗万象的情况。
【讨论】:
使用 rust 1.4.0 可以使用trim()
函数。仅使用as_ref()
与字符串不匹配。
我认为匹配失败是因为trim()
删除了空格。这对于匹配用户输入非常有用。
它不起作用。如果我从 read_line 获取字符串,它只能匹配 _。
不太了解rust如何管理不同类型的字符串,但是it seems to work on a basic example。
@MaskedMan read_line
读取一行。行以\n
结尾。 .trim_end()
(或者,更准确地说,trim_end_matches('\n')
)将为您删除它。【参考方案2】:
您可以通过这样做将String
转换为&str
:
fn main()
let stringthing = String::from("c");
match &stringthing[..]
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
【讨论】:
【参考方案3】:你可以这样做:
match &stringthing[..]
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
_ => println!("something else!"),
从 Rust 1.7.0 开始,还有一个 as_str
方法:
match stringthing.as_str()
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
_ => println!("something else!"),
【讨论】:
【参考方案4】:你可以试试:
fn main()
let stringthing = String::from("c");
match &*stringthing
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
_ => println!("else")
【讨论】:
如果您解释&*stringthing
的含义和作用,它可能会提高您的答案的实用性。【参考方案5】:
编者注:此答案适用于 Rust 1.0 之前的版本,不适用于 Rust 1.0
你可以匹配一个字符串切片。
match stringthing.as_slice()
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
_ => println!("something else!"),
【讨论】:
最好使用.as_ref()
或.as_str()
,两者都没有取得所有权。【参考方案6】:
你也可以
match &stringthing as &str
"a" => println!("0"),
"b" => println!("1"),
"c" => println!("2"),
_ => println!("something else!"),
见:
std::string::String
std::ops::Deref
Deref coercions
【讨论】:
这实际上与.as_str()
相同,而且更短。
".as_str()" 比 "as &str" 多 1 个字符?我错过了什么吗? @amyiris以上是关于【翻译】在Rust中字符串如何匹配?的主要内容,如果未能解决你的问题,请参考以下文章
匹配Rust中的Option静态字符串文字[duplicate]
算法leetcode|28. 找出字符串中第一个匹配项的下标(rust重拳出击)
算法leetcode|28. 找出字符串中第一个匹配项的下标(rust重拳出击)
算法leetcode|28. 找出字符串中第一个匹配项的下标(rust重拳出击)