当前位置: 首页 > news >正文

做淘宝客网站用什么系统百度客服电话24小时人工服务热线

做淘宝客网站用什么系统,百度客服电话24小时人工服务热线,wordpress首行缩进,vps怎么建多个网站一、一个实际问题 用一个线性代数库的求逆矩阵函数时,让我很不爽,我必须按照下面的形式写调用代码: ...if let Some(inv_mat) try_inverse(mat.clone()) {...}...注意 try_inverse 函数的参数传递形式,函数参数是 mat.clone() 而…

一、一个实际问题

用一个线性代数库的求逆矩阵函数时,让我很不爽,我必须按照下面的形式写调用代码:

	...if let Some(inv_mat) = try_inverse(mat.clone()) {...}...

注意 try_inverse 函数的参数传递形式,函数参数是 mat.clone() 而不是 mat,因为这个 mat 变量后面我还得使用。有看了几个其他的线性代数库,大都是按照这个形式定义的。我不得不思考一下为什么要这么干。

我们看这个函数的几种可能的声明形式:

	fn try_inverse(mat: Mat) -> Option<Mat> {...}   		// .... (1)fn try_inverse(mat: &Mat) -> Option<Mat> {...}   		// .... (2)fn try_inverse(mat: &mut Mat) -> Option<Mat> {...}   	// .... (3)	

下面分别讨论:

1、fn try_inverse(mat: Mat) -> Option

我们有两种办法向函数传递参数。如果 mat 函数调用后不再使用,可以直接把变量所有权转移给函数,按下面形式调用:

	...if let Some(inv_mat) = try_inverse(mat) {...}...

如果 mat 在函数调用后还有别的用途,必须保留变量所有权,把变量克隆一份传递给函数,按照下面的方法调用:

	...if let Some(inv_mat) = try_inverse(mat.clone()) {...}...

为什么么要这样传递参数?原因是,逆矩阵是在原矩阵的基础上构建出来了,这个构建过程会逐步覆盖掉原矩阵的数据。因此,求逆矩阵函数需要获得参数的所有权,在原矩阵基础上完成逆矩阵构建。

如果得不到所有权又如何?

2、fn try_inverse(mat: &Mat) -> Option

如果参数采用传递引用的方式,函数调用就变成了以下形式:

	if let Some(inv_mat) = try_inverse(&mat) {...}

对我们来讲很是方便,但是这里存在一个效率问题。

无论 mat 我们后续是否使用,try_inverse() 都要首先克隆一个备份,然后在此基础上构建逆矩阵。也就是说,引用传参,形式上看调用方式很简洁,但是运行效率不高。而上面传值的方式,在参数后续不再使用时,可以省去变量完整克隆的运算时间。

那么,传递可修改引用可行吗?

3、fn try_inverse(mat: &mut Mat) -> Option

答案是不可以。我们看传入变量 &mut Mat 和返回结果 Option<Mat> 的语法形式就可以判断出,函数的结果和参数必须是两个独立的矩阵,不可能在参数的基础上构建逆矩阵。如果想利用传入的可变引用,函数声明需要改成下面的形式:

	fn try_inverse(mat: &mut Mat) -> Option<&Mat> {...}   	// .... (4)	

这又涉及到变量生命周期问题了。不难看出这个方式传入参数和返回结果,是一种导致语义复杂化、后患无穷的方法。

综上所述,函数声明(1)是一种最合适的形式,它把参数的克隆权交给了使用者,可避免不必要的克隆。声明(2) 虽然让使用者感觉很简洁,但牺牲了算法效率。声明(3)让参数变量冒着被修改的副作用,但没换来任何好处,所以不推荐。声明(4)的副作用问题多多,更不推荐。

二、函数传参技术要点

1、 foo(x):

foo(x) 的语法意义

  • 如果foo函数的参数是按值接收(即它需要一个所有权的拷贝),那么你可以直接传递x。
  • 这种方式下,x的所有权会被移动到foo函数中,之后你就不能再使用原始的x了,因为Rust的所有权规则不允许一个值有多个所有者。

foo(x) 的参数潜在的问题

  • 开发应用程序时,参数 x 大部分是胖指针类型的。如果我们希望函数 foo 调用后,传入的参数在函数执行后还能继续使用,这种参数定义模式下,我们必须按照下面的形式调用:
	...foo(x.clone());...

也就是说,需要把变量的一个完整克隆移动到函数的参数栈,这样才不会影响变量 x 在函数调用后的可用性。但是,变量的完全克隆操作的代价通常很高。

2、 foo(&x):

  • 如果foo函数接收一个引用作为参数(例如fn foo(x: &T)),则你应该传递x的引用(&x)。
  • 在这种情况下,foo函数将获得x的借用,而不是所有权。这意味着你可以在调用foo之后继续使用x
  • 需要注意的是,根据Rust的借用规则,你不能在借用期间修改x(除非foo接收一个可变引用,即fn foo(x: &mut T),并且你确实需要修改x)。

3、foo(x.clone()):

  • 如果foo函数需要一个值的拷贝,但你希望在调用之后仍然保留对原始x的使用权,你可以克隆x并传递克隆的版本。
  • 这意味着你将创建一个x的完整拷贝,并将其传递给foo函数,同时保留原始x的所有权和使用权。
  • 使用clone()可能会有性能开销,特别是当x很大时,因为它涉及到内存的分配和数据的复制。

在选择使用哪种方式时,你应该考虑以下因素:

  • 函数的参数类型和要求。
  • 你是否需要在调用函数之后继续使用x
  • x的大小和复制成本。
  • 是否有必要避免潜在的副作用或修改。

总的来说,在Rust中,这三种方式的选择受到语言所有权和借用规则的深刻影响,你需要根据具体情况来决定使用哪一种。

http://www.yidumall.com/news/70497.html

相关文章:

  • 兰州企业网站建设多少钱网站的推广优化
  • 做网站如何与腾讯合作免费建站系统哪个好用吗
  • 华文细黑做网站有版权吗百度竞价托管公司
  • 查询网站名有没有收录某企业网站的分析优化与推广
  • 中企动力官做网站怎么样谷歌推广代理商
  • 太原网站建设方案维护百度营销推广靠谱吗
  • b2c网站框架seo秘籍优化课程
  • 备案个人网站名称大全品牌营销活动策划方案
  • 公司营销型网站制作企业seo关键字优化
  • 上海 餐饮网站建设如何创建自己的域名
  • 视频会议系统直播聊天网站开发百度投诉电话
  • 包头北京网站建设大连seo关键词排名
  • b2c网站开发方案北京官网seo收费
  • 高端网站建设优化百度百科分类方法
  • 网站seo技术能不能赚钱无锡网站制作推广
  • 网络营销与市场营销的关系青岛自动seo
  • ps怎么做网站设计百度交易平台
  • 做网站小程序台州关键词首页优化
  • 个人网站怎么做联盟推广微信小程序开发教程
  • 宿州金融网站建设百度竞价排名叫什么
  • 设计师联盟重庆网站seo多少钱
  • 网站制作合同书seo检测
  • 山东东方路桥建设总公司官方网站最近军事新闻热点大事件
  • 滕州做网站比百度好用的搜索软件手机版
  • 富阳网站制作企业建设网站公司
  • ui个人作品集网站公司官网开发制作
  • 门头效果图制作trinseo公司
  • 如果做网站需要多少钱软文写作的三个要素
  • 网页设计网站开发需要哪些知识30条新闻摘抄
  • 哪些网站有中文域名吸引顾客的营销策略