- 主题:rust新手问一下
简直要吐血!
fn fun(mut vec:Vec<i32>){
vec.push(3);
}
fn fun1(vec:Vec<i32>){
let mut vec=vec;//可以重新绑定到一个mut vec上,说白了上面那种就是这种的语法糖
vec.push(3);
}
self 被 move 进这个函数后所有权就被转移了,到时候尽可自由地把它改成可变的。
【 在 txgx 的大作中提到: 】
: self的ownership发生了转移,所以是mut self。
:
: 这个怎么理解,哪本书里面有解释?
:
: 发自「今日水木 on MRX-W29」
: --
: 旦起欲专言善事,不欲先计较钱财
: 清旦常言善事,勿恶言
: 善言勿离口,乱想勿经心
: 勿言
: ..................
发自「今日水木 on MRX-W29」
--
FROM 42.234.93.*
用11楼的方法,导致12楼的问题, 应该怎么解决?
@z16166 @ilovecpp
15楼的方式的确能解决问题,但是为嘛用引用会有生命周期问题?
【 在 txgx 的大作中提到: 】
: 简直要吐血!
: fn fun(mut vec:Vec<i32>){
: vec.push(3);
: ...................
--
修改:txgx FROM 115.52.185.*
FROM 115.52.185.*
肯定不是这样判断的!rustc还没到这么智能。
它好像是跟线程周期比较,因为线程可认为是'static的,而&val则不是。
不过我觉得send结束对val的引用也应结束,应该是编译器弱智原因。
如果一定要send(&val)的话不知道怎么改。
【 在 txgx 的大作中提到: 】
: use tokio::task::yield_now;
: use std::rc::Rc;
:
: #\[tokio::main\]
: async fn main() {
: tokio::spawn(async {
: let rc = Rc::new("he
: ..................
发自「今日水木 on MRX-W29」
--
FROM 115.52.185.*
你的第一个链接里提到了解决办法,给thread 加一个生命期。
https://docs.rs/crossbeam/0.8.0/crossbeam/thread/index.html
【 在 z16166 的大作中提到: 】
: 给send()传递ref是不行的,因为这个ref是在发送线程(或者说负责发送的闭包)里的,
: 一旦发送线程结束(或者说发送的闭包销毁了),ref即失效,此后接收线程收到这个ref后就是dangling reference。
:
: 这样去掉for带来的问题后,也是报错:
: thr
: ..................
发自「今日水木 on MRX-W29」
--
FROM 115.52.185.*
一般函数使用参数的规则是函数结束参数就可以释放了。
rust推导生命期为什么不考虑一下呢?
每个函数都加上个引用参数的生命期指示不是方便一点?
比如
'fn 函数生命期
'static app 生命期。
fn bar<'a('a ='fn),T> (v: &'a T)
{}
当成隐含规则
fn bar<'a('a ='static),T> (v: &'a T)
{}
当成特殊情况。
应该给他们提个建议。
哈哈。
当然这样子写的话人们又该乱用指针了,
那就把2当成缺省情况!
【 在 z16166 的大作中提到: 】
: 好,谢谢。用unsafe cast给掰顺了
:
: --
发自「今日水木 on MRX-W29」
--
修改:txgx FROM 115.52.185.*
FROM 115.52.185.*
Rust 标准库 1.63 增加了一个期待已久的功能:scoped thread(作用域线程)。
fn main() {
println!("Hello, world!");
use std::thread;
let vals = vec![
String::from("hi"),
String::from("from"),
String::from("the"),
String::from("thread"),
];
let v1 = &vals[0];
use crossbeam_channel::unbounded;
// Create a channel of unbounded capacity.
let (tx, rx) = unbounded::<&String>();
let mut a = vec![1, 2, 3];
let mut x = 0;
thread::scope(|s| {
s.spawn( || {
println!("hello from the first scoped thread");
// borrow `a` here
dbg!(&a);
for word in &vals {
tx.send(word);
}
});
s.spawn( || {
println!("hello from the second scoped thread");
// mutably borrow `x`, because no other threads are using it
x += a[0] + a[2];
for recv in rx {
println!("Got: {}", recv);
}
});
println!("hello from the main thread");
});
// after the scope, can modify and access the variables again
a.push(4);
assert_eq!(x, a.len());
}
【 在 z16166 的大作中提到: 】
: 给send()传递ref是不行的,因为这个ref是在发送线程(或者说负责发送的闭包)里的,
: 一旦发送线程结束(或者说发送的闭包销毁了),ref即失效,此后接收线程收到这个ref后就是dangling reference。
: 这样去掉for带来的问题后,也是报错:
: ...................
--
FROM 117.147.20.*
这么久了还是unsafe的吗?没扒进去看。
【 在 z16166 的大作中提到: 】
: 哈哈,第三方库都搞这么久了,才加入
:
: 现在知道这些都是用unsafe来绕过编译器safe检查了,反正码农保证安全。
: --
发自「今日水木 on PBCM10」
--
FROM 117.147.20.*
原来36楼大牛己经讲过了。估计这个unsafe是不可避免的。
【 在 z16166 的大作中提到: 】
: 这是属于只能用unsafe来绕过编译器的检查的。unsafe用得最多的应该是std::mem::transmute
: --
发自「今日水木 on PBCM10」
--
FROM 117.147.20.*