首页 > 其他分享 >rust 使用借用类型作为参数

rust 使用借用类型作为参数

时间:2023-11-04 14:44:36浏览次数:29  
标签:slice String num 参数 借用 类型 let rust string

使用借用类型作为参数

编码时应该总是倾向于使用借用类型而不是借用所有类型。

对于String类型来说,应该倾向于使用使用&str,而不是&String

#[allow(unused)]
fn main() {
    let string: String = "hello".to_string();
    let borrow_string: &String = &string;
    let borrow_str: &str = string.as_str();
}

使用借用类型可以避免已经提供一层间接性的所有类型上的多层间接

String类型具有一层间接,因为String类型的本质是一个具有三个字段的胖指针分别是ptr(指向在堆上的具体的内容)cap(容量)len

&String具有两层引用,是因为是String的基础上,加了&,所以borrow_string指针ptr指向的是string,而不是堆上的内容;

&str类型也是一个胖指针,直接指向栈上的内容。ptrlen

对于T类型来说,应该倾向于 使用&[T]而不是&Vec[T];应该倾向于使用&T而不是&Box<T>

如果函数希望读取某个类型的元素,那么它应该接收一个&[T]类型参数,而不是一个&Vec[T]类型参数。这样,调用方可以传递一个Vec[T]、数组等等。

#[allow(unused)]
fn print_elements(slice: &[i32]) {
    for &num in slice {
        println!("{}", num);
    }
}

#[allow(unused)]
fn main() {
    let vec = vec![1, 2, 3];
    let slice = &vec[..];
    
    print_elements(slice);
}

如果函数希望读取某个类型的可变元素,那么它应该接收一个&mut [T]类型参数,而不是一个&mut Vec[T]类型参数。这样,调用方可以传递一个Vec[T]、数组等等。

#[allow(unused)]
fn double_elements(slice: &mut [i32]) {
    for num in slice {
        *num *= 2;
    }
}

#[allow(unused)]
fn main() {
    let mut vec = vec![1, 2, 3];
    let slice = &mut vec[..];
    
    double_elements(slice);
    
    println!("{:?}", slice);
}

如果函数希望读取一个单独的元素,那么它应该接收一个&T类型参数,而不是一个&Box[T]类型参数。

#[allow(unused)]
fn print_element(num: &i32) {
    println!("{}", num);
}

#[allow(unused)]
fn main() {
    let num = Box::new(42);
    let b_num = &num;
    
    print_element(b_num);
}

使用借用类型有助于编写更具通用性的代码,因为它们允许调用方使用不同类型的值(例如Vec[T]、数组、Box[T]等)调用函数。这样可以提高代码的灵活性和可重用性。

标签:slice,String,num,参数,借用,类型,let,rust,string
From: https://www.cnblogs.com/liuzonglin/p/17809312.html

相关文章

  • rust PBFT
    PBFT(PracticalByzantineFaultTolerance)PBFT(PracticalByzantineFaultTolerance)算法是一种分布式共识算法,旨在解决拜占庭将军问题(ByzantineGeneralsProblem)。拜占庭将军问题是指在分布式系统中,由于网络故障或者节点故障等原因,导致节点之间无法达成共识或者达成错误的共识。......
  • rust Unsurprising
    Unsurprising(不意外)最少意外原则接口应尽可能直观(可预测,用户能猜对)至少应该不让人感到惊奇核心思想贴近用户已经知道的东西(不必重学概念)让接口可测试命名实践实现常用的Traits人体工程学(Ergonomic)Traits包装类型(WrapperType)命名实践接口的名称,应符......
  • rust p2p
    p2p[+]Expanddescriptionp2p简介P2P:peer-to-peer(点对点)P2P是一种网络技术,可以在不同的计算机之间共享各种计算资源,如CPU、网络带宽和存储。P2P是当今用户在线共享文件(如音乐、图像和其他数字媒体)的一种非常常用的方法。Bittorrent和Gnutella是流行的文件共享p2p......
  • rust async
    asyncSend和Sync在跨线程时需要关注Send:ownership(所有权)可以send到其他线程AtypeisSendifitissafetosendittoanotherthread.Sync:可以并发,无线程安全问题AtypeisSyncifitissafetosharebetweenthreads(TisSyncifandonlyif&T......
  • Rust 结构体的方法描述
    Rust结构体的方法描述原文地址:https://rustwiki.org/zh-CN/rust-by-example/fn/methods.htmlRust的方法(method)是依附于对象的函数。这些方法通过关键字self来访问对象中的数据和其他。方法在impl代码块中定义。静态方法(staticmethod)静态方法不需要实例来调用,把结构体......
  • C++参数解析参数
    《C/C++参数解析》1.getopt库的使用  getopt用于解析程序命令行输入的参数,可解析短参数和长参数;解析短参数使用getopt()函数,解析长参数可使用getopt_long();1.1getopt()解析短参数  getopt()函数用来解析短参数,例如-a或者-b100这样的参数,不能解析长参数,如--ip198.11.2......
  • spring boot aop 中获取requestbody参数
    packagecom.xkcoding.log.aop.aspectj;importjava.io.BufferedReader;importjava.io.IOException;importjava.util.Map;importjava.util.Objects;importjavax.servlet.http.HttpServletRequest;importorg.aspectj.lang.JoinPoint;importorg.aspectj.lang.Pr......
  • JavaScript 函数、函数构造、函数调用、参数、函数返回值、变量的作用域、预解析
    一、函数及函数的构造函数是一个可重用的代码块,用来完成某个特定功能。每当需要反复执行一段代码时,可以利用函数来避免重复书写相同代码。函数包含着的代码只能在函数被调用时才会执行,就可以避免页面载入时执行该脚本简单来说就是一个封装,封装的是一个特定的功能,重复使用函......
  • 如何获取URL参数使用jQuery或纯JavaScript?
    内容来自DOChttps://q.houxu6.top/?s=如何获取URL参数使用jQuery或纯JavaScript?我看过很多jQuery示例,其中参数的大小和名称是未知的。我的URL只会有一个字符串:http://example.com?sent=yes我只想检测:sent是否存在?它是否等于"yes"?最佳解决方案这里。vargetUrlPar......
  • 信宇宙 TrustVerse:Web3.0数字资产管理
    在数字时代,个人和机构越来越依赖数字资产,这包括加密货币、数字证券、艺术品、不动产等各种价值存储形式。随着数字资产的重要性不断增加,安全性和管理变得至关重要。元信宇宙(TrustVerse)应运而生,旨在成为数字资产管理的未来,充分整合了Web3.0技术,智能生态网络(IEN)作为一种创新性的网络......