深圳宝安中学家长群,seo优化师就业前景,全屋定制十大名牌是哪些,优秀个人网站模板下载文章目录1 场景说明2 解决方案2.1 允许不同的输入参数2.2 允许不同的输出参数2.3 让调用方来做处理参考资料1 场景说明
假设我们有一个函数foo#xff0c;它既要允许str也要允许String作为输入参数。或是既要允许str也要允许String作为输出。str和String之间的…
文章目录1 场景说明2 解决方案2.1 允许不同的输入参数2.2 允许不同的输出参数2.3 让调用方来做处理参考资料1 场景说明
假设我们有一个函数foo它既要允许str也要允许String作为输入参数。或是既要允许str也要允许String作为输出。str和String之间的转换我们不希望让调用方来操心。这在开发过程中是经常遇到的需求。
涉及到的知识点IntoCow。
2 解决方案
2.1 允许不同的输入参数
我们先来让函数接受不同的输入参数不同的输入参数可以通过给输入参数绑定Into这个trait来实现。输入参数有这个trait就可以通过.into()方法来将输入参数转化为需要的类型。
str已经实现了Into这个trait我们可以直接使用。如果是自己定义的类型则需要自己实现Into。一般自己实现Into会优先实现From这个trait有了这个traitInto就自动实现了这个是完全免费的。
struct MyStr{s: String
}impl FromMyStr for String{fn from(s: MyStr)- Self{s.s}
}fn fooT: IntoString(s: T) - String{s.into()// 可以在这里做些操作
}fn main() {let s abds;let foo_s foo(s);assert_eq!(String::from(abds), foo_s);let s MyStr{s: String::from(jojsd)};let foo_s foo(s);assert_eq!(String::from(jojsd), foo_s);
}2.2 允许不同的输出参数
如果我们希望函数返回不同的参数可以用Cow这是一个枚举类型本质是一个智能指针。
pub enum Cowa, B
whereB: a ToOwned ?Sized, {Borrowed(a B),Owned(B as ToOwned::Owned),
}
ToOwned表示这个泛型B可以从借用变成拥有所有权比如str是借用没有所有权的通过to_owned()方法可以变成String就有所有权了。?Sized表示这个类型的size是不确定的比如String的长度是可变的。
use std::borrow::Cow;fn fooa(s: a str) - Cowa, str{if s.len() 5{let s String::from(s[0..4]);return Cow::Owned(s);} else {return Cow::Borrowed(s);}}fn main() {let s adsfadsf;let mut foo_s foo(s);assert_eq!(adsf, foo_s.to_mut());assert_eq!(adsf.to_string(), foo_s.into_owned());let s adf;let mut foo_s foo(s);assert_eq!(adf, foo_s.to_mut());assert_eq!(adf.to_string(), foo_s.into_owned());
}如果既希望输入不同参数也希望同时返回不同参数目前还没有找到特别好的办法。
2.3 让调用方来做处理
如果是不希望输入或者输出是可以转换的我们最好用str作为输入和输出因为String和str的切片都是str。
fn first_word(s: str) - str {let bytes s.as_bytes();for (i, item) in bytes.iter().enumerate() {if item b {return s[0..i];}}s[..]
}fn main() {let my_string String::from(hello world);let word first_word(my_string[..]);assert_eq!(hello, word);let word first_word(my_string);assert_eq!(hello, word);let my_string_literal hello world;let word first_word(my_string_literal[..]);assert_eq!(hello, word);let word first_word(my_string_literal);assert_eq!(hello, word);
}参考资料
[1] https://doc.rust-lang.org/std/convert/trait.Into.html [2] https://hermanradtke.com/2015/05/06/creating-a-rust-function-that-accepts-string-or-str.html/ [3] https://hermanradtke.com/2015/05/29/creating-a-rust-function-that-returns-string-or-str.html/ [4] https://wiki.jikexueyuan.com/project/rust-primer/intoborrow/cow.html [5] https://doc.rust-lang.org/book/ch04-03-slices.html