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 part8
https://mevius.5ch.net/test/read.cgi/tech/1579834072/
Rust part9
■ このスレッドは過去ログ倉庫に格納されています
2020/08/23(日) 01:07:35.52ID:MgEpWwVh
222デフォルトの名無しさん
2020/09/26(土) 09:30:48.93ID:en54jqZM >>220
returnがあればearly returnだと識別できるのでその意味では視認性は高い
ただセミコロンというC系言語経験者が注視しない記号に新しく重要な意味をもたせたから戸惑う
>>221
ifブロック末尾のセミコロンは常に省略できるわけじゃない
https://doc.rust-lang.org/reference/statements.html#expression-statements
セミコロンがないと意図通りパースできないケースってほとんどないと思うので
そのうちJSのASIのようなものでセミコロン不要になる未来もある気がする
returnがあればearly returnだと識別できるのでその意味では視認性は高い
ただセミコロンというC系言語経験者が注視しない記号に新しく重要な意味をもたせたから戸惑う
>>221
ifブロック末尾のセミコロンは常に省略できるわけじゃない
https://doc.rust-lang.org/reference/statements.html#expression-statements
セミコロンがないと意図通りパースできないケースってほとんどないと思うので
そのうちJSのASIのようなものでセミコロン不要になる未来もある気がする
223デフォルトの名無しさん
2020/09/26(土) 10:01:37.83ID:GOW7LNc9 個人的にはセミコロンうんぬんよりifの中括弧が苦痛
/* c */
#include <stdio.h>
#define min(a, b) ((a) < (b) ? (a) : (b)) // スッキリ
int min2(int a, int b) {return a < b ? a : b;} // ややスッキリ
int min3(int a, int b) {
if (a < b) return a; else return b; // スッキリ?
}
int main() {
printf("%d ", min(3, 2));
printf("%d ", min2(3, 2));
printf("%d ", min3(3, 2));
return 0;
}
// rust
fn main() {
let min = |a, b| if a < b {a} else {b}; // 中括弧が嫌
//let min = |a, b| if (a < b) a else b; // これならスッキリ
//let min = |a, b| if a < b then a else b; // あるいはこれ
println!("{}", min(3, 2));
}
(* ocaml *)
let min a b = if a < b then a else b (* スッキリ *)
let () = print_int (min 3 2)
/* c */
#include <stdio.h>
#define min(a, b) ((a) < (b) ? (a) : (b)) // スッキリ
int min2(int a, int b) {return a < b ? a : b;} // ややスッキリ
int min3(int a, int b) {
if (a < b) return a; else return b; // スッキリ?
}
int main() {
printf("%d ", min(3, 2));
printf("%d ", min2(3, 2));
printf("%d ", min3(3, 2));
return 0;
}
// rust
fn main() {
let min = |a, b| if a < b {a} else {b}; // 中括弧が嫌
//let min = |a, b| if (a < b) a else b; // これならスッキリ
//let min = |a, b| if a < b then a else b; // あるいはこれ
println!("{}", min(3, 2));
}
(* ocaml *)
let min a b = if a < b then a else b (* スッキリ *)
let () = print_int (min 3 2)
224デフォルトの名無しさん
2020/09/26(土) 12:46:41.58ID:XnDuVG4Q はいはいdangling else dangling else
225デフォルトの名無しさん
2020/09/26(土) 13:01:32.24ID:nz56jET8 Goもそうだけど、条件式に括弧を使わないのがいまだに慣れない。
226デフォルトの名無しさん
2020/09/26(土) 13:49:35.37ID:Rxc/dJS+ BASIC は要らなかったから慣れてる。
3項演算子考えたやつは天才。
3項演算子考えたやつは天才。
227デフォルトの名無しさん
2020/09/26(土) 14:34:05.78ID:d+bfMgei228デフォルトの名無しさん
2020/09/26(土) 14:40:21.79ID:Lg3GZEAb >>225
そのへんとモジュールまわりはPythonの影響かなと思った
そのへんとモジュールまわりはPythonの影響かなと思った
229デフォルトの名無しさん
2020/09/26(土) 16:28:05.98ID:en54jqZM >>228
PythonというよりRubyだろね
コアチームは過去も含めてRubyコミュニティ出身者が多いから
モジュールはPythonのようにファイルベースじゃなくキーワードで名前空間をきちんと切るし
クロージャの書き方だったりreturnを書かない慣習だったりも他言語に比べて類似性が高い
PythonというよりRubyだろね
コアチームは過去も含めてRubyコミュニティ出身者が多いから
モジュールはPythonのようにファイルベースじゃなくキーワードで名前空間をきちんと切るし
クロージャの書き方だったりreturnを書かない慣習だったりも他言語に比べて類似性が高い
230デフォルトの名無しさん
2020/09/26(土) 16:42:46.56ID:d+bfMgei 型システムは ML 系の言語でよくあるやつだし、
そっち方面の影響もあるんじゃないの?
そっち方面の影響もあるんじゃないの?
231デフォルトの名無しさん
2020/09/26(土) 17:41:02.34ID:iHt0gIo3232デフォルトの名無しさん
2020/09/26(土) 17:52:07.70ID:YRaYmiXd233デフォルトの名無しさん
2020/09/26(土) 18:02:33.75ID:2tuZfHCi if a < b => a else => b っていう変なもんを思いついてしまった
だーめだこりゃ
だーめだこりゃ
234デフォルトの名無しさん
2020/09/27(日) 04:32:18.28ID:Wycq4Ck4 セミコロンとかはEdition上げて撤廃してほしいけど、ここまでRustのOSS書かれてたら無理だろなぁ...
235デフォルトの名無しさん
2020/09/27(日) 07:58:10.90ID:ePGxxCtX >>232
それはSmalltalkだろ
それはSmalltalkだろ
236デフォルトの名無しさん
2020/09/27(日) 08:00:03.20ID:6sIZ9RBB Rust, Go, Elixir などの新しい言語は、Ruby の影響が強い。
Ruby で最も良いのは、すべての進数の数値リテラルに、_ を含められること
こういうコメントを書かなくて済む
1000000 // 1_000_000
Ruby で最も良いのは、すべての進数の数値リテラルに、_ を含められること
こういうコメントを書かなくて済む
1000000 // 1_000_000
237デフォルトの名無しさん
2020/09/27(日) 09:53:51.56ID:xq8pY9v9 戻り値の有無がセミコロンだけで区別されている現状をどうにかしないとそもそもセミコロン廃止なんて
無理だろうけど、セミコロンレスってそんなにいいかねぇ?
行の折り返しを間違えて別の文になってしまってもスルーされる場合があるのがなんか嫌。
ASIがあるJSでもメジャーどころのスタイルガイドはみんなASIを信用しないでセミコロン使うことに
なっているし。
pythonだとセミコロン使わないスタイルも多いけど、あっちはインデントで判別できるしね。
無理だろうけど、セミコロンレスってそんなにいいかねぇ?
行の折り返しを間違えて別の文になってしまってもスルーされる場合があるのがなんか嫌。
ASIがあるJSでもメジャーどころのスタイルガイドはみんなASIを信用しないでセミコロン使うことに
なっているし。
pythonだとセミコロン使わないスタイルも多いけど、あっちはインデントで判別できるしね。
238デフォルトの名無しさん
2020/09/27(日) 10:45:39.75ID:5NvF/cEJ >>237
>ASIを信用しないでセミコロン使うことに
ASIを信用してないわけじゃないよ
ASIの仕様はJSの仕様で決まってるから例外的に挿入されない場合もはっきり分かってる
セミコロンを使うスタイルが多いのはミニファイとかを考慮してるから
JSの場合は普通に書いてる分にはセミコロンの有無でほぼ違いが無い上に
セミコロンレスで書いてもリンター使って自動挿入できるから実質書き手の自由
1行に複数文書いてるときでもなければセミコロンに特別な意味はないから気にする必要がない
>ASIを信用しないでセミコロン使うことに
ASIを信用してないわけじゃないよ
ASIの仕様はJSの仕様で決まってるから例外的に挿入されない場合もはっきり分かってる
セミコロンを使うスタイルが多いのはミニファイとかを考慮してるから
JSの場合は普通に書いてる分にはセミコロンの有無でほぼ違いが無い上に
セミコロンレスで書いてもリンター使って自動挿入できるから実質書き手の自由
1行に複数文書いてるときでもなければセミコロンに特別な意味はないから気にする必要がない
239デフォルトの名無しさん
2020/09/27(日) 11:08:19.83ID:OQ0JAVEc セミコロンは基本的にはあっていいけどたまに}のあとに;必要なやつとかあったりしてこれはイヤ
240デフォルトの名無しさん
2020/09/27(日) 11:27:51.54ID:xq8pY9v9 たしかに「ASIを信用しないで」というと疑っているみたいだから「依存しないで」の方が
適切だったかも。
いずれにしても、どのスタイルガイドもプログラマの意図と異なる判断がされる危険を
挙げていて、それを防ぐためには明示的にセミコロンを記述する方が良いと謳っている。
minifyはそれこそminify時にセミコロンを補完すればいいんだから関係ないと思う。
適切だったかも。
いずれにしても、どのスタイルガイドもプログラマの意図と異なる判断がされる危険を
挙げていて、それを防ぐためには明示的にセミコロンを記述する方が良いと謳っている。
minifyはそれこそminify時にセミコロンを補完すればいいんだから関係ないと思う。
241デフォルトの名無しさん
2020/09/27(日) 11:40:37.55ID:NFiicpwR242デフォルトの名無しさん
2020/09/27(日) 12:00:44.11ID:4LQaG5je セミコロン撤廃要望多いとは思えないんだけどRFCとか書いてる人いるのか?
243デフォルトの名無しさん
2020/09/27(日) 12:27:31.82ID:MoLnvbgN セミコロン書き忘れる事は多々あるけど、意図しない値が返ってとかならない(はず)なので別に困らない
それより、Docs.rsに見にくいクレートが有る方が困る、AutoとBlanket以外のShow hidden undocumented itemsを
デフォルトで展開するオプションが有れば良いのに、この議題はどっかで見たような気がする。
それより、Docs.rsに見にくいクレートが有る方が困る、AutoとBlanket以外のShow hidden undocumented itemsを
デフォルトで展開するオプションが有れば良いのに、この議題はどっかで見たような気がする。
244デフォルトの名無しさん
2020/09/27(日) 12:34:01.78ID:FTgnsV+4 >>241
1967のPL/Iあたりからかな?登場時期からするともっと広まってもおかしくなかった気もするけど、16/32ビットリテラルしかなかった時代には需要なかったんだろうね。verilogは何ビットでもいけるから必要だけど。
最近は128ビット型とかBigIntとかでようやく必要になってきたってことか。
1967のPL/Iあたりからかな?登場時期からするともっと広まってもおかしくなかった気もするけど、16/32ビットリテラルしかなかった時代には需要なかったんだろうね。verilogは何ビットでもいけるから必要だけど。
最近は128ビット型とかBigIntとかでようやく必要になってきたってことか。
245デフォルトの名無しさん
2020/09/27(日) 12:55:24.47ID:ePGxxCtX rustのAPI documentなんか読みづらい気がする
うまく説明できないけど
型クラスのあたりも見づらい
うまく説明できないけど
型クラスのあたりも見づらい
246デフォルトの名無しさん
2020/09/27(日) 13:55:00.63ID:5NvF/cEJ >>240
きちんとした手順にそったminifyだけを指して言ったわけじゃないんだが
GoogleやAirbnbのstyle guideを見ると確かにそういう意図ではないみたいだね
npmやGithubみたいにセミコロンレスのstandard style使ってるところも多いから
「メジャーどころはみんなセミコロンを明示的に書く」というのはちと言い過ぎかな
いずれにしろJSの場合は1コマンドで一瞬で切り替え可能で書く時はどっちでいいから
Rustとはかなり事情が違うと思う
きちんとした手順にそったminifyだけを指して言ったわけじゃないんだが
GoogleやAirbnbのstyle guideを見ると確かにそういう意図ではないみたいだね
npmやGithubみたいにセミコロンレスのstandard style使ってるところも多いから
「メジャーどころはみんなセミコロンを明示的に書く」というのはちと言い過ぎかな
いずれにしろJSの場合は1コマンドで一瞬で切り替え可能で書く時はどっちでいいから
Rustとはかなり事情が違うと思う
247デフォルトの名無しさん
2020/09/27(日) 14:15:05.14ID:5NvF/cEJ >>242
探してみたらRFCあったけどCloseされてた
https://github.com/rust-lang/rfcs/issues/2583
C/C++/G#/Javaあたりから来た人はセミコロンあるのが普通だろうけど
Go/Scala/Swift/Kotlin/Ruby/Pythonだとセミコロンないのが普通なので面倒くさく感じるのよ
RFCのやり取りや↓ここの議論を見るとセミコロンが不要になる可能性はもうないね
https://internals.rust-lang.org/t/make-some-separators-optional/4846
探してみたらRFCあったけどCloseされてた
https://github.com/rust-lang/rfcs/issues/2583
C/C++/G#/Javaあたりから来た人はセミコロンあるのが普通だろうけど
Go/Scala/Swift/Kotlin/Ruby/Pythonだとセミコロンないのが普通なので面倒くさく感じるのよ
RFCのやり取りや↓ここの議論を見るとセミコロンが不要になる可能性はもうないね
https://internals.rust-lang.org/t/make-some-separators-optional/4846
248デフォルトの名無しさん
2020/09/27(日) 15:12:03.29ID:FTgnsV+4 セミコロンレスってフォーマット的な改行と文末の改行を文脈を見て判断する必要があるから好きじゃないなぁ。
一文が複数行になりやすいビルダーパターンとかイテレータアダプタの類いが特に。
入力する側としてはほとんど無意識に打ってるから特に面倒とも感じないし。
一文が複数行になりやすいビルダーパターンとかイテレータアダプタの類いが特に。
入力する側としてはほとんど無意識に打ってるから特に面倒とも感じないし。
249デフォルトの名無しさん
2020/09/27(日) 15:18:06.12ID:ePGxxCtX IntelliJ使えばセミコロンを殆ど見えないような色に設定できるぞ
250デフォルトの名無しさん
2020/09/27(日) 19:00:04.17ID:4LQaG5je 典型的なbikeshed
251デフォルトの名無しさん
2020/09/28(月) 01:45:21.81ID:1Vhx5XJ3 >>223
ocamlってセミコロン必要じゃなかったっけ?
ocamlってセミコロン必要じゃなかったっけ?
252デフォルトの名無しさん
2020/09/28(月) 07:53:40.34ID:cZtg7eSb >>251
この例では必要になる場所は無い
この例では必要になる場所は無い
253デフォルトの名無しさん
2020/09/28(月) 09:58:13.64ID:UVos1NUC docsのフロント部分は特に強いUXデザイナーがいない感じがすごくする
254デフォルトの名無しさん
2020/09/28(月) 18:49:05.66ID:5HiAAmxH >>251
トップレベルの分を区切るのに;;を使う
ただしletの直前、ファイルの最後、などでは省略できる
https://ocaml.org/learn/tutorials/structure_of_ocaml_programs.ja.html
構文は
https://ocaml.org/releases/4.11/htmlman/language.html
let min a b = if a < b then a else b (* letの直前だから;;省略 *)
let () = print_int (min 3 2) (* ファイルの最後だから;;省略 *)
トップレベルの分を区切るのに;;を使う
ただしletの直前、ファイルの最後、などでは省略できる
https://ocaml.org/learn/tutorials/structure_of_ocaml_programs.ja.html
構文は
https://ocaml.org/releases/4.11/htmlman/language.html
let min a b = if a < b then a else b (* letの直前だから;;省略 *)
let () = print_int (min 3 2) (* ファイルの最後だから;;省略 *)
255デフォルトの名無しさん
2020/10/01(木) 14:03:33.62ID:WCPslwmj slice::windowsのstrバージョンみたいなのってないのでしょうか。
ようするにある文字列に含まれる連続するn文字を頭から順に返すイテレータを作ってくれるようなやつです。
ようするにある文字列に含まれる連続するn文字を頭から順に返すイテレータを作ってくれるようなやつです。
256デフォルトの名無しさん
2020/10/01(木) 18:29:40.74ID:HHhjPj0U >>255
ないのでVec<char>を生成してwindowsを呼ぶとか
let cs: Vec<_> = String::from("あいうえお").chars().collect();
let ws: Vec<_> = cs.windows(2).map(|v| v.iter().collect::<String>()).collect();
ないのでVec<char>を生成してwindowsを呼ぶとか
let cs: Vec<_> = String::from("あいうえお").chars().collect();
let ws: Vec<_> = cs.windows(2).map(|v| v.iter().collect::<String>()).collect();
257デフォルトの名無しさん
2020/10/01(木) 18:54:04.45ID:i8Yvf3kp 文字幅が可変長 (utf-8) であっても windows みたいなことをするのはそんなにコスト大きくないよね?
ふたつのポインタを一文字ずつ進めるだけなんだから O(N) で出来るはず。
ふたつのポインタを一文字ずつ進めるだけなんだから O(N) で出来るはず。
258デフォルトの名無しさん
2020/10/02(金) 09:46:31.03ID:D4+ZSkLl アロケートなしだと、
(0..s.len()-n).map(|i| &s[i..i+n])
となるけど自分で-nとか+nとかiとかやるのめっちゃアホくさいしそのうちミスりそう
(0..s.len()-n).map(|i| &s[i..i+n])
となるけど自分で-nとか+nとかiとかやるのめっちゃアホくさいしそのうちミスりそう
259デフォルトの名無しさん
2020/10/02(金) 14:20:31.00ID:iKrdrFom >>258
アロケートなしならこれでもいけるはず。utf8を食わせると死ぬけど
.as_bytes().windows(2).map(|v| std::str::from_utf8(v).unwrap())
アロケートなしならこれでもいけるはず。utf8を食わせると死ぬけど
.as_bytes().windows(2).map(|v| std::str::from_utf8(v).unwrap())
260デフォルトの名無しさん
2020/10/08(木) 09:18:16.25ID:PyhRFgfx アロケートなしっていっても結局collect::<Vec<_>>()するんだからなしって表現は違うくないか
261デフォルトの名無しさん
2020/10/08(木) 09:56:48.36ID:Ney38h5h collectするとは限らんやろ
ヒット数だけ必要な場合とか
ヒット数だけ必要な場合とか
262デフォルトの名無しさん
2020/10/09(金) 10:41:17.11ID:mqWQnM2v Rust 1.47リリース
263デフォルトの名無しさん
2020/10/12(月) 16:21:28.62ID:Z3Kcjb2S Vec<T>って既に有る要素の中身を修正する方法はありますか。
有れば教えていただければ幸いです。
有れば教えていただければ幸いです。
264デフォルトの名無しさん
2020/10/12(月) 16:28:10.38ID:Z3Kcjb2S 自分が見た本ではvec[0]でアクセスする例は出てなかったと思うのですが
今ネットで見たところ
let mut vec = Vec::new();
vec.push(1);
vec.push(2);
vec[0] = 7
という例がありました。
Vec<T>の要素Tが構造体の場合、
vec[0]のアドレスを参照で受け取ってアクセスするには
let &mut a=&v[0];
a.xxx = yyy;
でよいのでしょうか?
(基礎が分かって無いだけかもしれませんが)
今ネットで見たところ
let mut vec = Vec::new();
vec.push(1);
vec.push(2);
vec[0] = 7
という例がありました。
Vec<T>の要素Tが構造体の場合、
vec[0]のアドレスを参照で受け取ってアクセスするには
let &mut a=&v[0];
a.xxx = yyy;
でよいのでしょうか?
(基礎が分かって無いだけかもしれませんが)
265デフォルトの名無しさん
2020/10/12(月) 16:30:35.47ID:ldeP4Qys .get
.get_mut
.get_mut
266デフォルトの名無しさん
2020/10/12(月) 16:48:39.55ID:Z3Kcjb2S267デフォルトの名無しさん
2020/10/12(月) 17:02:51.68ID:tosLr/AM std::ops::Indexとstd::ops::IndexMutをリファレンスで見て
268デフォルトの名無しさん
2020/10/12(月) 17:06:26.06ID:tosLr/AM269デフォルトの名無しさん
2020/10/12(月) 19:19:30.09ID:Z3Kcjb2S270デフォルトの名無しさん
2020/10/12(月) 19:50:22.11ID:ldeP4Qys https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=a388e403b6cd7afe902a9fd8618b5a65
質問内容とブレてたらごめんなさい
質問内容とブレてたらごめんなさい
271デフォルトの名無しさん
2020/10/12(月) 19:53:01.17ID:P0Nqqpd2 TがCopyだと let &mut a = &mut v[0]; ならコンパイル通っちゃうのは落とし穴かもしれない
272デフォルトの名無しさん
2020/10/12(月) 19:54:11.97ID:P0Nqqpd2 >>270
get_mutをunwrapしちゃうなら普通に &mut v[0] で良いと思う
get_mutをunwrapしちゃうなら普通に &mut v[0] で良いと思う
273デフォルトの名無しさん
2020/10/20(火) 10:25:29.99ID:ohigEgI0 Rustは2番目にエネルギー効率の良い言語
https://okuranagaimo.blogspot.com/2020/10/blog-post_19.html
https://okuranagaimo.blogspot.com/2020/10/blog-post_19.html
274デフォルトの名無しさん
2020/10/20(火) 12:34:59.11ID:MZbW1JAa アセンブラ使えないやつがいるとは。
275デフォルトの名無しさん
2020/10/20(火) 19:00:44.91ID:CHq3Beyq 勉強始めたばかりですが変数のシャドーイングって必要ですか?
なんとなくグローバルに置いた変数もシャドーイングできそうなのですが実害は出たことありますか?
多分ないと思いますが…
なんとなくグローバルに置いた変数もシャドーイングできそうなのですが実害は出たことありますか?
多分ないと思いますが…
276デフォルトの名無しさん
2020/10/20(火) 19:31:52.86ID:KPdri9BA Which Programming Languages Use the Least Electricity?
https://thenewstack.io/which-programming-languages-use-the-least-electricity/
> Energy consumed Run-time
> C 57J 2019 ms
> Rust 59J 2103 ms
> C++ 77J 3155 ms
> Ada 98J 3740 ms
> Java 114J 3821 ms
https://thenewstack.io/which-programming-languages-use-the-least-electricity/
> Energy consumed Run-time
> C 57J 2019 ms
> Rust 59J 2103 ms
> C++ 77J 3155 ms
> Ada 98J 3740 ms
> Java 114J 3821 ms
277デフォルトの名無しさん
2020/10/20(火) 20:46:27.74ID:7hmMXh1W デバッグやバグ修正に必要なエネルギーコストを加味したらCより効率よくなりそう
278デフォルトの名無しさん
2020/10/21(水) 02:18:21.88ID:Q9+kxPSM Rustはビルドでめっちゃ電力使うやろ
279デフォルトの名無しさん
2020/11/01(日) 07:27:17.14ID:an3UASXf let mut bt = (0..10).collect::<BTreeSet<_>>();
for e in bt.iter() {
// ここで条件に一致する要素をbtから削除したい
}
こんな感じのものを作りたくなったのですがどうすればいいのでしょうか?
うまい具合にやる方法が思いつかなくて以下のようにやっているのですが、なんというかすごくアホくさいというか・・・
let mut bt = (0..10).collect::<BTreeSet<_>>();
let mut temp = Vec::new()
for e in bt.iter() {
if e == Foo { temp.push(e); } // 削除予定のものをtempに入れる
}
for e in temp {
bt.remove(&e);
}
for e in bt.iter() {
// ここで条件に一致する要素をbtから削除したい
}
こんな感じのものを作りたくなったのですがどうすればいいのでしょうか?
うまい具合にやる方法が思いつかなくて以下のようにやっているのですが、なんというかすごくアホくさいというか・・・
let mut bt = (0..10).collect::<BTreeSet<_>>();
let mut temp = Vec::new()
for e in bt.iter() {
if e == Foo { temp.push(e); } // 削除予定のものをtempに入れる
}
for e in temp {
bt.remove(&e);
}
280デフォルトの名無しさん
2020/11/01(日) 11:33:15.11ID:lQA9Y5E+ let bt = (0..10).filter(|e| eが要るなら真).collect::<BtreeSet<_>>();
じゃあかんのか
じゃあかんのか
281デフォルトの名無しさん
2020/11/01(日) 13:38:40.42ID:an3UASXf btがこの例のとおりのものならそれでいいんですけど、
いろんな状況でbtに要素が追加されるっていう感じです
あと、if e == Fooはちょっと雑すぎましたif is_xxx(e)とかのほうがよいです
いろんな状況でbtに要素が追加されるっていう感じです
あと、if e == Fooはちょっと雑すぎましたif is_xxx(e)とかのほうがよいです
282デフォルトの名無しさん
2020/11/01(日) 17:37:39.36ID:o3MRCmTo コンテナのイテレーターのループ回してる間にコンテナの要素を追加や削除は出来ない。これは他のコンテナ(Vecなど)でもそう。どうしてもやるなら内部実装を理解した上でunsafeな方法で。
「いろんな状況でbtに要素が追加される」がループ中なのか何なのか分からないのでどうしようもないが、
let bt = bt.into_iter().filter(|&e| e == foo).collect::<std::collections::BTreeSet<_>>();
で新たなbtを作るか、
もとのbtから要素を削除するにしても
for e in bt.iter().filter(|&&e| e == foo).cloned().collect::<Vec<_>>() {
bt.remove(&e);
}
などでもう少し簡潔に書ける。
「いろんな状況でbtに要素が追加される」がループ中なのか何なのか分からないのでどうしようもないが、
let bt = bt.into_iter().filter(|&e| e == foo).collect::<std::collections::BTreeSet<_>>();
で新たなbtを作るか、
もとのbtから要素を削除するにしても
for e in bt.iter().filter(|&&e| e == foo).cloned().collect::<Vec<_>>() {
bt.remove(&e);
}
などでもう少し簡潔に書ける。
283デフォルトの名無しさん
2020/11/01(日) 18:31:04.97ID:adfXjKjb BTreeSet::drain_filter が安定化されるのを待とう
std::collections の unatable な機能を含めて切り出した crate とかあれば良いのに
std::collections の unatable な機能を含めて切り出した crate とかあれば良いのに
284デフォルトの名無しさん
2020/11/01(日) 18:31:59.68ID:adfXjKjb >>282
Vec::retain がある。
Vec::retain がある。
285デフォルトの名無しさん
2020/11/01(日) 19:09:00.30ID:o3MRCmTo retainやdrain_filterについて不勉強だった。ありがとう。
286デフォルトの名無しさん
2020/11/06(金) 03:44:45.46ID:S3a0GE/K Rust book 構造体の章の以下のコード片なんですが
let mut user1 = User {
email: String::from("someone@example.com"),
email: String::from("someusername123"),
active: true,
sign_in_count: 1,
}
user1.email = String::from("another@example.com");
//コード片ここまで
最後の行でどこからも参照されなくなった元の
String::from("someone@example.com")
は、どういう理屈で解放されるんでしょうか?
もしGC言語なら最後の行でGC対象になるとこですけど。
Rust bookのこれ以前の章で、変数がスコープを外れるときdropが呼ばれることの説明はあったのですが、変数の束縛外れちゃったStringはいつ、どこで?
let mut user1 = User {
email: String::from("someone@example.com"),
email: String::from("someusername123"),
active: true,
sign_in_count: 1,
}
user1.email = String::from("another@example.com");
//コード片ここまで
最後の行でどこからも参照されなくなった元の
String::from("someone@example.com")
は、どういう理屈で解放されるんでしょうか?
もしGC言語なら最後の行でGC対象になるとこですけど。
Rust bookのこれ以前の章で、変数がスコープを外れるときdropが呼ばれることの説明はあったのですが、変数の束縛外れちゃったStringはいつ、どこで?
287デフォルトの名無しさん
2020/11/06(金) 04:09:10.53ID:2cok4roU288デフォルトの名無しさん
2020/11/06(金) 04:35:01.60ID:B4UB4dMh289デフォルトの名無しさん
2020/11/06(金) 07:48:41.67ID:aWxirctc >>288
https://doc.rust-lang.org/reference/destructors.html
> Assignment also runs the destructor of its left-hand operand, if it's initialized.
だそうです
https://doc.rust-lang.org/reference/destructors.html
> Assignment also runs the destructor of its left-hand operand, if it's initialized.
だそうです
290デフォルトの名無しさん
2020/11/06(金) 08:36:34.29ID:HarnCsHz 考えてみりゃ確かにunstableのcrateってめっちゃいい案だな
use unstable::prelude::*;
で全部取り込める上にバージョンあげたらunstableから無くなってstdの方が挿し代わって使われるし
use unstable::prelude::*;
で全部取り込める上にバージョンあげたらunstableから無くなってstdの方が挿し代わって使われるし
291デフォルトの名無しさん
2020/11/06(金) 08:47:23.44ID:mKCogF8p 明らかに可読性悪い言語なのだがあと5年くらいしたらこの界隈も気づくかもね
292デフォルトの名無しさん
2020/11/06(金) 08:54:20.60ID:wXTP989a 5年先いくパイセン降臨
293デフォルトの名無しさん
2020/11/06(金) 09:52:32.90ID:S3a0GE/K >>289
なるほど!分かりましたありがとう
なるほど!分かりましたありがとう
294デフォルトの名無しさん
2020/11/06(金) 11:09:54.01ID:ifaT2orV 可読性が悪い「言語」ってそうそうあるもんかね
295デフォルトの名無しさん
2020/11/06(金) 11:22:47.79ID:JyOrEzG9 それ、「俺様には理解できない」にderefされてます
296デフォルトの名無しさん
2020/11/06(金) 20:08:48.42ID:g6FZ2Lxp >>291
esolangはさておきAPLとかは難読言語といっても良いかも
あとは暗黙の○○が多い言語や記号が多い言語は初心者にとっては難読だと思うけど
Rustはこれらには当てはまらないと思うけど、どういう点で難読と思ったのか教えて欲しい
esolangはさておきAPLとかは難読言語といっても良いかも
あとは暗黙の○○が多い言語や記号が多い言語は初心者にとっては難読だと思うけど
Rustはこれらには当てはまらないと思うけど、どういう点で難読と思ったのか教えて欲しい
297デフォルトの名無しさん
2020/11/11(水) 20:37:16.07ID:ZuM/CkEs >>291
お前は5年後もC++使ってろよ
お前は5年後もC++使ってろよ
298デフォルトの名無しさん
2020/11/12(木) 10:54:00.16ID:uK53dAw4 fn foo(bar: impl Buzz)
というシグネチャは、
fn foo<T: Buzz>(bar: T)
の構文糖なんですよね?
では、
fn foo() -> impl Buzz
を、
fn foo<T: Buzz>() -> T
と書けないのはなぜなんでしょう?
というシグネチャは、
fn foo<T: Buzz>(bar: T)
の構文糖なんですよね?
では、
fn foo() -> impl Buzz
を、
fn foo<T: Buzz>() -> T
と書けないのはなぜなんでしょう?
299デフォルトの名無しさん
2020/11/12(木) 11:47:01.17ID:tcFc7SO9300デフォルトの名無しさん
2020/11/12(木) 12:00:24.36ID:tcFc7SO9301デフォルトの名無しさん
2020/11/12(木) 13:24:24.86ID:uK53dAw4 >>299
Rust bookにはsyntax sugarと書かれていたのですが…
https://doc.rust-lang.org/book/ch10-02-traits.html#trait-bound-syntax
> The impl Trait syntax works for straightforward cases but is actually syntax sugar for a longer form, which is called a trait bound; it looks like this:
>>300
ありがとうございます。
Rust bookはあんまり信用できないのかな…
Rust bookにはsyntax sugarと書かれていたのですが…
https://doc.rust-lang.org/book/ch10-02-traits.html#trait-bound-syntax
> The impl Trait syntax works for straightforward cases but is actually syntax sugar for a longer form, which is called a trait bound; it looks like this:
>>300
ありがとうございます。
Rust bookはあんまり信用できないのかな…
302デフォルトの名無しさん
2020/11/12(木) 16:23:24.97ID:tcFc7SO9303デフォルトの名無しさん
2020/11/12(木) 18:49:52.91ID:C+/hhwIt 記号が多い言語は英語の苦手な日本人には有利だ
英文に近づけようとする言語は不利だ
英文に近づけようとする言語は不利だ
304デフォルトの名無しさん
2020/11/13(金) 19:01:00.42ID:nD6TGu67 そんなあなたにPerlがあるよ
305デフォルトの名無しさん
2020/11/13(金) 23:39:03.73ID:RhbFV+AU APLもおるでよ
306デフォルトの名無しさん
2020/11/14(土) 06:16:49.16ID:6dxHy4Fn python最強じゃん
307デフォルトの名無しさん
2020/11/14(土) 09:55:40.26ID:B7e1nuZg LISPかな。まあ記号と言っても括弧ばっかりだが。
308デフォルトの名無しさん
2020/11/14(土) 10:07:50.72ID:DnZAmAgg 「Lots of Isolated Silly Parentheses」の略だからな。
309デフォルトの名無しさん
2020/11/14(土) 10:52:27.43ID:wQlu6eHI310デフォルトの名無しさん
2020/11/14(土) 12:17:47.68ID:dRjRf4O1311デフォルトの名無しさん
2020/11/14(土) 13:14:02.66ID:DnZAmAgg The name "turbofish" was made up by reddit user deadstone in 2015, and has since caught on in the Rust community, being used even in the official documentation.
「turbofish」という名前は、2015年にredditユーザーのdeadstone氏によって作成され、それ以来Rustコミュニティで定着し、公式ドキュメントでも使用されています。
「turbofish」という名前は、2015年にredditユーザーのdeadstone氏によって作成され、それ以来Rustコミュニティで定着し、公式ドキュメントでも使用されています。
312デフォルトの名無しさん
2020/11/15(日) 04:06:11.96ID:H90rIdiK function<>()の方が良かったけどね。パーサーの複雑性があって解決されてなく、もうここまで広まったしいいやってなってるけど
313デフォルトの名無しさん
2020/11/15(日) 23:56:20.08ID:HUIHtxgp >>301,302
型制約と存在型じゃ概念が違うから構文糖は語弊がある。
生成するコードはどちらもモノモーフィックな関数吐くけど存在型は第一引数の違いだけでコンパイル時に
ディスパッチ先が一意に決まらないケースが有るからマルチメソッドを直接サポートしない弊害があるかな。
型制約と存在型じゃ概念が違うから構文糖は語弊がある。
生成するコードはどちらもモノモーフィックな関数吐くけど存在型は第一引数の違いだけでコンパイル時に
ディスパッチ先が一意に決まらないケースが有るからマルチメソッドを直接サポートしない弊害があるかな。
314デフォルトの名無しさん
2020/11/20(金) 21:14:37.50ID:YhokOqrJ Rust 1.48リリース
315デフォルトの名無しさん
2020/11/20(金) 21:23:36.45ID:g8U1YOSi Internet Archive、Flashコンテンツをアーカイブ プラグインなしで21年以降も閲覧可能に
https://www.itmedia.co.jp/news/articles/2011/20/news143.html
プログラミング言語Rustで作られたFlashのエミュレータ「Ruffle」を使うことで、Flashプラグインをインストールしなくても、WebAssembyが動作するWebブラウザさえあれば動作するとしている。
https://www.itmedia.co.jp/news/articles/2011/20/news143.html
プログラミング言語Rustで作られたFlashのエミュレータ「Ruffle」を使うことで、Flashプラグインをインストールしなくても、WebAssembyが動作するWebブラウザさえあれば動作するとしている。
316デフォルトの名無しさん
2020/11/20(金) 23:10:09.72ID:znicv9zG すげえなww
でも先人の苦労の作品が残ってよかった
でも先人の苦労の作品が残ってよかった
317デフォルトの名無しさん
2020/11/22(日) 16:39:30.67ID:ujQ9d+0r Rust bookのDropトレイト解説のページ ( https://doc.rust-jp.rs/book-ja/ch15-03-drop.html ) で質問です。
以下のようなコードなのですが、
struct CustomSmartPointer {
data: String,
}
impl Drop for CustomSmartPointer {
fn drop(&mut self) {
println!("Dropping CustomSmartPointer with data `{}`!", self.data);
}
}
fn main() {
let c = CustomSmartPointer { data: String::from("my stuff") };
println!("CustomSmartPointers created.");
}
これ、dropの実装部分にprintln!しか書かれてませんが&self.dataの処理は書かなくてよいのでしょうか?
例えば、println!の下に、
drop(&self.data);
のように。
どちらかがコンパイルエラーになるならいいのですが、書いても書かなくてもどちらでも問題なくコンパイルが通ってしまい、困惑しています。
以下のようなコードなのですが、
struct CustomSmartPointer {
data: String,
}
impl Drop for CustomSmartPointer {
fn drop(&mut self) {
println!("Dropping CustomSmartPointer with data `{}`!", self.data);
}
}
fn main() {
let c = CustomSmartPointer { data: String::from("my stuff") };
println!("CustomSmartPointers created.");
}
これ、dropの実装部分にprintln!しか書かれてませんが&self.dataの処理は書かなくてよいのでしょうか?
例えば、println!の下に、
drop(&self.data);
のように。
どちらかがコンパイルエラーになるならいいのですが、書いても書かなくてもどちらでも問題なくコンパイルが通ってしまい、困惑しています。
318デフォルトの名無しさん
2020/11/22(日) 16:58:52.26ID:JIsF8Dpm >>317
もう少し細かい話はこの辺に書いてあるよ。
https://doc.rust-lang.org/std/ops/trait.Drop.html
簡単に言えばそのdataは勝手に解放されるからdropは不要。
解放以外で何か処理したいなら書けばいい。
drop(&self.data)としたとしても、それは参照を作ってその参照を即座に破棄してるだけなので特に意味はない。
本当にdataを解放したいならdrop(self.data)になるけどこれはコンパイルエラーになるはず。
もう少し細かい話はこの辺に書いてあるよ。
https://doc.rust-lang.org/std/ops/trait.Drop.html
簡単に言えばそのdataは勝手に解放されるからdropは不要。
解放以外で何か処理したいなら書けばいい。
drop(&self.data)としたとしても、それは参照を作ってその参照を即座に破棄してるだけなので特に意味はない。
本当にdataを解放したいならdrop(self.data)になるけどこれはコンパイルエラーになるはず。
319デフォルトの名無しさん
2020/11/22(日) 17:05:23.09ID:JIsF8Dpm あ、最後の行のは多分deref抜けてるな。
いずれにしてもdropするなら所有権を取る必要があるけど、
&mut selfからdataの所有権を取る方法はないので
正しくdropするコードを書けばエラーになるはず。
いずれにしてもdropするなら所有権を取る必要があるけど、
&mut selfからdataの所有権を取る方法はないので
正しくdropするコードを書けばエラーになるはず。
320デフォルトの名無しさん
2020/11/22(日) 17:16:38.55ID:ujQ9d+0r >>318-319
おお、
drop(self.data);
でも
drop((*self).data);
でも同じ、
cannot move out of `self.data` which is behind a mutable reference
エラーでました!
スッキリしましたありがとうございます。
std::mem::dropの実装って
pub fn drop<T>(_x: T) { }
だったんですねぇ…
おお、
drop(self.data);
でも
drop((*self).data);
でも同じ、
cannot move out of `self.data` which is behind a mutable reference
エラーでました!
スッキリしましたありがとうございます。
std::mem::dropの実装って
pub fn drop<T>(_x: T) { }
だったんですねぇ…
321デフォルトの名無しさん
2020/11/24(火) 00:31:06.85ID:EBaS3Lgi Rust bookのRefCell解説のページ ( https://doc.rust-jp.rs/book-ja/ch15-05-interior-mutability.html ) で質問です。
以下のようなコードなのですが、
pub trait Messenger {
fn send(&self, msg: &str);
}
pub struct LimitTracker<'a, T: 'a + Messenger> {
messenger: &'a T,
value: usize,
max: usize,
}
impl<'a, T> LimitTracker<'a, T>
where T: Messenger {
pub fn new(messenger: &T, max: usize) -> LimitTracker<T> {
LimitTracker {
messenger,
value: 0,
max,
}
}
// 以下略
pub struct LimitTracker<'a, T: 'a + Messenger> {
の行でトレイト境界に
'a + Messenger
を指定しているようなのですが、
このような書き方今までに出てこなかったので試しに
pub struct LimitTracker<'a, T: Messenger> {
と書き替えてみたところ、警告もなしにコンパイルできてしまいました…
これ、何の意味があるんでしょう?
以下のようなコードなのですが、
pub trait Messenger {
fn send(&self, msg: &str);
}
pub struct LimitTracker<'a, T: 'a + Messenger> {
messenger: &'a T,
value: usize,
max: usize,
}
impl<'a, T> LimitTracker<'a, T>
where T: Messenger {
pub fn new(messenger: &T, max: usize) -> LimitTracker<T> {
LimitTracker {
messenger,
value: 0,
max,
}
}
// 以下略
pub struct LimitTracker<'a, T: 'a + Messenger> {
の行でトレイト境界に
'a + Messenger
を指定しているようなのですが、
このような書き方今までに出てこなかったので試しに
pub struct LimitTracker<'a, T: Messenger> {
と書き替えてみたところ、警告もなしにコンパイルできてしまいました…
これ、何の意味があるんでしょう?
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- テレビ朝日 本社から男性が転落し死亡。関連会社社員か 当たった通行人が左肩軽傷 [阿弥陀ヶ峰★]
- テレビ朝日本社から20~30代の関連会社社員とみられる男性が転落し死亡 六本木けやき坂通りの通行人にはけが人なし [少考さん★]
- 高市早苗首相が天理教系企業に“巨額発注” 総額5000万円 本人は「政治団体の活動に必要な支出」と回答 ★2 [Hitzeschleier★]
- 小島瑠璃子さん、代表取締役を務める会社を破産申請 [牛丼★]
- 「残クレ」でマイホーム、国が銀行向け保険 新型住宅ローン普及促す -日経 ★3 [少考さん★]
- 【サッカー】日本代表、FIFAランキング“4位”の強豪イングランドとの対戦が正式決定! 来年3月に聖地ウェンブリーで激突へ [久太郎★]
- (´・ω・`)クリスマスが今年もやってくる~
- 【悲報】ジャップ、日中戦争に賛成が5割弱...軍歌の音が聞こえる... [856698234]
- 千晴さん千晴さん
- 晃←コレの読み方wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
- 俺も猫か犬と布団で寝たい
- 【乞食速報】プロクオリティ ビーフカレー 96食 4262円 [268244553]
