能否不使用生命周期参数编写该Rust变位词检测程序?
能否在不使用生命周期参数的情况下编写该函数?
答案是不能,这和Rust的生命周期推断规则直接相关:
核心原因
你的anagrams_for函数返回的Vec<&str>中的引用,直接来自possible_anagrams切片里的元素。当函数存在多个引用类型参数时(这里是word: &str和possible_anagrams: &[&str]),编译器无法自动判断返回值的引用该和哪个参数的生命周期绑定——它不知道返回的引用依赖的是word还是possible_anagrams中的元素。
因此必须显式标注生命周期,明确告诉编译器:返回的&str生命周期和possible_anagrams里元素的生命周期一致。
优化后的生命周期写法
原代码把所有生命周期绑定到'a是冗余的,因为word的生命周期和返回值无关,可以简化签名:
pub fn anagrams_for<'a>(word: &str, possible_anagrams: &[&'a str]) -> Vec<&'a str>
这里只需要标注'a来关联possible_anagrams的元素和返回值的生命周期,word的生命周期可由编译器自动省略。
额外提示:原is_anagram函数的逻辑问题
顺便提一句,当前的is_anagram逻辑不严谨,比如"aab"和"abb"会被误判为变位词——你只检查了字符是否存在,没统计字符出现次数。可以改成通过排序字符或统计频率实现:
pub fn is_anagram(one_word: &str, other_word: &str) -> bool { if one_word.len() != other_word.len() { return false; } let mut one_chars: Vec<char> = one_word.to_lowercase().collect(); let mut other_chars: Vec<char> = other_word.to_lowercase().collect(); one_chars.sort(); other_chars.sort(); one_chars == other_chars }
(这里加入了大小写不敏感处理,符合变位词的常规定义)
内容的提问来源于stack exchange,提问作者user366312
相关产品推荐
相关产品推荐

