类型注解是&str,这是一个指向字符串的指针,对吧?但我返回的是一个字符串,要么是foo,要么是bar,要么是baz。
&str
foo
bar
baz
pub fn foo_if_fizz(fizzish: &str) -> &str { if fizzish == "fizz" { "foo" } else if fizzish == "fuzz" { "bar" } else { "baz" } }
字符串
zbwhf8kr1#
&str是type of string literals。调用者接收到一个共享的、不可变的引用。他们不是所有者,因此不能修改内容或删除数据。使用相同的参数调用此函数两次,将返回对同一内存的引用。
3htmauhk2#
类型注解是&str,这是一个指向字符串的指针,对吗?这取决于你如何定义“字符串”。如果你的意思是“一个指向String的指针“,那么答案是.它们可以是这个,但它们也可以指向其他东西。所以你不能说“我有一个&str,因此它肯定来自String”。一个&str,在Rust中被称为“string slice”,是一个 fat pointer,它包含两个信息:一个指向字节的指针和一个字节长度。Rust要求引用的整个字节序列(从指向的字节开始,跨越长度)本身是一个有效的UTF-8序列。就这样,没什么神奇的。以下是一些可以获得&str的地方的列表(还有其他地方):
String
some_string.as_str()
std::str::from_utf8
&[u8]
"foo"
'static
2条答案
按热度按时间zbwhf8kr1#
&str
是type of string literals。调用者接收到一个共享的、不可变的引用。他们不是所有者,因此不能修改内容或删除数据。使用相同的参数调用此函数两次,将返回对同一内存的引用。
3htmauhk2#
类型注解是
&str
,这是一个指向字符串的指针,对吗?这取决于你如何定义“字符串”。
如果你的意思是“一个指向
String
的指针“,那么答案是.它们可以是这个,但它们也可以指向其他东西。所以你不能说“我有一个&str
,因此它肯定来自String
”。一个
&str
,在Rust中被称为“string slice”,是一个 fat pointer,它包含两个信息:一个指向字节的指针和一个字节长度。Rust要求引用的整个字节序列(从指向的字节开始,跨越长度)本身是一个有效的UTF-8序列。就这样,没什么神奇的。
以下是一些可以获得
&str
的地方的列表(还有其他地方):String
将自动解引用为&str
。您也可以显式地说some_string.as_str()
。&str
可以获得另一个引用子节的&str
。std::str::from_utf8
将&[u8]
(字节切片)视为&str
。这不会复制任何数据,它只是验证字节切片是有效的UTF-8序列,并返回相同数据的字符串切片。"foo"
)的类型为&str
,生存期为'static
,这意味着它们在程序的整个持续时间内都有效。这就是为什么你的示例代码可以工作。