为啥 Rust 需要所有权注释而不是推断它? [复制]

     2023-02-19     62

关键词:

【中文标题】为啥 Rust 需要所有权注释而不是推断它? [复制]【英文标题】:Why does Rust require ownership annotations instead of inferring it? [duplicate]为什么 Rust 需要所有权注释而不是推断它? [复制] 【发布时间】:2020-10-17 22:31:43 【问题描述】:

Rust 为什么不能完全推断其变量的所有权?为什么需要注释?

【问题讨论】:

什么是“所有权注释”?你的意思是self&self 是如何编写方法的不同方式?还是你的意思是生命周期注释? @trentcl 好的链接,谢谢!我想基本原理是相似的,完全推断原则上是可能的,但可能不适合使用目的。 【参考方案1】:

如果这是可能的,我相信这将是一个糟糕的用户体验,因为:

如果编译器无法推断出对象的所有权,则几乎无法理解错误(例如 C++ 模板中的试错法link); 所有权政策似乎并不容易掌握(尽管这是一种观点),并且试图了解编译器选择了哪种语义可能会导致意外行为(参考 Javascript 奇怪的类型转换); 在重构过程中可能会引入更多错误(由上面的一点暗示); 如果是一个可解决的问题,完整的程序推理肯定会花费大量时间。

但是,如果您在缺乏多态性方面遇到困难,通常可以使用所有权类型对方法进行参数化,这可能被认为是推理的某种明确的替代方案,例如:

fn print_str(s: impl AsRef<str>) 
    println!("", s.as_ref());


fn main() 
    print_str("borrowed");
    print_str("owned".to_owned());

【讨论】:

嗯,完全推理与可选注释并不矛盾。但它确实必须在没有任何注释的情况下完全工作。 这里有更多未解决的问题(但未回答):cstheory.stackexchange.com/questions/47126/…

为啥 Rust 不能为传递给过滤器的闭包推断正确的类型?

】为啥Rust不能为传递给过滤器的闭包推断正确的类型?【英文标题】:WhydoesRustnotinfertherighttypeforaclosurepassedtofilter?为什么Rust不能为传递给过滤器的闭包推断正确的类型?【发布时间】:2021-12-3018:35:33【问题描述】:如果我有以... 查看详情

为啥 Spark 在创建 DataFrame 时会推断二进制而不是 Array[Byte]?

】为啥Spark在创建DataFrame时会推断二进制而不是Array[Byte]?【英文标题】:WhydoesSparkinferabinaryinsteadofanArray[Byte]whencreatingaDataFrame?为什么Spark在创建DataFrame时会推断二进制而不是Array[Byte]?【发布时间】:2018-10-3101:24:36【问题描述】... 查看详情

为啥 F# 的类型推断如此善变?

】为啥F#的类型推断如此善变?【英文标题】:WhyisF#\'stypeinferencesofickle?为什么F#的类型推断如此善变?【发布时间】:2011-03-1021:29:42【问题描述】:F#编译器似乎以(相当)严格的从上到下、从左到右的方式执行类型推断。这意... 查看详情

为啥贝宝需要卡来处理某些网站而不是所有网站的付款? [关闭]

】为啥贝宝需要卡来处理某些网站而不是所有网站的付款?[关闭]【英文标题】:Whypaypalrequiredcardstoprocesspaymentsforsomeandnotforallwebsites?[closed]为什么贝宝需要卡来处理某些网站而不是所有网站的付款?[关闭]【发布时间】:2012-07-091... 查看详情

为啥人们继续使用 xml 映射文件而不是注释? [关闭]

】为啥人们继续使用xml映射文件而不是注释?[关闭]【英文标题】:Whyarepeoplecontinuingtousexmlmappingfilesinsteadofannotations?[closed]为什么人们继续使用xml映射文件而不是注释?[关闭]【发布时间】:2010-12-2404:13:24【问题描述】:我观察到... 查看详情

npm ci 命令到底是做啥的?为啥在所有 ci 管道中使用它而不是 npm install?

】npmci命令到底是做啥的?为啥在所有ci管道中使用它而不是npminstall?【英文标题】:Whatexactlydoesnpmcicommanddoes?whyisitusedinallcipipelinesinsteadofnpminstall?npmci命令到底是做什么的?为什么在所有ci管道中使用它而不是npminstall?【发布时... 查看详情

为啥 Vec::len 是方法而不是公共属性?

】为啥Vec::len是方法而不是公共属性?【英文标题】:WhyisVec::lenamethodinsteadofapublicproperty?为什么Vec::len是方法而不是公共属性?【发布时间】:2018-11-1216:17:40【问题描述】:我注意到Rust的Vec::len方法只是访问向量的len属性。为什... 查看详情

怎样才能强制 Rust 获得分配的内存的所有权,而不是通过其安全方法分配的内存?

】怎样才能强制Rust获得分配的内存的所有权,而不是通过其安全方法分配的内存?【英文标题】:HowcanoneforceRusttotakeownershipofmemoryallocatedotherthanbyitssafemethods?【发布时间】:2019-07-1721:30:41【问题描述】:WillCrichton在2018年2月题为... 查看详情

为啥方差注释会导致 Scala 无法推断出这种子类型关系?

】为啥方差注释会导致Scala无法推断出这种子类型关系?【英文标题】:WhydoesavarianceannotationcausethissubtypingrelationnottobeinferredbyScala?为什么方差注释会导致Scala无法推断出这种子类型关系?【发布时间】:2014-06-2023:37:45【问题描述... 查看详情

为啥foreach覆盖值而不是返回所有值[重复]

】为啥foreach覆盖值而不是返回所有值[重复]【英文标题】:whyforeachoverwritingthevalueinsteadofreturnallvalues[duplicate]为什么foreach覆盖值而不是返回所有值[重复]【发布时间】:2021-08-1021:01:56【问题描述】:以下是创建dom时需要存储在本... 查看详情

为啥它呈现 django 管理站点而不是自定义注销页面

】为啥它呈现django管理站点而不是自定义注销页面【英文标题】:whydoesitrendersdjangoadministrationsiteinsteadofcustomlogoutpage为什么它呈现django管理站点而不是自定义注销页面【发布时间】:2018-04-0302:44:25【问题描述】:我为注销页面创... 查看详情

为啥叫“锈”? [关闭]

】为啥叫“锈”?[关闭]【英文标题】:Whyisitcalled"Rust"?[closed]为什么叫“锈”?[关闭]【发布时间】:2013-05-0521:06:40【问题描述】:Rust编程语言为什么叫“Rust”?是否知道是谁给它命名的,为什么?(我很难想出一个积... 查看详情

为啥使用 And 而不是 AndAlso?

】为啥使用And而不是AndAlso?【英文标题】:WhyuseAndoverAndAlso?为什么使用And而不是AndAlso?【发布时间】:2015-09-0304:59:01【问题描述】:我对.NET编程还很陌生,最近偶然发现了AndAlso。据我了解,AndAlso评估第一个表达式,如果它为... 查看详情

为啥要使用 Objectify 而不是 JDO?

】为啥要使用Objectify而不是JDO?【英文标题】:WhyObjectifyinsteadofJDO?为什么要使用Objectify而不是JDO?【发布时间】:2011-10-0918:18:03【问题描述】:我正在接近Gwt+Gae世界。我的基本需求是通过Gwt-Rpc线路发送我的实体类,而不是将它... 查看详情

为啥 Python 需要在 DLL 中使用 GetMessage 进行消息泵送而不是 Qt?

】为啥Python需要在DLL中使用GetMessage进行消息泵送而不是Qt?【英文标题】:WhyismessagepumpingwithGetMessageinDLLneededforPythonbutnotQt?为什么Python需要在DLL中使用GetMessage进行消息泵送而不是Qt?【发布时间】:2019-07-2220:43:47【问题描述】:... 查看详情

为啥在只需要一个字节时,Rust 使用两个字节来表示这个枚举?

】为啥在只需要一个字节时,Rust使用两个字节来表示这个枚举?【英文标题】:WhydoesRustusetwobytestorepresentthisenumwhenonlyoneisnecessary?为什么在只需要一个字节时,Rust使用两个字节来表示这个枚举?【发布时间】:2019-06-2704:35:03【问... 查看详情

为啥 /*@ 不是 JavaScript 中的注释?

】为啥/*@不是JavaScript中的注释?【英文标题】:Why/*@isn\'tacommentinJavaScript?为什么/*@不是JavaScript中的注释?【发布时间】:2011-08-0113:16:04【问题描述】:这个脚本http://html5shiv.googlecode.com/svn/trunk/html5.js看起来像一个大注释,但它... 查看详情

为啥只获取本地数据而不是集群的所有数据?

】为啥只获取本地数据而不是集群的所有数据?【英文标题】:Whygetonlylocaldatainsteadofalldataofthecluster?为什么只获取本地数据而不是集群的所有数据?【发布时间】:2021-06-2507:36:53【问题描述】:我的clickhouse集群(3个节点)有3个... 查看详情