ほーん、型上で assert が書けるようになるってこと?
このアカウントは、notestockで公開設定になっていません。
@elpinal ありがとうございます。ちょうどその方法は試してました。macro 定義の中だと補完が効かないのがちょっと難点ですが、基本これで良さそうです。ありがとうございます!
@elpinal なるほど、ありがとうございます。結構使用範囲が長い時は scope 区切ってやったり、関数として括り出せるものは括り出したりしてやってるんですが、わりと f / g / f / g みたいな交互の呼び出しが連続する系だと辛いなあって感じでした
@elpinal それはそうなんですが、let y の binding でやりたいことは borrowing ではなく単に borrowing の記述数を減らすための binding というか、記述の alias を作りたいって感じです。
f(&mut x.b, x.a);
g(&mut x, 3);
f(&mut x.b, x.b.c + x.a);
の x.b の部分がちょっと長くて一々コピペで書きたくないという感じなんですよね。投稿の方のコードは例コードで、実際には g は A 全体を mutable に操作する何かって感じなので、g の方を弄るみたいな解決はできないって感じです
やっぱりなんも分からん。いつか Rust 分かるようになりたいな〜。今回は諦め
でも、
let y = &mut x.b;
x.a = 1;
は書けるが、
let y = &mut x.b;
(&mut x).a = 1;
は書けないのか。それってどういう原理なんだ (別の疑問が生まれてしまった...)
つまり例が良くなかったらしい
struct A { a: usize, b: B }
struct B { c: usize }
fn f(y: &mut B, v: usize) {
y.c = v;
}
fn g(x: &mut A, v: usize) {
x.a = v;
}
let mut x = A { a: 1, b: B { c: 2 } }
let y = &mut x.b;
f(y, x.a);
g(&mut x, 3);
f(y, y.c + x.a);
みたいなんが書きたい
読んでもよく分からん
x.a = 1;
と
(&mut x).a = 1;
が違う意味論を持ってるのか