Rust 的泛型 FromStr 对象可以做什么?

2023-12-02

Rust's str类有一个parse方法返回一个FromStr目的。parse是模板化的,因此正在解析的类型str可以手动指定,例如"3".parse::<i32>()评估为(aResult包含)32 位 int 的对象3.

但未能指定类型本身似乎并不是一个错误。相反,我在尝试打印结果时收到错误(通用/未指定)FromStr object:

let foo = "3".parse();
match foo
{
    Ok(m) => println!("foo: {}", m),
    Err(e) => println!("error! {}", e)
}

这确实not在第一行给出错误;相反,我收到以下错误:

<anon>:24:12: 24:13 error: unable to infer enough type information about `_`; type annotations or generic parameter binding required [E0282]
<anon>:24         Ok(m) => println!("foo: {}", m),

(这里,第 24 行是带有Ok(m).)

那么什么是m这里?或者“无法推断足够的类型信息”错误实际上是由于以下事实造成的:parse实际上can't在没有类型说明符的情况下调用,编译器不会捕获错误,直到结果的第一行Ok实际使用的类型?


Rust's str类有一个parse方法返回一个FromStr object.

就在这里停下来,这是你的错误。

parse不返回FromStr目的;FromStr is a trait这可以被认为是抽象类如果您来自 OO 背景,并且无法返回具有抽象类型的对象:它是抽象的!

What parse确实返回,因此是某种类型的实例T其中必须实施FromStr界面。

但未能指定类型本身似乎并不是一个错误。相反,我在尝试打印结果时收到错误(通用/未指定)FromStr object

因为不可能有这样的通用/非特定的FromStr目的。必须(从上下文)推断出具体类型或明确阐明该类型,并且该类型必须实现FromStr.

那么什么是m here?

只有你知道它应该是什么,编译器不知道,因此抱怨它不知道该怎么做:)

或者“无法推断足够的类型信息”错误实际上是由于事实上在没有类型说明符的情况下无法调用 parse,并且编译器只是在生成结果的第一行之前才捕获错误Ok实际使用的类型?

基本上。

只是编译器直到结果的第一行才捕获错误。Ok使用更多,编译器在推断类型时会立即考虑完整的函数。从编译器的角度来看,推断类型的实际线索是立即出现还是向下 50 行出现并不重要,它只需要出现在当前函数体中即可。

从开发人员的角度来看,这可能会导致对缺乏类型的抱怨源自一个奇怪的地方;这是类型推断的缺点之一。另一方面,编译器无法知道您希望将注释放在哪里。毕竟有很多种可能性:

// Example 1: immediately specifying the type
fn main() {
    let foo = "3".parse::<i32>();
    match foo
    {
        Ok(m) => println!("foo: {}", m),
        Err(e) => println!("error! {}", e)
    }
}

// Example 2: partially specifying the result type
// Note: the "_" is deduced to be std::num::ParseIntError because
//       this is how `FromStr::Err` is defined for `i32`.
fn main() {
    let foo: Result<i32, _> = "3".parse();
    match foo
    {
        Ok(m) => println!("foo: {}", m),
        Err(e) => println!("error! {}", e)
    }
}

// Example 3: specifying the result type of unwrapping
fn doit() -> Result<(), std::num::ParseIntError> {
    let foo: i32 = try!("3".parse());
    println!("foo: {}", foo);
    Ok(())
}

fn main() {
    match doit()
    {
        Ok(_) => (),
        Err(e) => println!("error! {}", e)
    }
}

// Example 4: letting the type be inferred from a function call
fn callit(f: i32) {
    println!("f: {}", f);
}

fn main() {
    let foo = "3".parse();
    match foo
    {
        Ok(m) => callit(m),
        Err(e) => println!("error! {}", e)
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rust 的泛型 FromStr 对象可以做什么? 的相关文章

随机推荐

  • PostgreSQL 和 JDBC 的 ClassNotFoundException

    我在与 Java 和 PostgreSQL 数据库建立连接时遇到一些困难 我已经下载了JDBC4 Postgresql 驱动程序 版本 9 2 1002驱动程序并正确设置应用程序 ClassPath 我的代码如下 import java s
  • socket.io 房间或命名空间?

    我正在研究 nodejs socket io 进行实时聊天 我需要一些关于实施房间的建议 使用命名空间或使用房间功能来完全隔离聊天组 哪个更好 房间和命名空间之间真正的技术区别是什么 资源使用情况有区别吗 这就是命名空间和房间所具有的共同点
  • 强制 CMake 查找 x64 位库而不是 x32

    因此 我一直在 stackoverflow 和其他一些论坛中查找如何强制 CMake 查找 x64 库而不是 x32 但它并没有多大帮助 当我做 find package Boost 1 67 0 COMPONENTS atomic REQ
  • 如何在 macOS 终端中批量重命名文件?

    我有一个包含一系列文件的文件夹 名为 prefix 1234 567 png prefix abcd efg png 我想批量删除一个下划线和中间内容 因此输出将是 prefix 567 png prefix efg png 相关但不完全解
  • 我可以将 Zend PDT (eclipse) 链接到浏览器操作吗?

    是否可以在 Eclipse 中配置 Zend PDT 调试器 以与 Eclipse 的 Java 调试器类似的方式从浏览器操作中命中断点 IE 设置断点 启动调试器 浏览站点 然后在遇到断点时进入断点 我可以调试单个脚本和网页 但是我正在尝
  • 如何解析网页

    我试图从 EnviroCanada 天气页面中提取以下内容 我试图按照以下方式获取每小时的数据 时间 大腿 特洛 湿度 7 00 23 23 22 9 22 9 30 提取的 HTML 页面 tr td class text center
  • 如何在 XSLT 中保留元素的开始标记内的空格

    为了避免将敏感信息提交到 SCM 存储库 我编写了一个 XSL 样式表 用于从 ASP NET 中删除连接字符串密码Web config文件 它实现了我删除密码的目标 但它也会影响元素开始标签内的空白 如果可能的话 我想保留这个空白 例如
  • 如何通过 C# 代码更改已过期的 sql server 密码?

    当您使用 SqlConnection 连接到 MS Sql Server 时 如果密码已过期 您将收到 SqlException 编号 18487 或 18488 如何在连接尝试期间更改代码中的用户密码 使用静态SqlConnection
  • 如何允许其他人访问由 Google Apps 脚本制作的网络应用程序?

    我从 Google Apps 脚本部署了一个网络应用程序 但其他人似乎无法运行它 当我登录谷歌时 它运行得很好 我不断得到 要求分享 电子邮件 即使我将源脚本设置为 在网络上公开 执行应用程序 被设定为 用户访问网络应用程序 该应用程序的链
  • Azure Pipelines 第二个作业找不到第一个作业的结果

    我正在开始使用 azure pipelines yml 我想在同一阶段有两份工作 一个用于构建解决方案 另一个用于运行单元测试 问题是第二个作业执行了脚本步骤 但没有找到文件夹Release前一个应该已经创建 trigger master
  • PHP simplexml_load_file 捕获 403

    我正在使用以下 PHP xml simplexml load file request url or die url not loading I use status xml gt Response gt Status gt code 检查
  • Laravel RESTful 控制器参数

    我使用 Laravel 4 和 Angular JS 来使用 RESTful 控制器处理 http 请求 我有一个 RESTful 控制器 UserController具有以下功能 public function getIndex is R
  • 怎样清除手指上的油漆?

    我是 android 新手 我在 Api Demo 中的 FingerPaint java 的帮助下使用手指准备了一个绘画视图 它工作正常 同一个视图包含一个按钮 清除 如果我们单击按钮绘画将被清除 空屏幕和一个按钮 我的问题是如何清除绘画
  • 如何避免Java中的ResultSet已关闭异常?

    一旦我的代码到达我的while rs next 循环它产生ResultSet是关闭异常 是什么原因导致此异常以及如何纠正它 EDIT 我注意到我的代码中正在嵌套while rs next 与另一个循环 rs2 next 两个结果集都来自同一
  • iOS Safari Mobile 不会仅触发一次 pageshow

    iOS Safari 在以下情况下似乎不会触发 pageshow 事件 假设我有 3 页 页面 A 在 pageshow 事件中有一些代码 Page B Page C 用户导航自A gt B 按后退按钮 页面显示触发正常 然后 用户导航到另
  • 如何在 Spring Boot 中获取 DispatcherServeletInitializer 功能

    我们正在寻求将我们的项目迁移到 Spring Boot 但目前尚不清楚如何复制其功能AbstractAnnotationConfigDispatcherServletInitializer在 Spring Boot 中 public cla
  • 如何使用 PHP 更新/编辑 JSON 文件 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 这是我的JSON activity code 1 activity name FOOTBALL activity code 2 activity name CRICKET 我需要更新
  • 为什么 JLabels 上的图像图标在运行时会像素化,但在设计模式下却不会?

    左 设计模式 右 运行 每次我运行程序时 图像图标都会变得像素化或模糊 而且我在任何地方都找不到同样的问题 这些图像在设计模式下看起来不错 有谁知道这个问题的解决方案 我正在使用这行代码来获取图像 private Image img hom
  • 如何在Matlab中从矩阵中提取非垂直列

    我有矩阵 A 和向量 b 它指定要为矩阵的每个相应行提取的元素的列索引 例如 A 1 2 3 4 5 6 7 8 9 b 1 3 2 我想要c 1 6 8 关于输出 如何实现这一目标 I tried A b 但它不能按我的需要工作 可能有一
  • Rust 的泛型 FromStr 对象可以做什么?

    Rust s str类有一个parse方法返回一个FromStr目的 parse是模板化的 因此正在解析的类型str可以手动指定 例如 3 parse