owned/shared/mutの違いに加えてlifetimeもあるから それらも含めて推論することになると現実に使えるレベルになるのかどうか怪しい 少なくとも現時点で注力するようなポイントじゃないと思う 0309デフォルトの名無しさん2020/03/27(金) 22:30:46.16ID:TRjL1ru9>>304 ライセンス的にも道義的にもなんの問題もないんで、ぜひ面白言語作ってくれ。 Rust/Cargoの名前やロゴ使うと商標権には引っかかるのでそこだけちゃんと変えてればOK。 0310デフォルトの名無しさん2020/03/28(土) 02:49:23.51ID:7+pamnWR>>309 コミットも常に最新を本家からチェリーピックして最新機能とか享受大丈夫? 道理的に叩かれそうじゃない? 0311デフォルトの名無しさん2020/03/28(土) 09:49:38.92ID:laMmnOq7 HACK言語の成り立ちを参考にしたら 答えが見えてくるかもしれないよ 0312デフォルトの名無しさん2020/03/28(土) 19:16:01.84ID:9p87l6KY WebKitとBlinkみたいな感じでしょ?へーきへーき 0313デフォルトの名無しさん2020/03/28(土) 20:00:00.22ID:KbJ2BCU2 githubのissueのタグで頭についてるE-easyとかT-compilerみたいな大文字のアルファベットってどういう意味があるの? 0314デフォルトの名無しさん2020/03/28(土) 21:27:53.53ID:+WXFsbEZ>>313 https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.md#issue-triage0315デフォルトの名無しさん2020/03/28(土) 21:34:01.64ID:+WXFsbEZ>>310 ライセンス的には問題ない 道義的にはライセンス踏襲してRustを元にしてるよって書いとけば問題無いと思う 0316デフォルトの名無しさん2020/03/29(日) 13:50:06.97ID:c6UG4oSX この引数に&つけるのって iter.map(|&i| i * 2) これと同等? for i in iter { let i = &i; } 0317デフォルトの名無しさん2020/03/29(日) 15:02:02.33ID:sFvWmixp 巨大な学術掲示板群 アルファ・ラボ ttp://x0000.net
物理学 化学 生物学 数学 天文学 地理地学 IT 電子 工学 言語学 方言 国語 など 0318デフォルトの名無しさん2020/03/29(日) 15:16:29.91ID:u3wksM39>>316 逆 let &i = i; 0319デフォルトの名無しさん2020/03/30(月) 03:34:27.53ID:QPHAwv8T>>318 let i = 1; let &i = i; これだとコンパイル通らないよ 0320デフォルトの名無しさん2020/03/30(月) 03:44:28.46ID:Oymj8mf6 記法の問題で、>>318は、C++ と勘違いしたんでは。 Rustだと let i = 1; let j = &i; が正しいはず。 0321デフォルトの名無しさん2020/03/30(月) 03:57:10.09ID:Oymj8mf6 iter.map(|i| i * 2) と書いた場合、|i| i * 2 の部分は、closure や Lambda expression, lambdas と呼ばれるものなんだろうけど、|&i| と書く形式はなかなか検索では出てこない。 0322デフォルトの名無しさん2020/03/30(月) 04:01:22.73ID:/1SwYHDd>>318が書いてるの合ってると思うけど? https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=6d886f2d3b944871c18856f0e19da71c
iterがshared referenceをイテレートするから パターンマッチで`&`を1枚剥がした型にして使ってる for &i in iterと同じ 0323デフォルトの名無しさん2020/03/30(月) 04:40:37.32ID:Oymj8mf6>>322 ところで、 let &x = y; ってどういう意味ですか?
let y:i32 = 5; let x:&i32 = y; とは違うんでしょうか? 0324デフォルトの名無しさん2020/03/30(月) 04:45:30.74ID:Oymj8mf6 誤: let x:&i32 = y; 正: let x:&i32 = &y; 0325デフォルトの名無しさん2020/03/30(月) 11:38:27.40ID:/1SwYHDd>>323 左辺に代入する時にパターンマッチ使ってDestructuringしてる 例えばyが&i32ならxはi32になる
let i = 1; let &i = i; これがコンパイル取らないのは 右辺がintegerで左辺がreferenceを要求しててマッチしないから
let i:i32 = 1; let i = &i; let &i = i; let i:() = i; ↑こうやって試せば3行目の&iへの代入でiが&i32じゃなくi32になってるのが分かる https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=1d23370e99b388e2205c43e863885315 0326デフォルトの名無しさん2020/03/30(月) 14:27:14.40ID:Oymj8mf6>>325 let i:() = i; はどういう意味でしょう。 0327デフォルトの名無しさん2020/03/30(月) 14:34:27.40ID:yinACqvq>>326 C で言う void みたいなもんだよ。 あり得ない型を指定してエラーメッセージを出させたら メッセージに右辺の側の型も表示されるという 型確認のテクニック 0328デフォルトの名無しさん2020/03/30(月) 15:23:14.22ID:/1SwYHDd 1.38からはstd::any::type_nameがstabilizeされてるので エラーメッセージやnightly使わずに変数の型をprintして確認できるみたい (consumeしないようにreferenceで渡すから少し分かりにくいかもだけど)
let v = if Some(v) = foo.get() { v 安全取り出しだが冗長すぎて嫌 } else { }
let v = match foo.get() { Some(v) => v 安全取り出しだが冗長すぎて嫌 None => { } }
if foo.is_none() { 構文で保証されずプログラマの注意力次第で嫌すぎる } let v = foo.get().unwrap();
let v = foo.get().ok_or_else(||{ は?正常終了つってんだろが?エラー値で返すんじゃねえよバカか? })?; 0336デフォルトの名無しさん2020/04/01(水) 08:10:52.28ID:3tt/1DhK let v = foo?; 0337デフォルトの名無しさん2020/04/01(水) 08:19:02.46ID:2vQ3PjhV は? 0338デフォルトの名無しさん2020/04/01(水) 09:19:54.63ID:yrAQuZWY 構文を調整したいならマクロじゃない? let v = safe_get!(v, { 失敗した return Ok (()); }); みたいな。ベタ書き以外でearly returnしたいならマクロか?演算子みたいにコンパイラサポートがいると思う。 0339デフォルトの名無しさん2020/04/01(水) 10:13:55.16ID:0Fs3VJge なんでboolって1byteあるの? 0340デフォルトの名無しさん2020/04/01(水) 11:20:10.79ID:5VJq6KKK C は bit field あるのにな 0341デフォルトの名無しさん2020/04/01(水) 11:25:37.12ID:qjrNWUcZ>>335 map_or_elseでSomeの時とNoneの時に適用するクロージャを渡せる でもどうしても1行で書きたいとかchainしたい場合じゃなければ普通にmatchかif-else使うな
これだとスタック確保できるけど無駄なデータ入ってるし、動的なサイズの配列を返せない fn name(v: Vec<A>) -> [i32; 10] { let mut arr = [0; 10]; for (i, x) in v { arr[i] = x} arr }
こういうスライスのスタック版みたいな感じのことがしたい fn name(v: Vec<A>) -> [A] { let mut arr = [0; v.len()]; for (i, x) in v { arr[i] = x} arr } 0394デフォルトの名無しさん2020/04/06(月) 00:54:32.32ID:jrbG9hxT>>390 impl Traitは引数にも使えるよ
>>393 [A]だとサイズがコンパイル時に決まらないから&[A]か&mut [A]を返すのはできる ただ入力がVecで長さが不定なので 出力の参照元にその長さの配列を使うのは無理じゃないかな 0395デフォルトの名無しさん2020/04/06(月) 00:59:52.27ID:jrbG9hxT あと関数内部で配列生成したら そのlifetimeが関数内に閉じるので参照も返せないね 0396デフォルトの名無しさん2020/04/06(月) 01:07:26.57ID:jrbG9hxT やるとしたら 外側のスコープで固定サイズの配列をバッファとして作っておいて 関数ではバッファを満たして返すイメージ 0397デフォルトの名無しさん2020/04/06(月) 01:16:22.32ID:FD55gb+K C言語でいうところの if ( (c=foo()) == bar) { ...(cを使う処理) みたいなことやりたいんですがどうすればいいですか? fooが結構重くて2回呼び出したくないのですが、 let c = foo(); if c == bar {... とやるしかない? 0398デフォルトの名無しさん2020/04/06(月) 01:49:32.44ID:JJIxYQHA matchとifガード使えば似たようなことは出来る 0399デフォルトの名無しさん2020/04/06(月) 02:48:45.03ID:WU94L+3C>>396 何かしらのライブラリでなんかないかな? static使うぐらいなら素直にVec使うわ... 0400デフォルトの名無しさん2020/04/06(月) 03:03:32.80ID:jrbG9hxT>>397 @ bindingってのを使う
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=b2a16356c2c790985ddd937ccc2ca826 0401デフォルトの名無しさん2020/04/06(月) 04:04:37.66ID:FD55gb+K>>398 match foo() { c if c == bar => { .. }, _ => (), } こういう感じでしょうか。この場合だと記載量としてはかなり微妙ですが何かに使えそうなので覚えときます。 ありがとうございます。
>>399 今回の場合はfoo()がboolじゃないのと、barが変数なのでシャドーイングされてうまくいかないようです・・・。 if let foo @ bar = foo() { ... みたいなことやろうとしましたがダメでした。 https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=d580f91c98f26cf52a23791489914ec3 0402デフォルトの名無しさん2020/04/06(月) 22:14:10.89ID:/YOLus+e>>390 うーん難しいな