问题标签 [borrow-checker]
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.
rust - 不能作为不可变借用 - String 和 len()
但是,这是一个编译错误。与借用检查器和可能的可变性有关。
然而,如果我稍微改变它,我可以这样做:
为什么?有没有办法改变它,所以它可以写在一行中?(PS 这是在 Rust 1.0 上)
regex - 正则表达式捕获迭代器方法移动迭代器
我正在使用此正则表达式处理格式为“1s:1d”、“100:5000”等的简单字符串:
我知道这个正则表达式应该只匹配一次,所以我想运行正则表达式进行捕获并检查捕获的数量。
问题是该count()
方法移动了iter
,我不能再使用它了。
这对我来说没有意义。该方法是否应该count
只返回一个可复制的usize
值而不是移动iter
?我该如何解决这个问题?
rust - 不能在递归斐波那契实现中将不可变的借用 HashMap 缓存作为可变借用
我想实现一个斐波那契数列以及缓存已经计算的结果。我不确定这种方法在 Rust 中是否可行,但它是我想出的最好的。这是代码:
这个想法是有一个HashMap
可以重用的“全局”。但是,我猜这不太可能,因为我们最终会为地图提供多个可变借款人。这是我得到的错误
生锈 2015
生锈 2018
我可以在 Rust 中使用这种方法吗?这个问题的最佳解决方案是什么?
rust - 将可变的自引用传递给拥有对象的方法
下面是一个简单的模拟,它的场是一个矩形区域,两个球在其中弹跳。该Field
结构有一个update
方法,该方法调用update
每个球。在他们的方法中,这些球update
需要根据它们的速度四处移动。但他们也需要相互反应,以及领域的边界。
如何获取有关Ball
结构更新功能的边界和另一个球的信息?中的这些行Field::update
不编译:
给出以下错误:
我明白,但我不知道如何解决这个问题。
multithreading - 向量中函数的线程调用
我有一个EventRegistry
人们可以用来注册事件监听器的。然后在广播事件时调用适当的侦听器。但是,当我尝试对其进行多线程处理时,它无法编译。我怎样才能让这段代码工作?
Playpen(不确定它是否最小,但会产生错误)
如果我使用thread::scoped
,它也可以工作,但这是不稳定的,我认为它只工作,因为它立即加入回主线程。
multithreading - 是否可以在不进行任何克隆的情况下与线程共享数据?
当我将工作委派给线程时,我经常有一段数据会比所有线程都活得更久,例如numbers
在以下示例中:
它没有在任何地方修改,并且由于join
s,可以保证线程使用它完成。但是,Rust 的借用检查器无法判断:
到目前为止我看到的解决方案都涉及克隆数据(或克隆Arc
数据)。但是,是否有可能在没有任何克隆的情况下做到这一点?
rust - 拥有一些数据和对数据的引用的结构
对象的构造会分配该对象生命周期所需的数据,但也会创建另一个需要保留对数据的引用的对象:
是否可以用 Rust 的术语来表达这一点?
在这里,我想Obj
,AnotherObj
并data
拥有相同的生命,当然比new()
电话更长寿。
rust - Want to add to HashMap using pattern match, get borrow mutable more than once at a time
I am trying to write some toy code that stores the number of times it sees a word in a HashMap
. If the key exists, it increments a counter by one, if the key doesn't exist, it adds it with the value 1
. I instinctively want to do this with a pattern match, but I hit a borrow mutable more than once error:
The error I get is:
I understand why the compiler is grumpy: I've told it I'm going to mutate the value keyed on word
, but then the insert isn't on that value. However, the insert is on a None
, so I would have thought the compiler might have realized there was no chance of mutating c[s]
now.
I feel like this method should work, but I am missing a trick. What am I doing wrong?
EDIT: I realize I can do this using
but this seems horribly ugly code vs the pattern match (particularly having to do the contains_key()
check as an if, and then essentially doing that check again using Some
.
iterator - 在迭代另一个属性时修改结构的一个属性
我有一个 2 Vec
s 的结构。我希望能够在修改另一个的同时迭代一个。这是一个示例程序:
但是有这个编译器错误:
我了解编译器在抱怨什么。我self
在 for 循环中借用了,因为我仍在循环它。
从概念上讲,应该有一种方法可以做到这一点。我只是在修改s.b
,而不是修改我正在循环的东西(s.a
)。无论如何要编写我的程序来演示这种分离,并允许这种程序编译?
这是一个较大程序的简化示例,因此我需要保持一般结构相同(一个结构有一些东西,其中一个将被迭代,另一个将被更新)。
process - 无法多次通过管道传入或传出生成的子进程
我希望能够使用 Rust 生成一个子 shell,然后反复向它传递任意命令并处理它们的输出。我在网上找到了很多示例,向我展示了如何传递单个命令并接收其单个输出,但我似乎无法重复执行此操作。
例如,以下代码挂在注释后的行上。(我想可能read_to_string()
会阻塞,直到它从子进程接收到标准输出,但如果是这样,我不明白为什么该输出不会出现......)
我是 Rust 的初学者,我认为问题在于我对借用检查器/引用规则的理解有限,因为如果我从代码中删除循环指令并将引用更改为,上述运行良好(对于单次迭代)结构的内部是std::process::Child
不可变的;例如从这个:
对此:
显然,重复运行ls
不是我的最终目标,我知道我可以只编写一个 shell 脚本,然后让 Rust 重复运行它——但是(除了学习更多关于 Rust 的目标!)这是我需要做的事情至少在原则上能够为一个更复杂的项目做(如果它可能证明与任何解决方案相关,我很乐意进入,但这可能超出了这个问题的范围!)
最后,如果事实证明不可能以这种方式使用子 shell,我仍然想学习如何重复/连续地管道进出运行其他任意命令的衍生进程,就像我一样无法在 Rust 文档、教程或 Stack Overflow 上找到任何信息。