Как безопасно сделать небезопасно?
Mar. 14th, 2021 11:53 pmЯ пока не до конца уверен, что я в правильном направлени иду, но вот какая у меня идея:
Мне нужно в новый тред отдавать ссылки только со 'static, а я хочу туда отдать (из метода структуры) ссылку на кусок "себя". Что, очевидно, нарушает 'static, потому что если "себя" сделают drop() по выходу из блока/функции, будет danging pointer, а весь раст строился вокруг того, чтобы такого не было. И нужно именно так сделать.
Задача: сохранить инвариант. Т.е. сделать так, чтобы при drop() себя, отданная ранее в соседний тред ссылка была бы жива. Это традиционная задача AI tetris (https://www.youtube.com/embed/xOCurBYI_gY?start=910&feature=oembed&enablejsapi=1), и она прекрасно решается с помощью bottom type.
impl Drop for Screen{
fn drop(&mut self){
if let Some(..) = self.thread {
println!("Attempt to drop Screen. Looping forever.");
loop{}
}
}
}
Такой подход гарантирует: а) что ссылка жива до конца программы. б) что структуру можно создавать с не 'static lifetime, потому что есть drop().
В самой программе нужно, конечно, выходить не через return:
match event {
Event::Quit { .. }
| Event::KeyDown {
keycode: Some(Keycode::Escape),
..
} => std::process::exit(0),
_ => {}
}
Это была простая часть. А теперь сложная - как бы мне сделать mut slice и slice на один и тот же набор данных, чтобы мне за это не особо много влетело?
stay tuned.
no subject
Date: 2021-03-16 10:34 am (UTC)А что такое безтиповая переменная?
no subject
Date: 2021-03-16 01:09 pm (UTC)func main() { var a interface{} a = 5 fmt.Println(a) a = "string" fmt.Println(a) }no subject
Date: 2021-03-16 02:02 pm (UTC)Это выглядит как динамическая типизация. В расте она есть (dyn), но она требует таскать указатель на объект, чтобы использовать его "не глядя". Я эту область совсем не трогал. Вот что тут пишут: https://doc.rust-lang.org/rust-by-example/trait/dyn.html
Но оно всегда медленее, чем compile-time типизация.
Твой пример на rust выглядит так:
Секрет в том, что это две разные перменные с разным lexical scope. Как только второй let выполняется, первая переменная больше не существует.
no subject
Date: 2021-03-16 04:15 pm (UTC)Как в rust сделать так:
func main() { m := make(map[int]interface{}) m[1] = 1 m[2] = "two" m[3] = 3.14 for i, val := range m { fmt.Printf("m[%d] == %v\n", i, val) } }