rust学习-类型转换

这篇具有很好参考价值的文章主要介绍了rust学习-类型转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基本类型转换

// 不显示类型转换产生的溢出警告。
#![allow(overflowing_literals)]

fn main() {
    let decimal = 65.4321_f32;

    // 错误!不提供隐式转换
    // let integer: u8 = decimal;

    // 可以显式转换
    let integer = decimal as u8;
    let character = integer as char;

    println!("Casting: {} -> {} -> {}", decimal, integer, character);

    // 当把任何类型转换为无符号类型 T 时,会不断加上或减去 (std::T::MAX + 1)
    // 直到值位于新类型 T 的范围内。

    // 1000 已经在 u16 的范围内
    println!("1000 as a u16 is: {}", 1000 as u16);

    // 1000 - 256 - 256 - 256 = 232
    // 事实上的处理方式是:从最低有效位(LSB,least significant bits)开始保留
    // 8 位,然后剩余位置,直到最高有效位(MSB,most significant bit)都被抛弃。
    // 译注:MSB 就是二进制的最高位,LSB 就是二进制的最低位,按日常书写习惯就是
    // 最左边一位和最右边一位。
    println!("1000 as a u8 is : {}", 1000 as u8);
    // -1 + 256 = 255
    println!("  -1 as a u8 is : {}", (-1i8) as u8);

    // 对正数,这就和取模一样。
    println!("1000 mod 256 is : {}", 1000 % 256);

    // 当转换到有符号类型时,(位操作的)结果就和 “先转换到对应的无符号类型,
    // 如果 MSB 是 1,则该值为负” 是一样的。

    // 当然如果数值已经在目标类型的范围内,就直接把它放进去。
    println!(" 128 as a i16 is: {}", 128 as i16);
    // 128 转成 u8 还是 128,但转到 i8 相当于给 128 取八位的二进制补码,其值是:
    println!(" 128 as a i8 is : {}", 128 as i8);

    // 重复之前的例子
    // 1000 as u8 -> 232
    println!("1000 as a u8 is : {}", 1000 as u8);
    // 232 的二进制补码是 -24
    println!(" 232 as a i8 is : {}", 232 as i8);
}

Casting: 65.4321 -> 65 -> A
1000 as a u16 is: 1000
1000 as a u8 is : 232
  -1 as a u8 is : 255
1000 mod 256 is : 232
 128 as a i16 is: 128
 128 as a i8 is : -128
1000 as a u8 is : 232
 232 as a i8 is : -24

From

根据其他类型生成自己

use std::convert::From;

#[derive(Debug)]
struct Number {
    value: i32,
}

impl From<i32> for Number {
    fn from(item: i32) -> Self {
        Number { value: item }
    }
}

fn main() {
	// 左边不需要类型,右边类似构造
    let num = Number::from(30);
    println!("My number is {:?}", num);
}
let my_str = "hello";
let my_string = String::from(my_str);

Into

把其他类型转为目的类型

use std::convert::From;

#[derive(Debug)]
struct Number {
    value: i32,
}

// 有了From,就自然有了Into
impl From<i32> for Number {
    fn from(item: i32) -> Self {
        Number { value: item }
    }
}

fn main() {
    let int = 5;
    // 左边需要类型,右边才能推断
    // a类型可根据c类型构造,b类型也可根据c类型构造
    // 如果让c类型直接into,c不知道是转为a还是b
    let num: Number = int.into();
    println!("My number is {:?}", num);
}

TryFrom 和 TryInto

use std::convert::TryFrom;
use std::convert::TryInto;

#[derive(Debug, PartialEq)]
struct EvenNumber(i32);

impl TryFrom<i32> for EvenNumber {
    type Error = ();

    fn try_from(value: i32) -> Result<Self, Self::Error> {
        if value % 2 == 0 {
            Ok(EvenNumber(value))
        } else {
            Err(())
        }
    }
}

fn main() {
    // TryFrom
    assert_eq!(EvenNumber::try_from(8), Ok(EvenNumber(8)));
    assert_eq!(EvenNumber::try_from(5), Err(()));

    // TryInto
    let result: Result<EvenNumber, ()> = 8i32.try_into();
    assert_eq!(result, Ok(EvenNumber(8)));
    let result: Result<EvenNumber, ()> = 5i32.try_into();
    assert_eq!(result, Err(()));
}

ToString

要把任何类型转换成 String,只需要实现那个类型的 ToString trait

use std::string::ToString;

struct Circle {
    radius: i32
}

impl ToString for Circle {
    fn to_string(&self) -> String {
        format!("Circle of radius {:?}", self.radius)
    }
}

fn main() {
    let circle = Circle { radius: 6 };
    println!("{}", circle.to_string());
}

实现fmt::Display trait,它会自动提供 ToString,并且还可以用来打印类型

use std::fmt;

struct Circle {
    radius: i32
}

impl fmt::Display for Circle {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "Circle of radius {}", self.radius)
    }
}

fn main() {
    let circle = Circle { radius: 6 };
    println!("{}", circle.to_string());
}

解析字符串为数字

  • 用 parse 函数
    只要对目标类型实现了 FromStr trait,就可以用 parse 把字符串转换成目标类型

  • “涡轮鱼” 语法(turbo fish,<>)

fn main() {
    let parsed: i32 = "5".parse().unwrap();
    let turbo_parsed = "10".parse::<i32>().unwrap();

    let sum = parsed + turbo_parsed;
    println!{"Sum: {:?}", sum};
}

总结

From和Info看着都用于构造,只不过From需要显式构造,Info有点半隐

附录

空错误类型

type Error = () 表示一个简单的空错误类型,称为“单元类型”/“单元错误”
() 空括号类型定义为 Error 的别名,来表示错误类型,不包含有用信息,只表示有错误发生。

Rust 内置了一个 Result<T, E> 枚举类型,用于处理可能发生错误的操作。
在这种情况下,类型别名 Error 可以被用作 Result<T, E> 枚举类型中的错误类型 E 的别名,表示可能出现的错误不需要包含详细的错误信息。

在 Rust 中,() 表示一个空元组类型,因此一个空错误类型可以表示为一个空元组类型的别名。文章来源地址https://www.toymoban.com/news/detail-674967.html

// 定义了一个名称为 `Result` 的新类型别名
// 这个新类型在 `std::result::Result<T, E>` 类型的基础上重新声明
type Result<T> = std::result::Result<T, Error>;

fn process_data(data: &str) -> Result<usize> {
    if data.len() > 10 {
        Ok(data.len())
    } else {
    	// 返回空错误
        Err(())
    }
}

到了这里,关于rust学习-类型转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言——类型转换

    数据有不同的类型,不同类型数据之间进行混合运算时涉及到类型的转换问题。 转换的方法有两种: 自动转换(隐式转换):遵循一定的规则,由编译系统自动完成 强制类型转换:把表达式的运算结果强制转换成所需的数据类型 语法格式: (类型)变量或常量 类型转换的原则:

    2024年02月11日
    浏览(38)
  • 【C语言笔记】C语言数据类型转换

    C语言中有很多数据类型,这些数据类型在内存中的存储形式不一样,为了计算方便,编译器不得不将某一种数据类型转换成另一种数据类型。本篇将介绍C语言中各种数据类型转换的规则。 自动类型转换指的是编译器在编译时自动的、隐式的进行的类型转换。 将一种类型的数

    2024年02月02日
    浏览(90)
  • Rust 学习笔记 - 流程控制 与 Range 类型

    任何一门编程语言几乎都脱离不了:变量、基本类型、函数、注释、循环、条件判断,这是一门编程语言的语法基础,只有当掌握这些基础语法及概念才能更好的学习 Rust。 if 语句在其他语言中很常见,这里不再多做解释,看注释即可。 if  表达式也支持 if...else if...else 语句

    2024年02月20日
    浏览(39)
  • C语言——函数指针类型转换

    昨天为了避免跨层调用API搞了个回调函数,用了函数指针,因为参数类型的问题总是编译报错,今天就看了两篇博文学习学习,顺便做做笔记。 其实正常来讲只要把函数指针的参数个数、类型和返回值这些函数指针的标签或者说是属性写对了的话就不会有社么问题,但我也不

    2024年01月16日
    浏览(35)
  • C语言编程—强制类型转换

    强制类型转换是把变量从一种类型转换为另一种数据类型。例如,如果您想存储一个 long 类型的值到一个简单的整型中,您需要把 long 类型强制转换为 int 类型。您可以使用 强制类型转换运算符 来把值显式地从一种类型转换为另一种类型,如下所示: 请看下面的实例,使用

    2024年02月11日
    浏览(42)
  • 『C语言』隐式类型转换规则

    🔥 博客主页 : 小羊失眠啦. 🔖 系列专栏 : C语言 🌥️ 每日语录 : 但行前路,不负韶华! ❤️ 感谢大家点赞👍收藏⭐评论✍️ 今天小羊又来给铁汁们分享关于C语言的 隐式类型转换规则 ,在C语言中类型转换方式可分为 隐式类型转换 和 显式类型转换 (强制类型转换),

    2024年02月12日
    浏览(38)
  • 『C语言进阶』隐式类型转换规则

    🔥 博客主页 : 小羊失眠啦. 🔖 系列专栏 : C语言 🌥️ 每日语录 : 但行前路,不负韶华! ❤️ 感谢大家点赞👍收藏⭐评论✍️ 今天小羊又来给铁汁们分享关于C语言的 隐式类型转换规则 ,在C语言中类型转换方式可分为 隐式类型转换 和 显式类型转换 (强制类型转换),

    2024年02月10日
    浏览(48)
  • C语言中的char类型和int类型的相互转换

    C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植等特点。C语言中有多种数据类型,用来表示不同的数据和信息。本文将介绍C语言中的两种基本数据类型:char类型和int类型,以及它们之间的相互转换的方法和原理。 char类型是一种字符类型,用来表示单个字符,

    2024年02月03日
    浏览(54)
  • C 语言:类型转换与常量的细致理解

    有时,您必须将一种数据类型的值转换为另一种类型。这称为 类型转换 当您将一种类型的值分配给另一种类型的变量时,编译器会自动进行隐式转换。 例如,如果您将一个 int 值分配给一个 float 类型: 如您所见,编译器会自动将 int 值 9 转换为 float 值 9.000000。 这可能是危

    2024年02月04日
    浏览(38)
  • Go 语言中的接口类型转换详解

    Go 语言是一门静态类型的语言,其中类型转换是一项基本的操作。在 Go 中,接口类型转换是一种特殊的类型转换,它涉及到将一个接口类型的值转换为其他具体类型的值。这个过程涉及到类型断言(Type Assertion)和类型判断(Type Switching)。本篇博客将深入探讨 Go 语言中接口

    2024年01月21日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包