Rust中String转&str出现E0515错误的解决方法求助
修复Rust字谜练习中的E0515编译错误
问题场景
我在完成Rust字谜练习时编写了如下代码,编译时出现错误:
use std::collections::HashSet; pub fn anagrams_for<'a>(word: &str, possible_anagrams: &[&'a str]) -> HashSet<&'a str> { let word_lowercase = word.to_lowercase(); let stream = possible_anagrams.into_iter() .map(|c| c.to_lowercase()) .filter(|c| word_lowercase != *c) .collect::<HashSet<String>>(); let cmp_word = sorted_word(word_lowercase.as_str()); stream.into_iter() .filter(|c| cmp_word == sorted_word(c)) .map(|s| { s.as_str() // line with the error }) .collect::<HashSet<&str>>() } fn sorted_word(word: &str) -> String { let mut word_chars = word.chars().collect::<Vec<char>>(); word_chars.sort_unstable(); word_chars.iter().collect::<String>() }
报错信息:
Compiling anagram v0.0.0 (/mnt/exercism-iteration) error[E0515]: cannot return reference to function parameter `s` --> src/lib.rs:13:13 | 13 | s.as_str() | ^^^^^^^^^^ returns a reference to data owned by the current function
错误原因
你把候选字符串转成了String(通过to_lowercase())后,尝试返回这个String的引用,但这个String是函数内创建的临时对象,迭代结束后会被销毁,引用也就成了悬垂引用——Rust的所有权规则严格禁止这种情况。同时你的逻辑绕了弯路,不需要提前把所有候选转成String集合。
修复后的代码
use std::collections::HashSet; pub fn anagrams_for<'a>(word: &str, possible_anagrams: &[&'a str]) -> HashSet<&'a str> { let word_lower = word.to_lowercase(); let sorted_target = sorted(&word_lower); possible_anagrams .iter() .filter(|&&candidate| { let candidate_lower = candidate.to_lowercase(); // 排除自身(大小写不敏感匹配),同时验证排序后字符一致 candidate_lower != word_lower && sorted(&candidate_lower) == sorted_target }) .cloned() .collect() } fn sorted(word: &str) -> String { let mut chars = word.chars().collect::<Vec<_>>(); chars.sort_unstable(); chars.into_iter().collect() }
关键修改说明
- 直接遍历原候选字符串的引用,避免提前转换
String导致的所有权问题 - 在
filter内部对每个候选生成小写版本,完成「非自身判断」和「字谜匹配判断」 - 用
cloned()将&&str转换为&'a str,匹配返回值的生命周期要求 - 简化
sorted函数的类型推导和字符收集逻辑,提升代码简洁度
内容的提问来源于stack exchange,提问作者rdo
相关产品推荐
相关产品推荐

