Rust中如何确定传递给函数的SymSpell变量类型?
解决SymSpell实例的函数参数类型声明问题
核心问题在于levenshtein是函数项类型(每个函数有唯一的专属类型),而非通用的函数指针类型fn(&str, &str) -> usize,直接指定后者会导致类型不匹配。以下是两种可行的解决方案:
方案一:使用泛型参数(推荐,无性能开销)
利用Rust的泛型推断,通过特征约束匹配距离函数的类型,无需手动指定具体类型:
use fuzzy_search::{distance::levenshtein, symspell::SymSpell}; // 函数定义:用泛型D约束为满足Fn(&str, &str) -> usize的类型 fn perform_query<D>(matcher: &SymSpell<D>, query: &str) -> Vec<(String, usize)> where D: Fn(&str, &str) -> usize, { matcher.search(query).collect() } // 调用示例 fn main() { let all_name_strings = vec!["apple", "banana", "cherry"]; let mut matcher = SymSpell::new(levenshtein, 2); for ns in all_name_strings { matcher.insert(ns); } let results = perform_query(&matcher, "appel"); println!("{:?}", results); }
方案二:转换为函数指针(适合非泛型场景)
将levenshtein强制转换为通用函数指针类型,这样就可以直接在函数中指定SymSpell的类型参数:
use fuzzy_search::{distance::levenshtein, symspell::SymSpell}; // 函数定义:直接使用函数指针作为类型参数 fn perform_query(matcher: &SymSpell<fn(&str, &str) -> usize>, query: &str) -> Vec<(String, usize)> { matcher.search(query).collect() } // 创建实例时转换函数类型 fn main() { let all_name_strings = vec!["apple", "banana", "cherry"]; // 将levenshtein转为函数指针 let mut matcher = SymSpell::new(levenshtein as fn(&str, &str) -> usize, 2); for ns in all_name_strings { matcher.insert(ns); } let results = perform_query(&matcher, "appel"); println!("{:?}", results); }
注意:这种方式会引入轻微的间接调用开销,对性能敏感的场景优先选方案一。
内容的提问来源于stack exchange,提问作者Nick K9
相关产品推荐
相关产品推荐

