【问题标题】:What is a function signature and type?什么是函数签名和类型?
【发布时间】:2017-06-28 16:35:14
【问题描述】:

我在我正在研究的一个 Scheme 解释器中找到了下面的类型别名。在评估 AST 时,它将函数识别为原生支持的函数或用户定义的函数。我理解Enum 定义的第二部分,但第一部分让我无法理解。

pub enum Function {
    Native(ValueOperation),
    Scheme(Vec<String>, Vec<Value>, Rc<RefCell<Environment>>),
}


type ValueOperation = fn(&[Value], Rc<RefCell<Environment>>) -> Result<Value, RuntimeError>;

这种类型别名如何工作?这个定义是否说 ValueOperation 只是函数签名的简写?我在官方文档/书籍中找不到任何提及此成语的内容。

为函数签名定义类型别名的目的是什么?你能用它“做什么”?它是某种函数指针吗?

【问题讨论】:

  • 类型别名在Type Aliases section of the book中解释;有什么不清楚的地方吗?
  • 是的。即,为函数签名定义类型别名的目的是什么?你能用它“做什么”?它是某种函数指针吗?
  • 这不是函数签名;它是一个函数指针类型。 const X: i32 = 0;i32,因为 fn f(i32) -&gt; String { ... }fn(i32) -&gt; String。它是一种与任何其他类型一样的类型。所有这一切都是用给定的签名定义一个函数指针类型。涉及类型别名是无关紧要的;它不会改变任何东西。

标签: rust idioms


【解决方案1】:

函数的签名描述:

  • 它的名字
  • 它的论点
  • 结果
  • 在泛型函数的情况下,它的泛型参数,具有潜在的特定边界

例如,如果你定义:

fn hello(s: &str) {
    println!("Hello {}", s);
}

函数签名是fn hello(&amp;str)


在Rust中,每个函数都有一个唯一的type,不能命名。

但是,如果你有一个函数,你也可以将它强制转换为一个通用的fn 类型,它不关心函数的身份,而只关心它的使用方式。

对于上述函数,此泛型类型为:fn(&amp;str)(或 fn(&amp;str) -&gt; (),如果我们希望明确)。


这种泛型类型对于抽象具有相似签名的多个函数很有用。例如:

fn add(left: i32, right: i32) -> i32 { left + right }
fn sub(left: i32, right: i32) -> i32 { left - right }

fn select(name: &str) -> fn(i32, i32) -> i32 {
    match name {
        "add" => add,
        "sub" => sub,
        _ => unimplemented!(),
    }
}

fn main() {
    let fun = select("add");
    println!("{} + {} = {}", 1, 2, fun(1, 2));
}

它类似于 C 或 C++ 中的函数指针,但与函数指针不同,它不能为空。

如果你需要一个可以为空的函数,你可以改用Option&lt;fn(i32, i32) -&gt; i32&gt;


因此我们终于找到了这个类型别名:它只是一个快捷方式,因为通用的fn 类型很长。像任何其他类型别名一样。

【讨论】:

  • 完美解释! TYVM。
  • 另外,“函数标识”我假设您的意思是 函数名称,即“你好”?
  • @neektza:不...不是真的。在泛型函数的情况下,泛型函数的每个实例都有自己的标识,所以有点复杂。
  • 您能否指出文档的相关部分(与“功能标识”相关)?
  • @trentcl:我没有类型理论背景,所以...我希望我们可以说fn(&amp;str) -&gt; ()hello 实际类型的超类型,但这是应该向 rustc 开发人员之一(例如 Niko)提出的问题。
猜你喜欢
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
  • 2022-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-20
相关资源
最近更新 更多