问题标签 [ownership-semantics]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
592 浏览

c++ - 智能指针所有权语义和相等性

我有几个关于智能指针的问题,之前我没有给他们任何信任。

  1. 在智能指针的世界中,拥有一个对象、指向一个对象和管理一个对象意味着什么?之前我认为拥有该对象的人也指向它并管理该对象。现在,我知道智能指针可以拥有一个对象,但指向另一个对象(别名构造函数)。在这里,我找到了一个很好的解释,解释了拥有一个对象的含义-> http://www.umich.edu/~eecs381/handouts/C++11_smart_ptrs.pdf,但我仍然无法区分这三个术语。
  2. 如果指针拥有一个对象,但指向另一个对象,他管理的是哪个对象?他拥有它的那个,还是他指向的那个,或两者兼而有之?拥有一个对象但不指向它有什么意义?
  3. 两个智能指针何时相等?两个指针可以同时拥有同一个对象并不同吗?我对他们的价值平等不感兴趣,但对所有权感兴趣。
  4. 为什么所有权顺序很重要(除了将指针用作容器中的键)?我想这仅与 shared_ptr 相关。

一切都是从试图理解 owner_before 开始的,现在我比开始探索这个话题之前更加困惑了.. :(

0 投票
1 回答
2522 浏览

string - 将 PathBuf 转换为字符串时,有没有办法避免克隆?

我需要简单地(并且危险地 - 为简洁起见省略错误处理)获取当前的可执行文件名称。我让它工作了,但是我的函数将 a 转换&strString仅在以后调用as_str()它以进行模式匹配。

据我了解,std::env::current_exe()给了PathBuf我可以通过归还它来转让的所有权。就目前而言,我借它来将其转换为&str. 从那里,返回字符串的唯一方法是在PathBuf删除之前克隆它。

有什么办法可以避免这个&OsStr -> &str -> String -> &str循环吗?

0 投票
1 回答
95 浏览

rust - 有条件地将 T 从 Rc 移出当计数为 1

有没有办法Rc<T>在计数为时移动对象1?我正在考虑如何实现:

语义是,T如果计数是1,你会得到,否则你会回来shared,所以你可以稍后再试。

0 投票
1 回答
861 浏览

generics - 接受 &str 或移动字符串而不复制的通用函数

为了方便调用者,我想编写一个接受任何类型的字符串(&str/ )的通用函数。String

该函数内部需要 a String,因此如果调用者使用String.

为了接受我知道我可以使用foo<S: AsRef<str>>(s: S)的引用,但是另一种方式呢?

我认为基于的通用参数ToOwned可能有效(适用于&str,并且我假设它对 没有操作String),但我无法弄清楚确切的语法。

0 投票
1 回答
78 浏览

rust - 在 S 上使用通用特征强迫我让 T 活得比 S

归结起来的问题如下:

游乐场

上面的代码编译失败:

WorldState<'a>是一种寿命很短的数据类型(每帧一个),而LearningAlgorithm是一种寿命很长的数据类型(多个游戏)。但是我实现这个东西的方式,Rust 渴望相信,WorldState我传递给的每个人print_learning_information都必须比LearningAlgorithm.

我做错了什么?这还能怎么处理?

一些我不想做的事情:

  • WorldState包含正常状态(因为实际上它包含一些向量而不是 a并且我f64不想WorldState在传递每个玩家自己的世界视图时将它们复制到结构中)
  • 退出这个项目并开始一个新项目(你们都知道,投入一些时间后,你不想把所有的工作都扔掉)
0 投票
1 回答
187 浏览

rust - 返回对具有泛型 Fn 特征/值的泛型类型的引用

我刚刚开始学习 Rust 并阅读 Rust 书。其中一章通过几个示例引导,并以“尝试使这种通用”类型的建议练习结束。我一直在全力以赴。您开始使用的半通用类型是这样的:

然后我开始转换它,以便 Fn 特征也是通用的,这也直接影响“价值”。所以这就是我想出的:

我所有的问题都在 fn value getter 中。我不确定我是否已经接近了,或者我只是走上了完全错误的道路。那么我要在哪里出轨呢?

0 投票
3 回答
3278 浏览

rust - 如何调用在盒装特征对象上使用 self 的方法?

我有以下实现草图:

我可以在他们身上设置监听器Transaction,当该事务发生某些事情时,它们会调用监听器。由于Listener是一个特征,我存储一个Vec<Box<Listener>>.

我很难commit实施Transaction. 不知何故,我必须通过调用commit每个存储Listener的 s 来消耗这些盒子,但据我所知,我无法将东西移出盒子。

我将如何在提交时消耗我的听众?

0 投票
0 回答
218 浏览

rust - 为什么即使我的函数没有以任何方式访问该字段,编译器也会抱怨借用一个字段是不可变的?

我正在尝试编写一个应用程序来侦听套接字上的请求,然后将它们添加到要处理的队列中。我的部分代码如下:

但是,如果我尝试将一些代码抽象run()为一个函数(实际上只是复制/粘贴):

我收到以下错误消息:

据我了解,self.listener.incoming()实际上不仅借用了侦听器“字段”,还借用了整个结构。然后,由于我们不能同时有任何可变借用和不可变借用,编译器会抱怨。但是,我必须使self可变 in handle_client(),否则我无法在其队列中推送任何内容。

我一直在考虑如何以不同的方式构造代码来克服这个问题,但似乎无法在不改变我的Middleware结构的情况下找到解决方案(如删除一些字段等)。

是否有可能以某种方式构造代码以使用函数(如我的第二个代码片段)?

0 投票
3 回答
922 浏览

c++ - QObject::moveToThread 中的移动语义

QThread 类的文档中,一个示例性设置的工作方式如下:

Qt 是否用这里的函数实现了实际的移动语义moveToThread(...)?即线程完成后是否会取消分配 Worker 对象,因为Worker*分配的对象Controller()永远不会在任何地方显式删除?

0 投票
1 回答
580 浏览

rust - 使用状态机模式时解决 Rust 所有权问题

这个问题是关于在 Rust 中为视频游戏实现状态机时可能出现的特定所有权模式,其中状态可以持有对“全局”借用上下文的引用,并且状态机在哪里拥有它们的状态。我试图在激发问题的同时尽可能多地删减细节,但这是一个相当大且纠结的问题。

这是状态特征:

我正在使用盒装特征对象而不是枚举来实现状态,因为我希望有很多状态。状态在其更新方法中返回 aSome(State)以使它们拥有的状态机切换到新状态。我添加了一个生命周期参数,因为没有它,编译器会生成 type:Box<AppState + 'static>的框,因为状态包含可变状态,所以这些框无用。

说到状态机,这里是:

状态机始终具有有效状态。默认情况下,它以 a 开头Box<NullState>,这是一个什么都不做的状态。为简洁起见,我省略NullState了。就其本身而言,这似乎编译得很好。

InGame状态旨在实现一个基本的游戏场景:

这个游戏依赖于 Rust SDL2。这组特定的绑定要求纹理由 a 创建TextureCreator,并且纹理的寿命不超过其创建者。纹理需要一个生命周期参数来确保这一点。Tileset持有一个纹理,因此导出这个需求。这意味着我不能将 a 存储TextureCreator在状态本身中(尽管我想这样做),因为可变借用InGame可能会使纹理创建者移出。因此,纹理创建者属于main,当我们创建我们的主要状态时,对它的引用被传递给:

我觉得这个程序应该是有效的,因为我已经确保它tex_creator比任何可能的状态都要长,并且那个状态机是寿命最短的变量。但是,我收到以下错误:

这对我来说没有意义,因为state_machine只是被方法调用借用了,但是编译器说当方法结束时它仍然是借用的。我希望它能让我在错误消息中追踪借用者的身份——我不明白为什么当方法返回时没有返回借用。

本质上,我想要以下内容:

  • 那些状态由 trait 实现。
  • 状态归状态机所有。
  • 该状态能够包含对任意非静态数据的引用,其生命周期大于状态机的生命周期。
  • 当一个状态被换出时,旧盒子仍然有效,以便它可以移动到新状态的构造函数中。这将允许新状态切换回之前的状态,而无需重新构建。
  • 一个状态可以通过从“更新”返回一个新状态来发出状态变化的信号。旧状态必须能够在自身内部构建这个新状态。

这些约束是否可以满足,如果可以,如何满足?

对于这个冗长的问题以及我可能遗漏了一些明显的事情的可能性,我深表歉意,因为在上面的实现中做出了许多决定,我不确定我是否理解生命周期的语义。我试图在网上搜索这种模式的例子,但它似乎比我见过的玩具例子更复杂和受限制。