为何&&str上String::from(*d)与*d.to_string()结果不同?
理清&&str上String::from(d)和d.to_string()的差异
嘿,我来帮你拆解这个Rust里的小疑惑!咱们一步步来分析:
为什么String::from(*d)能正常工作?
当d是&&str类型时,*d会把它解引用成&str类型。而String类型实现了From<&str> trait,String::from可以直接接收&str作为参数,把它转换成String,所以这一步编译器完全能匹配到正确的实现,自然不会报错。
为什么*d.to_string()会报错?
这里的核心坑是运算符优先级!在Rust里,方法调用(.)的优先级比解引用运算符*高得多。所以你写的*d.to_string(),编译器实际解析的是*(d.to_string()),而不是你以为的(*d).to_string()。
咱们拆解这个错误流程:
- 首先
d是&&str,它可以通过Deref强制转换为&str,而&str实现了ToStringtrait,所以d.to_string()会返回一个String对象。 - 然后你对这个
String做解引用*,得到的是str类型——但str是动态大小类型(DST),它不能直接作为一个独立的值存在于栈上,必须被包裹在指针或者智能指针里,所以编译器就会抛出错误。
正确的写法
如果你想先解引用d再调用to_string(),得加上括号明确优先级:
(*d).to_string()
这样先把&&str解引用成&str,再调用to_string(),就会和String::from(*d)得到完全一样的结果——因为&str的to_string()内部本质上就是基于String::from实现的。
两者的本质差异
String::from(*d):直接利用From<&str>的trait实现,把解引用后的&str转换成String。- 正确的
(*d).to_string():通过ToStringtrait的默认实现(调用From),同样完成&str到String的转换,和前者逻辑一致。
内容的提问来源于stack exchange,提问作者Logan Reed
相关产品推荐
相关产品推荐

