rust 如果返回类型注解是对字符串的引用,但它返回的是字符串字面量,为什么这个函数会编译?

g9icjywg  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(81)

类型注解是&str,这是一个指向字符串的指针,对吧?但我返回的是一个字符串,要么是foo,要么是bar,要么是baz

pub fn foo_if_fizz(fizzish: &str) -> &str {
    if fizzish == "fizz" {
        "foo"
    } else if fizzish == "fuzz" {
        "bar"
    } else {
        "baz"
    }
}

字符串

zbwhf8kr

zbwhf8kr1#

&strtype of string literals
调用者接收到一个共享的、不可变的引用。他们不是所有者,因此不能修改内容或删除数据。使用相同的参数调用此函数两次,将返回对同一内存的引用。

3htmauhk

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,这意味着它们在程序的整个持续时间内都有效。这就是为什么你的示例代码可以工作。

相关问题