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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 06:42:34