Rustでポインタ振り回す系アルゴリズム書くのがだいぶ辛い

3
@tmaehara

そろそろ1ヶ月くらい Rust と遊んでるけど,いまだに Suffix Automaton を綺麗に実装できなくて泣いている.ポインタ振り回す系アルゴリズム書くのがだいぶ辛い.

2020-07-07 19:12:35
@tmaehara

Rust さんこれコンパイルできないのしんどいんですけど,どうすれば打開できるんでしょうか? fn main() { let mut x = vec![0usize]; let mut f = |a| { x.push(a); }; f(x[0]); }

2020-07-07 19:03:00
平岡 拓也 @HiraokaTakuya

@tmaehara @termoshtt mutable referenceは素直に引数で渡すのが簡単かも知れません。 fn main() { let mut x = vec![0usize]; let f = |a, x: &mut Vec<usize>| { x.push(a); }; f(x[0], &mut x); }

2020-07-07 19:32:17
κeen @blackenedgold

@tmaehara そのコードをコンパイル通すだけなら x[0]をfの定義より前にもってくれば動きますが、これで解決しますか? fn main() { let mut x = vec![0usize]; let e = x[0]; let mut f = |a| { x.push(a); }; f(e); }

2020-07-07 19:25:30
てらモス🌻 @termoshtt

f自体に&mut x持たせるのはfが生きてる限り外から一切触れないので基本ダメで、RefCellにしてborrow_mutで実行時確認にするか、なんかもうちょっと前で設計変えるかかな(´・ω・`)

2020-07-07 19:30:23
てらモス🌻 @termoshtt

関数呼び出し中の一時変数は、関数呼び出しが解決するまで生きつづけるから(なのでcloneを別変数に保持すればおけ play.rust-lang.org/?version=stabl…

2020-07-07 19:33:51
use ubnt_intrepid::prelude::*; @ubnt_intrepid

x.borrow()で返されるRef<'_, T>がf(...)の行で生きてるからですね。期待通りにしようと思ったら f({ let v = x.borrow()[0].clone(); v }); みたいにする必要がある twitter.com/hatookov/statu…

2020-07-07 19:51:09
use ubnt_intrepid::prelude::*; @ubnt_intrepid

「テンポラリ変数の生存期間はそのstatementの末尾まで続く」でしたね

2020-07-07 19:57:43
@tmaehara

これまでコンパイルエラーが出ていて理由が分からないまま適当に書き換えてたらいつの間にか通ってたやつの20%くらいの理由がわかったかもしれない.そっか,Rust って一時引数が関数評価が終わるまで生き残るのか.

2020-07-07 19:55:59
Ikko Hamamura (濵村 一航) @ikkoham

@tmaehara (rust-jp.rsのRustの日本語コミュニティはいかがでしょう?)

2020-07-07 19:11:46