Mozilla発のRust言語のスレ
公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust
Web上の実行環境
https://play.rust-lang.org
前スレ
Rust Part7
http://mevius.5ch.net/test/read.cgi/tech/1563114707/
Rust part8
■ このスレッドは過去ログ倉庫に格納されています
2020/01/24(金) 11:47:52.41ID:9oO1hUHl
265デフォルトの名無しさん
2020/03/24(火) 16:46:57.83ID:T0vrM+QL266デフォルトの名無しさん
2020/03/24(火) 17:02:53.60ID:SD2kTFQw なんぼ間違えんねん落ち着けや
267デフォルトの名無しさん
2020/03/24(火) 17:20:04.56ID:T0vrM+QL Rustでの代入記号は、i32/f32/bool/str などのprimitive型以外は原則的に copy動作
ではなく、move 動作のようなもので、所有権の移動が発生する。
例外は、Copy traitsが実装されている型の場合で、その場合も copy動作になる。
Option<XXX>は、Copy traitsが実装されているらしく、Optionが他動詞で代入記号
を使うと、copy動作になるらしい。
ただし、これは文書で明確には述べられてないのでよくわからない。
根拠は、Optionのソースは以下のようになっていて、#[derive(Copy, ...)]の部分が、
Copy traitsを自動実装する、という意味になるらしいからだ:
#[derive(Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)]
#[rustc_diagnostic_item = "option_type"]
#[stable(feature = "rust1", since = "1.0.0")]
pub enum Option<T> {
/// No value
#[stable(feature = "rust1", since = "1.0.0")]
None,
/// Some value `T`
#[stable(feature = "rust1", since = "1.0.0")]
Some(#[stable(feature = "rust1", since = "1.0.0")] T),
}
ではなく、move 動作のようなもので、所有権の移動が発生する。
例外は、Copy traitsが実装されている型の場合で、その場合も copy動作になる。
Option<XXX>は、Copy traitsが実装されているらしく、Optionが他動詞で代入記号
を使うと、copy動作になるらしい。
ただし、これは文書で明確には述べられてないのでよくわからない。
根拠は、Optionのソースは以下のようになっていて、#[derive(Copy, ...)]の部分が、
Copy traitsを自動実装する、という意味になるらしいからだ:
#[derive(Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)]
#[rustc_diagnostic_item = "option_type"]
#[stable(feature = "rust1", since = "1.0.0")]
pub enum Option<T> {
/// No value
#[stable(feature = "rust1", since = "1.0.0")]
None,
/// Some value `T`
#[stable(feature = "rust1", since = "1.0.0")]
Some(#[stable(feature = "rust1", since = "1.0.0")] T),
}
268デフォルトの名無しさん
2020/03/24(火) 17:21:21.85ID:T0vrM+QL269デフォルトの名無しさん
2020/03/24(火) 17:31:35.81ID:UBy3gEYu270デフォルトの名無しさん
2020/03/24(火) 18:30:07.73ID:le7GgsxJ271デフォルトの名無しさん
2020/03/24(火) 18:46:17.48ID:8wuqSfIx 汽車 汽車 チンポ チンポ
シコシコ チンポッポ
チンポを出して シコシコ チンポッポ
シコシコ チンポッポ
チンポを出して シコシコ チンポッポ
272デフォルトの名無しさん
2020/03/24(火) 19:01:03.96ID:SD2kTFQw >>278
期待してるぞ
期待してるぞ
273デフォルトの名無しさん
2020/03/24(火) 23:11:28.78ID:UBy3gEYu >>278
それコンパイラのソースじゃないよ
それコンパイラのソースじゃないよ
274デフォルトの名無しさん
2020/03/25(水) 01:18:57.46ID:COJzGufp Rustは、コンパイラ時エラーに悩まされる反面、実行時エラーに悩まされるのを減らす
などと言われる。
しかし、コンパイル時エラーが出ると言うことは、裏を返せば、書けないアルゴリズムが存在するということだ。
直感的ではない回りくどい書き方が必要となり記述量が多くなる。
他の言語では好きな書き方が出来て、それはどれも正解だが、Rustでは正解が非常に狭くなる。
正解が狭いことがエラーを減らすなどという人がいるが、実際には、Rustは
書けるアルゴリズムが狭い、と言うことなのである。
これは言語設計の問題である。
なお、ここで言っているアルゴリズムは、全体的なものではなく、細かいミクロ的なものである。
通常の言語では、1つの仕事を細かい変数の使い方まで含めれば数万通り以上に書けるだろう。
そして、そのどれもが正解であり、結果が正しくバグも無いのだから、内のどれかが悪い書き方という
ことは特にない。
ところが、Rustでは、その大部分の書き方が出来ないのである。
駄目だから敢えてできなくしているのではなく、Rustが設計上、書けないアルゴリズムがあるということに他ならない。
つまり、Rustは書けるアルゴリズムが、本来コンピュータが書けるアルゴリズムの内の、非常に狭いサブセットに限られてしまうということである。
これは、Rustの大きな欠陥である。
などと言われる。
しかし、コンパイル時エラーが出ると言うことは、裏を返せば、書けないアルゴリズムが存在するということだ。
直感的ではない回りくどい書き方が必要となり記述量が多くなる。
他の言語では好きな書き方が出来て、それはどれも正解だが、Rustでは正解が非常に狭くなる。
正解が狭いことがエラーを減らすなどという人がいるが、実際には、Rustは
書けるアルゴリズムが狭い、と言うことなのである。
これは言語設計の問題である。
なお、ここで言っているアルゴリズムは、全体的なものではなく、細かいミクロ的なものである。
通常の言語では、1つの仕事を細かい変数の使い方まで含めれば数万通り以上に書けるだろう。
そして、そのどれもが正解であり、結果が正しくバグも無いのだから、内のどれかが悪い書き方という
ことは特にない。
ところが、Rustでは、その大部分の書き方が出来ないのである。
駄目だから敢えてできなくしているのではなく、Rustが設計上、書けないアルゴリズムがあるということに他ならない。
つまり、Rustは書けるアルゴリズムが、本来コンピュータが書けるアルゴリズムの内の、非常に狭いサブセットに限られてしまうということである。
これは、Rustの大きな欠陥である。
275デフォルトの名無しさん
2020/03/25(水) 01:25:39.41ID:COJzGufp >>274
「駄目な書き方だからエラーにしている」
と言うのは間違いで、正しくは、
「Rustコンパイラの静的解析能力では、書き方を非常に限定しないと
正しいことを保障できなかったり、自動化できなかったりするため、
しょうがなく狭い書き方しか出来なくしている」
と言うことに他ならない。
人間には脳内の静的解析で明らかに正しいことが分かる書き方でも、
Rustコンパイラではでは同じことができないため、敢えて
変数束縛、借用、単一参照など、コンパイラでも解析できる程度の
範囲に書き方を限定して無理やり人間のプログラミングの可能性を
狭めているに過ぎない。
「駄目な書き方だからエラーにしている」
と言うのは間違いで、正しくは、
「Rustコンパイラの静的解析能力では、書き方を非常に限定しないと
正しいことを保障できなかったり、自動化できなかったりするため、
しょうがなく狭い書き方しか出来なくしている」
と言うことに他ならない。
人間には脳内の静的解析で明らかに正しいことが分かる書き方でも、
Rustコンパイラではでは同じことができないため、敢えて
変数束縛、借用、単一参照など、コンパイラでも解析できる程度の
範囲に書き方を限定して無理やり人間のプログラミングの可能性を
狭めているに過ぎない。
276デフォルトの名無しさん
2020/03/25(水) 01:26:44.15ID:atIoOIeM コピペじゃなかったのか…ウケるw
277デフォルトの名無しさん
2020/03/25(水) 07:56:19.45ID:B3ciLpqT みんなドキュメントコメントで日本語も一緒に書くときってどうしてる?
こんな連ねた感じでいいのかな?
/// Returns a Person object
/// Personオブジェクトを返す
こんな連ねた感じでいいのかな?
/// Returns a Person object
/// Personオブジェクトを返す
278デフォルトの名無しさん
2020/03/25(水) 08:01:15.06ID:ukHBAVn8 例が悪いわ。
そんな糞コメント書くな、になってしまう。
そんな糞コメント書くな、になってしまう。
279デフォルトの名無しさん
2020/03/25(水) 08:57:55.31ID:3gLrCiKq >>278
期待を裏切りよって
期待を裏切りよって
280デフォルトの名無しさん
2020/03/25(水) 09:06:21.89ID:99YP/w74 言いたいことも言えないこんな世の中じゃポイズン
281デフォルトの名無しさん
2020/03/25(水) 11:14:11.00ID:mufeRxy0 Cからprintln使ってるRustの関数呼ぶとメモリリークしよる(´・ω・`)
282デフォルトの名無しさん
2020/03/25(水) 12:42:04.62ID:gIHmoeQz >>277
それコメントの意味なくね?
それコメントの意味なくね?
283デフォルトの名無しさん
2020/03/25(水) 14:08:14.89ID:rak19Gqk284デフォルトの名無しさん
2020/03/25(水) 16:36:38.82ID:6bd+J6i5 今だにCopyトレイトの命名は失敗だと再確認する
285デフォルトの名無しさん
2020/03/26(木) 02:55:12.87ID:q1LILc/b Box<T> は copy ではなく move なんだとさ。
286デフォルトの名無しさん
2020/03/26(木) 02:58:28.01ID:q1LILc/b287デフォルトの名無しさん
2020/03/26(木) 03:37:08.94ID:lC9OKNgA 中身がCopyのときだけOptionもCopyになるんじゃないの??
288デフォルトの名無しさん
2020/03/26(木) 03:46:23.72ID:2WcXgaRB >>287
分からない。
分からない。
289デフォルトの名無しさん
2020/03/26(木) 03:48:11.78ID:2WcXgaRB >>285
ソースを示しておくと、以下の公式(?)サイトに、
「because Box isn't Copy」という言葉が書かれている:
https://doc.rust-lang.org/nomicon/checked-uninit.html
ソースを示しておくと、以下の公式(?)サイトに、
「because Box isn't Copy」という言葉が書かれている:
https://doc.rust-lang.org/nomicon/checked-uninit.html
290デフォルトの名無しさん
2020/03/26(木) 04:59:35.60ID:2WcXgaRB struct のメンバに local 変数を代入した場合、エラーになる?
291デフォルトの名無しさん
2020/03/26(木) 12:36:34.09ID:Rq1Q9bYl https://doc.rust-lang.org/std/option/enum.Option.html#impl-Copy
impl<T> Copy for Option<T> where T: Copy {}
impl<T> Copy for Option<T> where T: Copy {}
292デフォルトの名無しさん
2020/03/26(木) 14:56:26.41ID:RidRralQ293デフォルトの名無しさん
2020/03/26(木) 15:33:44.04ID:5np4UAxw294デフォルトの名無しさん
2020/03/26(木) 17:17:35.74ID:mwwmClxG c++の代替というけど、rust理解するにはc++でメモリイメージ固めた方が学習速いんじゃねーの?
295デフォルトの名無しさん
2020/03/26(木) 18:48:36.88ID:Rq1Q9bYl296デフォルトの名無しさん
2020/03/26(木) 21:50:13.71ID:HC2i5ubn ML系列の記法に慣れるとrustがどうしてalgol系列の記法にしたのか納得できなくなる。どんだけカンマ打たせるねん。
少し頑張れば関数の型も推論できると思うんだけど人まかせにしてるのが好きじゃない。せめて、勝手に挿入できるような記法にしとくべきだったと思う
少し頑張れば関数の型も推論できると思うんだけど人まかせにしてるのが好きじゃない。せめて、勝手に挿入できるような記法にしとくべきだったと思う
297デフォルトの名無しさん
2020/03/27(金) 00:25:53.78ID:GUIIkCWN インスタンスでフィールドアクセスにカンマ使わない場合どんなのがいいの?
推論は関数で境界作りたかったんでしょ
推論は関数で境界作りたかったんでしょ
298デフォルトの名無しさん
2020/03/27(金) 00:33:57.86ID:GUIIkCWN299デフォルトの名無しさん
2020/03/27(金) 00:47:04.38ID:4wGUX1E+ 型推論の能力的には関数も全部できるけど、ドキュメント目的であえてしてないはず。
300デフォルトの名無しさん
2020/03/27(金) 01:16:32.86ID:xxRyEnpG TypeScriptは戻り値の型を省略できるけど、書かないと訳が分からなくなるので言語的には省略出来てもコーディングルールで強制してるわ
Cみたいに変数宣言含めて型を全部書くのも面倒だけど、行き過ぎた省略もメンテナンス性を損なうと思う
Cみたいに変数宣言含めて型を全部書くのも面倒だけど、行き過ぎた省略もメンテナンス性を損なうと思う
301デフォルトの名無しさん
2020/03/27(金) 03:32:10.02ID:xTSSnKrR >>296
どういうカンマの事?
どういうカンマの事?
302デフォルトの名無しさん
2020/03/27(金) 15:34:02.04ID:9RtDMjhb C/C++に疲れた人が使って幸せになれるのがRustだと思ってたけど
実態は全然違うってことか
実態は全然違うってことか
303デフォルトの名無しさん
2020/03/27(金) 17:00:38.31ID:pa89frlH C++17に疲れた人なら結構幸せになれるんじゃない。
C89に疲れた人だと厳しそうだが…。
C89に疲れた人だと厳しそうだが…。
304デフォルトの名無しさん
2020/03/27(金) 18:51:24.66ID:JRwFCn2R RustのコンパイラソースをCloneしてそれをベースに名前も違うプログラミング言語作るのってライセンス的にどうなの?
rustcの構文解析の部分を変えてからそのrustcも全部その言語に変換したいんだけど
rustcの構文解析の部分を変えてからそのrustcも全部その言語に変換したいんだけど
305デフォルトの名無しさん
2020/03/27(金) 18:57:46.96ID:VaiYZBCN306デフォルトの名無しさん
2020/03/27(金) 19:49:39.79ID:oRj/lH5B >>299 あえてやらないなら、せめてコンパイラが推論した結果を教えてくれよと思う
この処理のこの部分だけ一旦切り出して別の処理にしてみたい、とかやるときにすげー大変
Haskellでも型表記は省略できるけどしない方が良いねって作法がメジャーなのは知ってるけど、型推論でサポートしてくれるからrustよりストレス少ない
ちょいとクロージャを関数として外に出しとこう、とか、ここ切り分けて別パターン用意して比較してみよう、とかやるのが面倒くさい
あ、まずクロージャにして型エラーを起こして教えてもらう、とかやればできるんかな…
この処理のこの部分だけ一旦切り出して別の処理にしてみたい、とかやるときにすげー大変
Haskellでも型表記は省略できるけどしない方が良いねって作法がメジャーなのは知ってるけど、型推論でサポートしてくれるからrustよりストレス少ない
ちょいとクロージャを関数として外に出しとこう、とか、ここ切り分けて別パターン用意して比較してみよう、とかやるのが面倒くさい
あ、まずクロージャにして型エラーを起こして教えてもらう、とかやればできるんかな…
307デフォルトの名無しさん
2020/03/27(金) 19:59:43.89ID:Pf+eY36z >>306
型を自分で書くのが面倒なときは()とかi32とか適当な型で埋めておいて、エラーメッセージから正しい型を持ってくるというのはありだよ。
(逆に言えば正しいエラーメッセージを出せるということは、関数プロトタイプまでちゃんと型推論できているということでもある)
型を自分で書くのが面倒なときは()とかi32とか適当な型で埋めておいて、エラーメッセージから正しい型を持ってくるというのはありだよ。
(逆に言えば正しいエラーメッセージを出せるということは、関数プロトタイプまでちゃんと型推論できているということでもある)
308デフォルトの名無しさん
2020/03/27(金) 21:21:00.05ID:aLfv28Wa 関数の型を推論するのを捨ててるから
Deref coercionだったりFrom/Intoだったり中身を書くときに型を省略できるんじゃないの?
owned/shared/mutの違いに加えてlifetimeもあるから
それらも含めて推論することになると現実に使えるレベルになるのかどうか怪しい
少なくとも現時点で注力するようなポイントじゃないと思う
Deref coercionだったりFrom/Intoだったり中身を書くときに型を省略できるんじゃないの?
owned/shared/mutの違いに加えてlifetimeもあるから
それらも含めて推論することになると現実に使えるレベルになるのかどうか怪しい
少なくとも現時点で注力するようなポイントじゃないと思う
309デフォルトの名無しさん
2020/03/27(金) 22:30:46.16ID:TRjL1ru9310デフォルトの名無しさん
2020/03/28(土) 02:49:23.51ID:7+pamnWR311デフォルトの名無しさん
2020/03/28(土) 09:49:38.92ID:laMmnOq7 HACK言語の成り立ちを参考にしたら
答えが見えてくるかもしれないよ
答えが見えてくるかもしれないよ
312デフォルトの名無しさん
2020/03/28(土) 19:16:01.84ID:9p87l6KY WebKitとBlinkみたいな感じでしょ?へーきへーき
313デフォルトの名無しさん
2020/03/28(土) 20:00:00.22ID:KbJ2BCU2 githubのissueのタグで頭についてるE-easyとかT-compilerみたいな大文字のアルファベットってどういう意味があるの?
314デフォルトの名無しさん
2020/03/28(土) 21:27:53.53ID:+WXFsbEZ315デフォルトの名無しさん
2020/03/28(土) 21:34:01.64ID:+WXFsbEZ316デフォルトの名無しさん
2020/03/29(日) 13:50:06.97ID:c6UG4oSX この引数に&つけるのって
iter.map(|&i| i * 2)
これと同等?
for i in iter {
let i = &i;
}
iter.map(|&i| i * 2)
これと同等?
for i in iter {
let i = &i;
}
317デフォルトの名無しさん
2020/03/29(日) 15:02:02.33ID:sFvWmixp 巨大な学術掲示板群 アルファ・ラボ
ttp://x0000.net
物理学 化学 生物学 数学 天文学 地理地学
IT 電子 工学 言語学 方言 国語 など
ttp://x0000.net
物理学 化学 生物学 数学 天文学 地理地学
IT 電子 工学 言語学 方言 国語 など
318デフォルトの名無しさん
2020/03/29(日) 15:16:29.91ID:u3wksM39319デフォルトの名無しさん
2020/03/30(月) 03:34:27.53ID:QPHAwv8T320デフォルトの名無しさん
2020/03/30(月) 03:44:28.46ID:Oymj8mf6321デフォルトの名無しさん
2020/03/30(月) 03:57:10.09ID:Oymj8mf6 iter.map(|i| i * 2)
と書いた場合、|i| i * 2 の部分は、closure や Lambda expression, lambdas
と呼ばれるものなんだろうけど、|&i| と書く形式はなかなか検索では出てこない。
と書いた場合、|i| i * 2 の部分は、closure や Lambda expression, lambdas
と呼ばれるものなんだろうけど、|&i| と書く形式はなかなか検索では出てこない。
322デフォルトの名無しさん
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と同じ
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=6d886f2d3b944871c18856f0e19da71c
iterがshared referenceをイテレートするから
パターンマッチで`&`を1枚剥がした型にして使ってる
for &i in iterと同じ
323デフォルトの名無しさん
2020/03/30(月) 04:40:37.32ID:Oymj8mf6324デフォルトの名無しさん
2020/03/30(月) 04:45:30.74ID:Oymj8mf6 誤: let x:&i32 = y;
正: let x:&i32 = &y;
正: let x:&i32 = &y;
325デフォルトの名無しさん
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
左辺に代入する時にパターンマッチ使って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
326デフォルトの名無しさん
2020/03/30(月) 14:27:14.40ID:Oymj8mf6327デフォルトの名無しさん
2020/03/30(月) 14:34:27.40ID:yinACqvq328デフォルトの名無しさん
2020/03/30(月) 15:23:14.22ID:/1SwYHDd 1.38からはstd::any::type_nameがstabilizeされてるので
エラーメッセージやnightly使わずに変数の型をprintして確認できるみたい
(consumeしないようにreferenceで渡すから少し分かりにくいかもだけど)
fn type_of<T>(_: &T) -> &str {
std::any::type_name::<T>()
}
fn main() {
let i = 1;
let i = &i;
let &i = i;
println!("{}", type_of(&i));
}
type_name_of_valってのも追加されてるけど
こっちはまだstabilizeされてない
エラーメッセージやnightly使わずに変数の型をprintして確認できるみたい
(consumeしないようにreferenceで渡すから少し分かりにくいかもだけど)
fn type_of<T>(_: &T) -> &str {
std::any::type_name::<T>()
}
fn main() {
let i = 1;
let i = &i;
let &i = i;
println!("{}", type_of(&i));
}
type_name_of_valってのも追加されてるけど
こっちはまだstabilizeされてない
329デフォルトの名無しさん
2020/03/30(月) 16:45:46.87ID:Oymj8mf6330デフォルトの名無しさん
2020/03/30(月) 18:21:13.55ID:/1SwYHDd >>329
聞く前に試せばわかるよね
聞く前に試せばわかるよね
331デフォルトの名無しさん
2020/03/30(月) 18:43:59.32ID:QPHAwv8T /1SwYHDd氏やるなぁ
こういう細かいことまで知ってる人のRust歴気になる
こういう細かいことまで知ってる人のRust歴気になる
332デフォルトの名無しさん
2020/03/31(火) 00:49:28.04ID:bdtzxXSI さっきオナラしようとしたらウンチが少し出てしまったんだけど
ばれてないからいいよね ごめんね
ばれてないからいいよね ごめんね
333デフォルトの名無しさん
2020/03/31(火) 03:36:52.65ID:Hb9bQaKd 在宅だったら放屁は自由
334デフォルトの名無しさん
2020/03/31(火) 13:51:38.31ID:Ow5tuxOJ う〜ん。 ちがうなぁ。
335デフォルトの名無しさん
2020/04/01(水) 05:04:17.87ID:2vQ3PjhV やりたいこと
Optionからの安全な値の取り出しを構文レベルで保証、およびNone時に数行の処理と戻り値を伴う正常の早期returnをしたい
if Some(v) = foo.get() {
安全に取り出せるがネストが嫌すぎる
} else {
位置が遠すぎる
}
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(||{
は?正常終了つってんだろが?エラー値で返すんじゃねえよバカか?
})?;
Optionからの安全な値の取り出しを構文レベルで保証、およびNone時に数行の処理と戻り値を伴う正常の早期returnをしたい
if Some(v) = foo.get() {
安全に取り出せるがネストが嫌すぎる
} else {
位置が遠すぎる
}
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(||{
は?正常終了つってんだろが?エラー値で返すんじゃねえよバカか?
})?;
336デフォルトの名無しさん
2020/04/01(水) 08:10:52.28ID:3tt/1DhK let v = foo?;
337デフォルトの名無しさん
2020/04/01(水) 08:19:02.46ID:2vQ3PjhV は?
338デフォルトの名無しさん
2020/04/01(水) 09:19:54.63ID:yrAQuZWY 構文を調整したいならマクロじゃない?
let v = safe_get!(v, {
失敗した
return Ok (());
});
みたいな。ベタ書き以外でearly returnしたいならマクロか?演算子みたいにコンパイラサポートがいると思う。
let v = safe_get!(v, {
失敗した
return Ok (());
});
みたいな。ベタ書き以外でearly returnしたいならマクロか?演算子みたいにコンパイラサポートがいると思う。
339デフォルトの名無しさん
2020/04/01(水) 10:13:55.16ID:0Fs3VJge なんでboolって1byteあるの?
340デフォルトの名無しさん
2020/04/01(水) 11:20:10.79ID:5VJq6KKK C は bit field あるのにな
341デフォルトの名無しさん
2020/04/01(水) 11:25:37.12ID:qjrNWUcZ >>335
map_or_elseでSomeの時とNoneの時に適用するクロージャを渡せる
でもどうしても1行で書きたいとかchainしたい場合じゃなければ普通にmatchかif-else使うな
fn foo(){
get().map_or_else(|| bar(), |x| baz(x))
}
fn foo(){
match get() {
None => bar(),
Some(x) => baz(x)
}
}
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=dd9040426e54f1dfc6e39d07bbd219fb
map_or_elseでSomeの時とNoneの時に適用するクロージャを渡せる
でもどうしても1行で書きたいとかchainしたい場合じゃなければ普通にmatchかif-else使うな
fn foo(){
get().map_or_else(|| bar(), |x| baz(x))
}
fn foo(){
match get() {
None => bar(),
Some(x) => baz(x)
}
}
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=dd9040426e54f1dfc6e39d07bbd219fb
342デフォルトの名無しさん
2020/04/01(水) 11:30:33.60ID:eoE2gHM2 >>341
クロージャ渡しじゃearly returnできないって話では?
クロージャ渡しじゃearly returnできないって話では?
343デフォルトの名無しさん
2020/04/01(水) 12:21:13.46ID:qjrNWUcZ344デフォルトの名無しさん
2020/04/01(水) 13:43:58.79ID:npfcBiID345デフォルトの名無しさん
2020/04/01(水) 14:12:02.37ID:Wuhu+msT ネストが嫌なんだから無理でしょ
ネストしないコードを書く人なんだろうけど
ネストしないコードを書く人なんだろうけど
346デフォルトの名無しさん
2020/04/01(水) 17:06:40.66ID:qjrNWUcZ >>344
なるほど理解した
どうしてもearly returnがしたくてunwrapも嫌なら
if letを2回やるか、is_none+if let Someでもいい気がする
マクロ書いてもidiomaticな形に比べて読みやすくなるかっていうと微妙なので
fn foo(x: &str) -> Result<()>{
let v = safe_get!(get(x), { …; return Ok(()) });
let v = baz(v)?;
qux(v)?
}
fn foo(x: &str) -> Result<()>{
if let Some(v) = get(x) {
let v = baz(v)?;
qux(v)?;
}
Ok(())
}
なるほど理解した
どうしてもearly returnがしたくてunwrapも嫌なら
if letを2回やるか、is_none+if let Someでもいい気がする
マクロ書いてもidiomaticな形に比べて読みやすくなるかっていうと微妙なので
fn foo(x: &str) -> Result<()>{
let v = safe_get!(get(x), { …; return Ok(()) });
let v = baz(v)?;
qux(v)?
}
fn foo(x: &str) -> Result<()>{
if let Some(v) = get(x) {
let v = baz(v)?;
qux(v)?;
}
Ok(())
}
347デフォルトの名無しさん
2020/04/01(水) 19:39:22.27ID:2vQ3PjhV "処理と戻り値"を伴う""正常""の早期returnをしたいといってるだろがErrでラップして返すとかバカか?
こういうSomeから取り出すだけの部分が冗長だから消えてなくなれつってんだよ
is_none()でやるのは構文保証ではなく"プログラマーの注意力"による保証だからクソだつってんだよ
let v = match foo.get() { Some(v) => v, None => {
bar.modify();
baz.modify();
return Ok(bar, baz);
}};
let v = if let Some(v) = foo.get() { v } else {
bar.modify();
baz.modify();
return Ok(bar, baz);
}};
こういうSomeから取り出すだけの部分が冗長だから消えてなくなれつってんだよ
is_none()でやるのは構文保証ではなく"プログラマーの注意力"による保証だからクソだつってんだよ
let v = match foo.get() { Some(v) => v, None => {
bar.modify();
baz.modify();
return Ok(bar, baz);
}};
let v = if let Some(v) = foo.get() { v } else {
bar.modify();
baz.modify();
return Ok(bar, baz);
}};
348デフォルトの名無しさん
2020/04/01(水) 20:41:14.76ID:SX13wyIA349デフォルトの名無しさん
2020/04/01(水) 20:49:40.54ID:/Onfa91A 宣言的な書き方の基本が分かってないんやろな
Rust以前のレベル
Rust以前のレベル
350デフォルトの名無しさん
2020/04/01(水) 21:05:02.98ID:SX13wyIA351デフォルトの名無しさん
2020/04/01(水) 21:36:42.23ID:SEIF3iTR 言語としても長い間議論があったみたいだけど、まとまらなかったみたいね
https://github.com/rust-lang/rfcs/pull/1303
https://github.com/rust-lang/rfcs/pull/1303
352デフォルトの名無しさん
2020/04/01(水) 21:36:47.02ID:qjrNWUcZ >>347
>"処理と戻り値"を伴う""正常""の早期returnをしたいといってるだろがErrでラップして返すとかバカか?
えっ、 Errでラップして返してる?
まぁそれはいいとしてearly returnだけじゃなく
戻り値の型と取り出した値をどうするかをセットで考えてないから
そうなっちゃうんだと思うよ
>"処理と戻り値"を伴う""正常""の早期returnをしたいといってるだろがErrでラップして返すとかバカか?
えっ、 Errでラップして返してる?
まぁそれはいいとしてearly returnだけじゃなく
戻り値の型と取り出した値をどうするかをセットで考えてないから
そうなっちゃうんだと思うよ
353デフォルトの名無しさん
2020/04/01(水) 22:01:23.20ID:SX13wyIA RFCざっと見てきたけど、あっちでも
「map_errでいいんじゃ?」「return;できねーよ」ってやってるな。
そんなに難解なリクエストでもないと思うんだが。
「map_errでいいんじゃ?」「return;できねーよ」ってやってるな。
そんなに難解なリクエストでもないと思うんだが。
354デフォルトの名無しさん
2020/04/01(水) 22:20:38.50ID:0Fs3VJge fn check<T>(mut f: impl FnMut(T) -> bool)
と
fn check<T, F>(mut f: F)
where F: FnMut(T) -> bool
って同意義ですか?
と
fn check<T, F>(mut f: F)
where F: FnMut(T) -> bool
って同意義ですか?
355デフォルトの名無しさん
2020/04/02(木) 03:46:30.54ID:0zdT1xZ7356デフォルトの名無しさん
2020/04/02(木) 03:48:18.19ID:0zdT1xZ7 なお、このような場合の whereは、日本人感覚からすれば、ifと読み替えてもいい。
357デフォルトの名無しさん
2020/04/02(木) 05:35:03.07ID:zwgg3bUK 前者の場合 check::<T, F>() でコールできるが後者はできない
358デフォルトの名無しさん
2020/04/02(木) 17:07:56.47ID:SaXsz2/b 前者と後者が逆?
359デフォルトの名無しさん
2020/04/02(木) 20:28:06.36ID:7RFFBbbD これ
https://docs.rs/try_or/0.2.0/try_or/macro.try_opt_or_else.html
Unwraps an Option. If the result is None, calls the function $or_fn and returns its result.
https://docs.rs/try_or/0.2.0/try_or/macro.try_opt_or_else.html
Unwraps an Option. If the result is None, calls the function $or_fn and returns its result.
360デフォルトの名無しさん
2020/04/02(木) 21:53:44.49ID:zwgg3bUK >>358
逆にだったすまん
逆にだったすまん
361デフォルトの名無しさん
2020/04/02(木) 23:30:20.89ID:SaXsz2/b そもそもcheck::<T, F>()じゃ引数渡してないから呼び出せなくない? 試してないけど
362デフォルトの名無しさん
2020/04/03(金) 00:13:24.70ID:RIPEgpHK 構文で解決すべきところを皆が俺俺マクロで解決して統一感ない状態を生むのが良いと考えるやついるのか?
363デフォルトの名無しさん
2020/04/03(金) 00:44:31.97ID:11HfTHW1 if foo.is_none() {
シンプルにこれでいいと思うんだが...
これぐらいの細かい挙動で構文拡張しろとかマクロ書けとかなったらC++みたいになっていくのが目に見えるしから嫌だわ
しかもこんな嫌だ嫌だ言ってて質問する立場なのにこんな逆ギレもしてて救いようがない
シンプルにこれでいいと思うんだが...
これぐらいの細かい挙動で構文拡張しろとかマクロ書けとかなったらC++みたいになっていくのが目に見えるしから嫌だわ
しかもこんな嫌だ嫌だ言ってて質問する立場なのにこんな逆ギレもしてて救いようがない
364デフォルトの名無しさん
2020/04/03(金) 00:44:38.25ID:8O7qKRUc 現状は335が冗長と言う状態で統一されてるんだからいいんじゃないの。
その冗長さをどうしても許容できない人は(少数派である以上)マクロで解決するしかないし、もし大多数が賛同できる新構文を思い付いたならRFC出せばいい。
その冗長さをどうしても許容できない人は(少数派である以上)マクロで解決するしかないし、もし大多数が賛同できる新構文を思い付いたならRFC出せばいい。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国「国連安保理の許可なしに日本攻撃可能」 Xで旧敵国条項に言及… ★12 [BFU★]
- 台湾有事での集団的自衛権行使に賛成48%、「反対」が44.2% [♪♪♪★]
- 首相官邸前で「戦争あおるな」 台湾有事巡る答弁に抗議 ★3 [蚤の市★]
- 中国・国連大使「日本側は反省せず、発言の撤回拒否」 書簡を国連事務総長に送る [♪♪♪★]
- 中国「国連安保理の許可なしに日本攻撃可能」 Xで旧敵国条項に言及… ★13 [BFU★]
- 【NHK】受信料の未払い督促を10倍に強化… 支払い拒否が続くと民事手続きも 「カーナビも受信料いただきます」方針 [冬月記者★]
- 【フジテレビ】2025 FORMULA 1【NEXT】Lap600
- 【DAZN】フォーミュラGP【F1 2 3 SF P】Lap1807
- 京都競馬4回5日目エリザベス女王杯★3
- 福島競馬3回5日目
- こいせん 全レス転載禁止
- はません ★2
- 国民「コメが高くて買えないの助けて!」米卸「コメが高くて売れないの助けて!」農水相「価格はマーケット決めるものです🥴」 [817260143]
- 【悲報】高市早苗日本国総理大臣「外交交渉でマウント取れる」 [115996789]
- 【高市悲報】服👕はユニクロでいいおじさん 「服はユニクロでいい」 どうすんのこれ [573041775]
- 【撤退】高市発言の余波、、日本車のシェア低下で、中国市場から日系企業の撤退、縮小が相次ぐ可能性。これがネトウヨが望んだ未来か、 [219241683]
- 小野田大臣「それ正式なデータですか?報道ベースですよね」(10万いいね) [237216734]
- イ・ジェミョン「台湾有事で台湾を助けるかは宇宙人が地球に侵攻してきたらその時に考える」高市に格の違いを見せつける [931948549]
