如何使结构可调用?

2024-01-30

#![feature(unboxed_closures)]
#![feature(fn_traits)]

struct foo;

impl std::ops::Add for foo {
    type Output = foo;
    fn add(self, x: foo) -> foo {
        println!("Add for foo");
        x
    }
}

impl Fn for foo {
    extern "rust-call" fn call(&self) -> Self {
        println!("Call for Foo ");
        self
    }
}

fn main() {
    let x = foo;
    let y = foo;
    x + y;

    x();
}

我实施了Add特征,但我不明白如何将结构作为函数调用。我收到错误:

error[E0243]: wrong number of type arguments: expected 1, found 0
  --> src/main.rs:14:10
   |
14 |     impl Fn for foo {
   |          ^^ expected 1 type argument

我是 Rust 新手,找不到如何实现这件事的示例。


您还不能实施Fn*稳定 Rust 的特征。这只能通过使用夜间编译器来实现#[feature]!

这非常有用充分阅读您正在实施的特征看看如何实现它。这Fn trait https://doc.rust-lang.org/std/ops/trait.Fn.html定义为:

pub trait Fn<Args>: FnMut<Args> {
    extern "rust-call" fn call(&self, args: Args) -> Self::Output;
}

注意到实现和定义之间有什么区别吗?我看到很多:

  1. 该实现没有提供价值Args!这就是编译器所指出的。也可以看看类型参数数量错误:预期为 1,但发现为 0 https://stackoverflow.com/q/25272392/155423

  2. 该实现没有实现超级特征FnMut https://doc.rust-lang.org/std/ops/trait.FnMut.html,这本身就需要超特质FnOnce https://doc.rust-lang.org/std/ops/trait.FnOnce.html. FnOnce是哪里关联类型 Output被宣布。

  3. 该实现忽略了定义具体类型Output应该。

  4. 执行返回Self当特质回归时Self::Output.

  5. 该实现不接受第二个参数call。该参数包含传入的任何参数。

此外,Rust 中的类型使用PascalCase, not snake_case,所以应该是Foo.

#![feature(unboxed_closures)]
#![feature(fn_traits)]

struct Foo;

impl Fn<()> for Foo {
    extern "rust-call" fn call(&self, _args: ()) {
        println!("Call (Fn) for Foo");
    }
}

impl FnMut<()> for Foo {
    extern "rust-call" fn call_mut(&mut self, _args: ()) {
        println!("Call (FnMut) for Foo");
    }
}

impl FnOnce<()> for Foo {
    type Output = ();

    extern "rust-call" fn call_once(self, _args: ()) {
        println!("Call (FnOnce) for Foo");
    }
}

fn main() {
    let x = Foo;
    x();
}

但通常情况下,只有一个特征的实现会包含有趣的代码,而其他特征实现将委托给它:

extern "rust-call" fn call(&self, args: ()) {
    println!("Foo called, took args: {:?}", args);
}

// ...

extern "rust-call" fn call_mut(&mut self, args: ()) {
    self.call(args)
}

// ...

extern "rust-call" fn call_once(self, args: ()) {
    self.call(args)
}

也可以看看:

  • 什么是 crate 属性以及在哪里添加它? https://stackoverflow.com/q/27454761/155423
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使结构可调用? 的相关文章

随机推荐

  • 重置选择器无法正确重置表数据

    我有一个带有多个选项的选择器和一个重置按钮 单击该按钮时必须将选择器重置为第一个选项 单击该按钮时将重置选择器 但表中的数据不会更改 这些是选择器和按钮
  • 用于在 Android 版 Firefox 中激活阅读器模式的书签

    最近 Android 上的 Firefox 发生了变化 这使得我无法使用向阅读列表添加内容并从那里打开它以强制页面进入阅读器模式的变通办法 考虑到这一点 我试图找到并最终制作一个小书签 以强制页面进入阅读器模式 到目前为止 我发现通过在 u
  • 如何使用 Google Apps 脚本替换电子表格中的文本?

    我想在电子表格中找到指定的文本并将其替换为其他单词 我这样尝试过 sheet SpreadsheetApp getActiveSheet sheet replaceText ga sessions Sessions 然后它说 Cannot
  • 后端使用Vite

    我们使用 Vite 作为前端 在 SvelteKit 内 它可以很好地创建 SSR 和前端代码 我特别喜欢通过 esbuild 预捆绑第 3 方软件包 有人可以告诉我是否可以将 Vite 捆绑管道用于仅后端项目 基于 koa 的 Nodej
  • iOS Swift Mi Scale 2 蓝牙称重

    我正在编写一个可以从小米米秤2获取体重测量的应用程序 读取所有可用的uuid后 只有 181B 连接 特别是 2A9C 特征 蓝牙GATT中的体重测量 收到通知 值数据为 2 164 178 7 1 1 2 58 56 253 255 24
  • 在 php-fpm/mod_fastcgi 中使用 mod_headers 时出现问题

    我正在尝试添加HSTS http en wikipedia org wiki HTTP Strict Transport Security我的应用程序中每个响应的标题 我的第一个想法是使用 mod headers 我将此指令放置在文档根目录
  • WCF REST 服务 POST 在 IIS 上返回 404 Not Found

    我在Win8上用VS2012创建了一个WCF服务 如果我通过 VS localhost port 启动服务 我就可以执行 GET 和 POST 操作 当我部署到同一台计算机上的 IIS 时 只有 GET 有效 POST 返回 404 Not
  • ListView:通过 Filterable 进行过滤与使用新 URI 重新启动 CursorLoader

    The ListView实现过滤内容的方法 您能详细说明一下什么时候应该使用它吗 据我了解 这种过滤适用于基于数组的适配器 所有数据都已经在内存中 这样 过滤器只是帮助跳过不应该显示的数据 然而 如果ListView与游标适配器 SQLit
  • 清单合并失败:uses-sdk:minSdkVersion 8 不能更小

    问题是 Error Execution failed for task app processDebugManifest 清单合并失败 uses sdk minSdkVersion 8 不能小于库 com android support s
  • 运行 showdown.js 服务器端将 Markdown 转换为 HTML(在 PHP 中)

    我正在尝试在我的网站上实现 WMD 并且想知道如何运行 showdown js 服务器端以将 markdown 转换为 HTML 为了将两者存储在数据库中 我正在使用 PHP 任何提示都会有帮助 之前从未从 php 运行过任何类型的 js
  • 升级到 AngularDart 0.13.0 并收到有关路由和 di 的错误

    我升级到 AngularDart 0 13 0 但收到以下错误 使用新的路由模块初始化 RoutingModule 的正确方法是什么di包2 0 1 In main dart I have class RoutingModule exten
  • 运行时异常 (Chromecast)

    我尝试配置 Chromecast 但收到 RuntimeException 并且不明白原因 Fabric 有日志 致命异常 java lang RuntimeException 无法启动活动 ComponentInfo activity T
  • 在 Google App Engine 上使用 Python 验证 Android 应用内购买消息的签名

    Android 开发人员网站上的示例应用程序使用 java 代码验证购买 json 有没有人有幸弄清楚如何用 python 验证购买 特别是在 GAE 中 以下是android应用内计费的相关摘录示例程序 http developer an
  • 模式浏览器不显示我在 Solr 中添加到 schema.xml 中的字段

    我在 solr v5 1 中创建的名为 Core3 的核心的 schema xml 中添加了一些字段 我不是指示例文件夹 而是使用 服务器 文件夹来运行 solr 服务器并创建 solr 核心 我使用 bin 文件夹中提供的 solr cr
  • MVVM Light WPF 打开新窗口

    我是 MVVM 新手 正在使用 MVVM Light 学习它 我在 wpf 中有一个带有登录窗口的应用程序 当用户输入正确的凭据时 登录窗口应关闭并应打开一个新的主窗口 登录部分已经可以工作 但是如何打开一个新窗口并关闭当前窗口 login
  • F# 中的命令式多态性

    OCaml 的 Hindley Milner 类型系统不允许命令式多态性 类似于 System F 除非通过最近对记录类型的扩展 这同样适用于 F 然而 有时需要将用命令式多态性 例如 Coq 编写的程序翻译成此类语言 Coq 的 OCam
  • Rails 5 多个清单文件的问题

    我的问题 在我的 Rails 5 应用程序中 我有 2 个布局 因此我需要设置多个清单文件 我做了什么 我做了以下事情 The two layouts have a user html erb and a main html erbhtml
  • Bootstrap 模态表单发布两次 Django

    我正在按照以下指示进行操作django bootstrap modal forms django bootstrap modal forms https pypi org project django bootstrap modal for
  • 使地图图钉从簇中分散开来

    我的地图有两个自定义注释类 一个用于与某个位置相关的单个帖子 另一个用于这些帖子的集群 该集群存储指向它包含的所有帖子的指针 以及中心纬度 经度位置 使用它包含的帖子的位置计算 我的行为是 当我单击集群注释时 它会删除该集群并将其帖子添加到
  • 如何使结构可调用?

    feature unboxed closures feature fn traits struct foo impl std ops Add for foo type Output foo fn add self x foo gt foo