You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 10:45:58