能否在Rust方法链中使用解引用操作符*或deref方法?
能否在Rust方法链中使用解引用操作符*?
当然可以,你有几种简洁的方式在方法链中完成&&str到&str的解引用,让to_digit(10)正常工作:
方法1:使用as_ref()(无需额外导入)
AsRef<str> trait为&&str提供了默认实现,调用as_ref()会自动解引用一层得到&str,直接兼容to_digit的参数要求:
use std::collections::HashMap; fn main() { let replacement_numbers = HashMap::from([ ("one", "1"), ("two", "2"), ("three", "3"), ]); let number: &str = "one"; let default_number: &str = "0"; let replacement = replacement_numbers .get(number) .unwrap_or(&default_number) .as_ref() // 自动解引用为&str .to_digit(10) .expect("Should be a number!"); println!("{}", replacement); }
方法2:导入Deref trait后调用deref()
&&str实现了Deref<Target = &str>,导入trait后可以直接在方法链中调用deref()完成解引用:
use std::collections::HashMap; use std::ops::Deref; // 必须导入该trait才能调用deref() fn main() { let replacement_numbers = HashMap::from([ ("one", "1"), ("two", "2"), ("three", "3"), ]); let number: &str = "one"; let default_number: &str = "0"; let replacement = replacement_numbers .get(number) .unwrap_or(&default_number) .deref() // 解引用为&str .to_digit(10) .expect("Should be a number!"); println!("{}", replacement); }
方法3:用cloned()提前处理Option中的引用
通过cloned()把Option<&&str>转换为Option<&str>,后续unwrap_or直接接收&str类型的默认值,最终返回&str:
use std::collections::HashMap; fn main() { let replacement_numbers = HashMap::from([ ("one", "1"), ("two", "2"), ("three", "3"), ]); let number: &str = "one"; let default_number: &str = "0"; let replacement = replacement_numbers .get(number) .cloned() // 将Option<&&str>转为Option<&str> .unwrap_or(default_number) // 直接传入&str,返回&str .to_digit(10) .expect("Should be a number!"); println!("{}", replacement); }
内容的提问来源于stack exchange,提问作者Willem
相关产品推荐
相关产品推荐

