公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust
Web上の実行環境
https://play.rust-lang.org
日本語の情報
https://rust-jp.rs/
※Rustを学びたい人はまず最初に公式のThe Bookを読むこと
https://doc.rust-lang.org/book/
※Rustのasyncについて知りたければ「async-book」は必読
https://rust-lang.github.io/async-book/
※C++との比較は専用スレへ
C++ vs Rust
https://mevius.5ch.net/test/read.cgi/tech/1619219089/
前スレ
Rust part11
https://mevius.5ch.net/test/read.cgi/tech/1623857052/
探検
Rust part12
レス数が1000を超えています。これ以上書き込みはできません。
2021/08/24(火) 22:55:27.78ID:972JwtmU
2021/08/24(火) 22:59:11.03ID:972JwtmU
次スレは>>980が立ててくださいな
2021/08/24(火) 23:25:20.99ID:ELplZZUg
980ですゴメンナサイお詫びに
Rust The Book (日本語版)
https://doc.rust-jp.rs/book-ja/
Rust edition guide (日本語版)
https://doc.rust-jp.rs/edition-guide/
Rust by example (日本語版)
https://doc.rust-jp.rs/rust-by-example-ja/
Rust cookbook (日本語版)
https://uma0317.github.io/rust-cookbook-ja/
Rust API guideline (日本語版)
https://sinkuu.github.io/api-guidelines/
Rust nomicon book (日本語版)
https://doc.rust-jp.rs/rust-nomicon-ja/
Rust WASM book (日本語版)
https://moshg.github.io/rustwasm-book-ja/
Rust embeded book (日本語版)
https://tomoyuki-nakabayashi.github.io/book/
Rust enbeded discovery (日本語版)
https://tomoyuki-nakabayashi.github.io/discovery/
Rust The Book (日本語版)
https://doc.rust-jp.rs/book-ja/
Rust edition guide (日本語版)
https://doc.rust-jp.rs/edition-guide/
Rust by example (日本語版)
https://doc.rust-jp.rs/rust-by-example-ja/
Rust cookbook (日本語版)
https://uma0317.github.io/rust-cookbook-ja/
Rust API guideline (日本語版)
https://sinkuu.github.io/api-guidelines/
Rust nomicon book (日本語版)
https://doc.rust-jp.rs/rust-nomicon-ja/
Rust WASM book (日本語版)
https://moshg.github.io/rustwasm-book-ja/
Rust embeded book (日本語版)
https://tomoyuki-nakabayashi.github.io/book/
Rust enbeded discovery (日本語版)
https://tomoyuki-nakabayashi.github.io/discovery/
2021/08/24(火) 23:38:41.54ID:dmSXpC2X
Rust CLI (Command Line Interface) apps Book
https://rust-cli.github.io/book/
Rust async-std Book
https://book.async.rs/
Rust The Unstable Book
https://doc.rust-lang.org/nightly/unstable-book/
Rust rustc Book
https://doc.rust-lang.org/rustc/
Rust Cargo Book
https://doc.rust-lang.org/cargo/
https://rust-cli.github.io/book/
Rust async-std Book
https://book.async.rs/
Rust The Unstable Book
https://doc.rust-lang.org/nightly/unstable-book/
Rust rustc Book
https://doc.rust-lang.org/rustc/
Rust Cargo Book
https://doc.rust-lang.org/cargo/
5デフォルトの名無しさん
2021/08/25(水) 02:49:11.51ID:NhkykFBw >>1
乙です。
乙です。
2021/08/25(水) 03:59:04.43ID:4va1W6vx
The Rust Reference
https://doc.rust-lang.org/reference/
The Rust Standard Library
https://doc.rust-lang.org/std/
https://doc.rust-lang.org/reference/
The Rust Standard Library
https://doc.rust-lang.org/std/
2021/08/25(水) 08:19:23.75ID:o6V8MH2P
前スレで循環参照なんて初心者でもすぐ作れてしまうとの意見もあったけど
Rc型を使うだけの初心者には原理的に不可能
内部可変性を与えるRefCell型も併用しないと循環参照は作れない
一つの可変参照&mutか複数の不可変参照&のどちらかのみ許されるコンパイル時確認ルールを実行時確認ルールで行なうのがRefCell型
それにより明示的に可変参照を得ることで内部可変性を持てるようにしたもの
そしてRcと組み合わせてRc<RefCell<T>>を使うことで既にあるリンクを書き換え出来るようになりようやく循環参照を作れる
もちろん自分でunsafeすればやりたい放題てすがunsafeせずともメモリ安全性ルールの元に使えます
ここまで出来る人なら強参照Rcだけでなく弱参照Weakも併用できますから循環参照を避けることも出来るでしょう
Rc型を使うだけの初心者には原理的に不可能
内部可変性を与えるRefCell型も併用しないと循環参照は作れない
一つの可変参照&mutか複数の不可変参照&のどちらかのみ許されるコンパイル時確認ルールを実行時確認ルールで行なうのがRefCell型
それにより明示的に可変参照を得ることで内部可変性を持てるようにしたもの
そしてRcと組み合わせてRc<RefCell<T>>を使うことで既にあるリンクを書き換え出来るようになりようやく循環参照を作れる
もちろん自分でunsafeすればやりたい放題てすがunsafeせずともメモリ安全性ルールの元に使えます
ここまで出来る人なら強参照Rcだけでなく弱参照Weakも併用できますから循環参照を避けることも出来るでしょう
2021/08/25(水) 08:36:39.57ID:cBrhi5Vz
マーフィーの法則
失敗する余地があるなら、失敗する
失敗する余地があるなら、失敗する
2021/08/25(水) 09:53:46.73ID:wz3i5qam
テンプレートがやたらたくさん入り乱れる言語は嫌いだわ
可読性めちゃくちゃ悪いよな
可読性めちゃくちゃ悪いよな
2021/08/25(水) 10:40:52.46ID:FDhW8k6p
>>7
そこまでできてやっとRust初心者という見方もあるかもしれない
そこまでできてやっとRust初心者という見方もあるかもしれない
2021/08/25(水) 11:24:43.65ID:cB4G1Ahy
直接関係ないけど、RefCellは借用チェックが実行時段階でのチェックになって
しまうんだってな。
しまうんだってな。
2021/08/25(水) 11:34:25.36ID:N5SObJek
2021/08/25(水) 11:41:16.58ID:cB4G1Ahy
RefCellの借用チェックが実行段階にまで持ち越されるのは、循環参照とは全く別の話。
それはつまり、「ゼロコスト」ではないということ。
それはつまり、「ゼロコスト」ではないということ。
2021/08/25(水) 12:14:34.01ID:CoZuOKep
2021/08/25(水) 12:30:44.27ID:XsBK0uKE
>>14
どっちもあるけど通常はRc<RefCell<T>>だよ
どっちもあるけど通常はRc<RefCell<T>>だよ
16デフォルトの名無しさん
2021/08/25(水) 13:42:20.13ID:6n+Di1sM >>983
なるほどサンクス
リージョン理論に線形論理を上手く組み合わせて、cycloneとかの欠点を克服したrustってすげーなあ
とはいってもそもそも二重開放してエラーになるというのがピンとこない
free(a);
free(a);
は二重解放しているように見えて合法だろ?
一度目のfreeでaにNULLが代入されて、二度目のfreeでは引数がNULLの場合はそのままreturnって処理されるんだから、理論上は何度free使ってもエラーにならないじゃないか
なるほどサンクス
リージョン理論に線形論理を上手く組み合わせて、cycloneとかの欠点を克服したrustってすげーなあ
とはいってもそもそも二重開放してエラーになるというのがピンとこない
free(a);
free(a);
は二重解放しているように見えて合法だろ?
一度目のfreeでaにNULLが代入されて、二度目のfreeでは引数がNULLの場合はそのままreturnって処理されるんだから、理論上は何度free使ってもエラーにならないじゃないか
17デフォルトの名無しさん
2021/08/25(水) 13:42:36.69ID:6n+Di1sM これに答えろ
18デフォルトの名無しさん
2021/08/25(水) 14:22:27.47ID:aLlQE3on >>16
なぜRustのスレに書いているのか不明だけど
当然NULLにならなかったよ
キャスト警告無視で
#include <stdlib.h>
main() {
char *ptr = malloc(1024);
printf("ptr(1): %x\n", ptr);
free(ptr);
printf("ptr(2): %x\n", ptr);
free(ptr);
printf("ptr(3): %x\n", ptr);
}
実行結果
ptr(1): ea8f72a0
ptr(2): ea8f72a0
free(): double free detected
core dump
なぜRustのスレに書いているのか不明だけど
当然NULLにならなかったよ
キャスト警告無視で
#include <stdlib.h>
main() {
char *ptr = malloc(1024);
printf("ptr(1): %x\n", ptr);
free(ptr);
printf("ptr(2): %x\n", ptr);
free(ptr);
printf("ptr(3): %x\n", ptr);
}
実行結果
ptr(1): ea8f72a0
ptr(2): ea8f72a0
free(): double free detected
core dump
2021/08/25(水) 14:49:12.37ID:FDhW8k6p
20デフォルトの名無しさん
2021/08/25(水) 14:50:41.52ID:6n+Di1sM21デフォルトの名無しさん
2021/08/26(木) 04:09:52.45ID:wR4WgiQO そういやNull代入派とかいうのもいたな
22デフォルトの名無しさん
2021/08/26(木) 07:18:01.38ID:BSY6c8/C uaf防ぐのってぶっちゃけ簡単ですよね?freeしたあとにNULL代入するのを鉄則化するだけですよね?
2021/08/26(木) 07:18:53.92ID:tGDEA4MX
ポインタコピーすることないの?
加減算することないの?
加減算することないの?
2021/08/26(木) 07:42:26.49ID:YoD5H0JF
int* p1 = malloc(sizeof(int));
int* p2 = p1;
free(p1);
p1 = NULL;
free(p2);
極端に書くとこうかなあ?
int* p2 = p1;
free(p1);
p1 = NULL;
free(p2);
極端に書くとこうかなあ?
2021/08/26(木) 08:58:05.69ID:yCq+tuyV
>>22
1つのオブジェクトを複数のポインタで挿している場合にそういうわけにはいかない。
1つのオブジェクトを複数のポインタで挿している場合にそういうわけにはいかない。
2021/08/26(木) 09:21:56.64ID:yCq+tuyV
>>25
誤字訂正: 挿して ---> 指して
誤字訂正: 挿して ---> 指して
27デフォルトの名無しさん
2021/08/26(木) 14:46:24.90ID:BSY6c8/C28デフォルトの名無しさん
2021/08/26(木) 14:52:56.47ID:BSY6c8/C29デフォルトの名無しさん
2021/08/26(木) 14:53:33.93ID:BSY6c8/C >>24
p2=NULL;すればいいだけの話ですよね?
p2=NULL;すればいいだけの話ですよね?
2021/08/26(木) 14:54:04.18ID:ILFADcfC
Cスレでやれよ
2021/08/26(木) 14:55:34.47ID:s9ncfwmd
>>27
効率が落ちる。
効率が落ちる。
2021/08/26(木) 15:01:32.05ID:jqKFKJA4
2021/08/26(木) 15:04:39.60ID:s9ncfwmd
手で書くと効率は落ちないが、実行段階で自動的に NULL を入れようとすると
効率が落ちるという意味ね。時間とメモリーの両方で。
NULLが入っているか判定して error にするなどの処理も必要となったりする。
効率が落ちるという意味ね。時間とメモリーの両方で。
NULLが入っているか判定して error にするなどの処理も必要となったりする。
2021/08/26(木) 15:06:19.25ID:VJ7dcvV2
>>27
難しいです…
難しいです…
35デフォルトの名無しさん
2021/08/26(木) 15:11:05.26ID:BSY6c8/C2021/08/26(木) 15:18:41.61ID:s9ncfwmd
>>36
凄く落ちるわけではないが。
凄く落ちるわけではないが。
2021/08/26(木) 15:21:09.64ID:s9ncfwmd
>>36
参照カウンタ方式は、自動的に関連するポインタを巡ってNULLを入れるよりは
効率が良いのでプログラマーの裁量で選択できるようになっている。
しかし、それでも僅かに効率が落ちるのでなるべく使わないでプログラムする
方が良いと思うプログラマーが多いということだよ。
参照カウンタ方式は、自動的に関連するポインタを巡ってNULLを入れるよりは
効率が良いのでプログラマーの裁量で選択できるようになっている。
しかし、それでも僅かに効率が落ちるのでなるべく使わないでプログラムする
方が良いと思うプログラマーが多いということだよ。
2021/08/26(木) 15:24:37.81ID:bKmDdfbf
プログラマーならば、まず思考実験、それで解決しなければコーディング
その上で問題点を尋ねる
それをしない人はプログラマーではないから、このスレの邪魔
その上で問題点を尋ねる
それをしない人はプログラマーではないから、このスレの邪魔
40デフォルトの名無しさん
2021/08/26(木) 15:24:45.61ID:BSY6c8/C41デフォルトの名無しさん
2021/08/26(木) 15:25:39.02ID:BSY6c8/C >>39
こわい。。
こわい。。
2021/08/26(木) 15:25:45.57ID:s9ncfwmd
手作業で書く場合は、1つのオブジェクトを削除する場合、それを参照する
全てのポインタに NULL を入れるのは効率が良い。だから、多くのC/C++
プログラマはかつてそうしてきたし、今でもそうすることも多い。
ところが自動でそれをやるには静的解析は難しいので実行段階でも
余計なメモリーを追加で消費して行うことになる。それが効率が悪い。
そして、NULLが入っているかどうか分からないのでその参照を
使う場合には、いつも最初にNULLが入ってないことを確認してから
作業をする必要があり、その判定に 2 クロックくらいかかる。
この2クロックが忌避される。
全てのポインタに NULL を入れるのは効率が良い。だから、多くのC/C++
プログラマはかつてそうしてきたし、今でもそうすることも多い。
ところが自動でそれをやるには静的解析は難しいので実行段階でも
余計なメモリーを追加で消費して行うことになる。それが効率が悪い。
そして、NULLが入っているかどうか分からないのでその参照を
使う場合には、いつも最初にNULLが入ってないことを確認してから
作業をする必要があり、その判定に 2 クロックくらいかかる。
この2クロックが忌避される。
43デフォルトの名無しさん
2021/08/26(木) 15:26:04.39ID:pXAeL9Oq >>7
言ってる事はかねがね同意ですが、プログラムが共同作業の為にRefCell<Rc<List>>とA氏が定義してあるものに
違う人B氏が何も考えずにRc::clone(&a)で循環を入れてしまう事は十分あり得るでしょう。
状況次第ですが循環参照を考慮してないA氏が悪いのか、Rc::clone(&a)でぶち込んだ人が悪いのかは要件次第ですが
これを簡単と言わずに(あなたは言っていませんが)難しいと表現するのは違和感がありますよ
言ってる事はかねがね同意ですが、プログラムが共同作業の為にRefCell<Rc<List>>とA氏が定義してあるものに
違う人B氏が何も考えずにRc::clone(&a)で循環を入れてしまう事は十分あり得るでしょう。
状況次第ですが循環参照を考慮してないA氏が悪いのか、Rc::clone(&a)でぶち込んだ人が悪いのかは要件次第ですが
これを簡単と言わずに(あなたは言っていませんが)難しいと表現するのは違和感がありますよ
44デフォルトの名無しさん
2021/08/26(木) 15:28:09.24ID:BSY6c8/C2021/08/26(木) 15:28:30.66ID:uyKM6LSq
46デフォルトの名無しさん
2021/08/26(木) 15:29:12.92ID:BSY6c8/C >>45
自力で数えればいいんではないでしょうか?
自力で数えればいいんではないでしょうか?
2021/08/26(木) 15:30:36.47ID:s9ncfwmd
>>40
まあ、そういうこと。
というのは、参照カウンタも、1つのヒープノードに対して必ず1つ必要になるので、
ノード数が多いときには膨大なメモリーの無駄になるから。
それとノード数が多いときに参照カウンタを 0 クリアしたり、1足したり
する作業も馬鹿にならないと考えるプログラマが多い。
なぜかというと、そういう自動化を行わなくても、人が頭で考えて手作業で
NULLを入れても十分に安全にプログラムできるプログラマが多かったからだよ、
少なくとも昔のCプログラマには。
手作業でやってもとくに危険を感じないので、効率を落としてまで自動化する
必要が無いと思われている。
手作業でNULLを入れるのは難しくない。
ところが、コンパイラが自動で効率を落とさずにそれをやるのはめちゃくちゃ難しい。
それは人間の脳がそれだけ優秀だということだよ。
まあ、そういうこと。
というのは、参照カウンタも、1つのヒープノードに対して必ず1つ必要になるので、
ノード数が多いときには膨大なメモリーの無駄になるから。
それとノード数が多いときに参照カウンタを 0 クリアしたり、1足したり
する作業も馬鹿にならないと考えるプログラマが多い。
なぜかというと、そういう自動化を行わなくても、人が頭で考えて手作業で
NULLを入れても十分に安全にプログラムできるプログラマが多かったからだよ、
少なくとも昔のCプログラマには。
手作業でやってもとくに危険を感じないので、効率を落としてまで自動化する
必要が無いと思われている。
手作業でNULLを入れるのは難しくない。
ところが、コンパイラが自動で効率を落とさずにそれをやるのはめちゃくちゃ難しい。
それは人間の脳がそれだけ優秀だということだよ。
2021/08/26(木) 15:31:47.17ID:s9ncfwmd
2021/08/26(木) 15:32:40.17ID:GoG5gW1P
コピーしたポインタを別スレッドに転送とかしてたら、いつNULL代入すべきかすら分からんしなぁ
2021/08/26(木) 15:32:44.57ID:s9ncfwmd
2021/08/26(木) 15:42:17.45ID:Nkfv2brF
52デフォルトの名無しさん
2021/08/26(木) 15:43:01.48ID:BSY6c8/C >>51
僕がです。
僕がです。
2021/08/26(木) 15:46:08.68ID:s9ncfwmd
2021/08/26(木) 15:47:35.53ID:s9ncfwmd
言っておくが現実世界では俺は天才だと言われているから、俺が簡単だと
思うことは、大部分のプログラマには難しいと思うかもしれないがな。
思うことは、大部分のプログラマには難しいと思うかもしれないがな。
2021/08/26(木) 15:48:12.84ID:fifffju2
>>52
データ構造は入出力の変化に伴いどんどん変化していく可能性がありますから人間は覚え追いきれないよね
さらに一つのmalloc毎にそれぞれそこをポイントしている利用者の数も利用者数も異なりますよね
それらのデータをどこでどうやって管理するつもりですか?
データ構造は入出力の変化に伴いどんどん変化していく可能性がありますから人間は覚え追いきれないよね
さらに一つのmalloc毎にそれぞれそこをポイントしている利用者の数も利用者数も異なりますよね
それらのデータをどこでどうやって管理するつもりですか?
56デフォルトの名無しさん
2021/08/26(木) 15:54:12.28ID:BSY6c8/C まず前提が誤りです
変化を追えば覚えられます
思考実験できないんですか?
変化を追えば覚えられます
思考実験できないんですか?
2021/08/26(木) 16:04:38.88ID:xjpSGKrK
>>56
利用者リストを覚えておくためにメモリが必要やね
それもmallocするか
mallocで取ってきたメモリ管理のために更にmallocが必要となってしまったぞ
利用者が増えてきたら利用者リストの領域が足りなくなる
またmallocするか
全てにNULLを入れるためだけに大がかりになってきたな
この方法は本当に大丈夫なのか?
利用者リストを覚えておくためにメモリが必要やね
それもmallocするか
mallocで取ってきたメモリ管理のために更にmallocが必要となってしまったぞ
利用者が増えてきたら利用者リストの領域が足りなくなる
またmallocするか
全てにNULLを入れるためだけに大がかりになってきたな
この方法は本当に大丈夫なのか?
58デフォルトの名無しさん
2021/08/26(木) 16:08:02.62ID:BSY6c8/C >>57
静的に確認すればすむ話です
静的に確認すればすむ話です
2021/08/26(木) 16:17:15.72ID:5iULk00o
データが育っていったら100か所からリンクされるとか普通によくあるわけだが
その100か所にNULLを代入しにいくために100か所の場所をリストで持つのか
しかもmallocした各データ毎にリストを持つのか
全てにNULL代入はあきらめた方がいいんじゃね?
その100か所にNULLを代入しにいくために100か所の場所をリストで持つのか
しかもmallocした各データ毎にリストを持つのか
全てにNULL代入はあきらめた方がいいんじゃね?
2021/08/26(木) 16:20:01.23ID:4xBLfuks
アクセスするとたちまち例外発生するぬるぽにはどんなデータが格納されているのだろうか
2021/08/26(木) 16:23:55.37ID:YoD5H0JF
int* p1 = malloc(sizeof(int));
int* p2 = malloc(sizeof(int));
int* p3;
if (なんかの条件) p3 = p1; else p3 = p2;
free(p1);
p1 = NULL;
// p2はまだまだ使う
こういうときp3はどうするのかっていう
int* p2 = malloc(sizeof(int));
int* p3;
if (なんかの条件) p3 = p1; else p3 = p2;
free(p1);
p1 = NULL;
// p2はまだまだ使う
こういうときp3はどうするのかっていう
2021/08/26(木) 16:28:43.55ID:HI0uJlB9
すべてのヒープを**ptrで管理すればできなくもない気がする
参照するたびに有効かチェックしないといけないから激しく面倒だけど
参照するたびに有効かチェックしないといけないから激しく面倒だけど
63デフォルトの名無しさん
2021/08/26(木) 16:29:37.04ID:BSY6c8/C2021/08/26(木) 16:32:51.02ID:+fzqgCTs
2021/08/26(木) 16:33:25.33ID:W3uKoL9G
何の参考だよ
2021/08/26(木) 16:36:08.26ID:YoD5H0JF
https://twitter.com/cpp_akira/status/1430779310885859330
最近はC++の発表資料を公開すると「Rustでいいじゃん」というコメントがたくさんつくのか…。Rustへの言及とか一文字も書いてないのに。
普及活動だと思うけど、さすがに嫌がらせチックに見える。
↓の資料公開した時の話っぽいんだけど、Rustでいいじゃんって言われてるソースが見つからない・・・
https://speakerdeck.com/faithandbrave/opunhua-gajin-muc-plus-plus-falsexian-zhuang-tozhan-wang
言われててもおかしくないとは思うけど、実際のところどうなんすかねえ
アロケータ回りがまだ弱いから少なくともゲームは10年後もC++のが強そう
https://twitter.com/5chan_nel (5ch newer account)
最近はC++の発表資料を公開すると「Rustでいいじゃん」というコメントがたくさんつくのか…。Rustへの言及とか一文字も書いてないのに。
普及活動だと思うけど、さすがに嫌がらせチックに見える。
↓の資料公開した時の話っぽいんだけど、Rustでいいじゃんって言われてるソースが見つからない・・・
https://speakerdeck.com/faithandbrave/opunhua-gajin-muc-plus-plus-falsexian-zhuang-tozhan-wang
言われててもおかしくないとは思うけど、実際のところどうなんすかねえ
アロケータ回りがまだ弱いから少なくともゲームは10年後もC++のが強そう
https://twitter.com/5chan_nel (5ch newer account)
2021/08/26(木) 16:38:42.43ID:n3k5ztC+
2021/08/26(木) 16:39:16.76ID:6RYxqPIE
おまえらスレチがすぎるぞ
まとめてどっかいってくれ
まとめてどっかいってくれ
2021/08/26(木) 16:43:10.20ID:xwYftXVU
>>66
Rust はメモリ安全性を保証することが論文で示されているので
どうしてもC++でないと出来ないこと(=まだRustが対応してないこと)であることを示さないと
「Rustでいいじゃん」となってしまうのは仕方ないかも
Rust はメモリ安全性を保証することが論文で示されているので
どうしてもC++でないと出来ないこと(=まだRustが対応してないこと)であることを示さないと
「Rustでいいじゃん」となってしまうのは仕方ないかも
2021/08/26(木) 17:32:35.75ID:guyKB2RO
Rustは言語仕様が未確定なのが懸念事項かな
実用上は大して困らないからどうでもいいんだけど
期待してたRust Foundationは何故かディレクター探し始めてるしw
実用上は大して困らないからどうでもいいんだけど
期待してたRust Foundationは何故かディレクター探し始めてるしw
2021/08/26(木) 17:40:08.48ID:ek8X72OL
>>70
2018editionに2019のasync/awaitゼロコストサポートで言語としては完成でしょ?
2018editionに2019のasync/awaitゼロコストサポートで言語としては完成でしょ?
2021/08/26(木) 17:48:35.66ID:TtF6fD9w
73デフォルトの名無しさん
2021/08/26(木) 18:01:26.94ID:BSY6c8/C >>69
どの論文だよ
どの論文だよ
2021/08/26(木) 22:38:09.77ID:57cnJJ44
>>71
まだOpenなRFCいくつあると思ってるんだ
まだOpenなRFCいくつあると思ってるんだ
2021/08/26(木) 23:09:41.27ID:6XyucKpc
そんなこと言い出したら他の言語も未完成
永久にね
永久にね
2021/08/26(木) 23:45:46.81ID:3VQCq3O/
でもSchemeとか言語仕様も形式意味論も定まってるし
2021/08/26(木) 23:50:11.85ID:guyKB2RO
2021/08/26(木) 23:57:00.95ID:yl47Ujhv
確定できないというよりメンテする人がいないんじゃないかな
言語仕様に詳しいけどコード書くよりドキュメント書きたいっていう奇特な人が要求されるわけで
言語仕様に詳しいけどコード書くよりドキュメント書きたいっていう奇特な人が要求されるわけで
2021/08/27(金) 00:00:45.70ID:cm2Md9qJ
ferroceneみたいに具体的な目標があって企業が投資してるなら進むだろうけど
リファレンスの更新とかあまり需要もないじゃない?
リファレンスの更新とかあまり需要もないじゃない?
2021/08/27(金) 00:16:19.30ID:i+fGpSJz
完全な仕様書は間違いなく必要ではあるよな。
2021/08/27(金) 00:25:02.14ID:LvLZjQiD
完全な仕様書www
どんだけ素人なんw
どんだけ素人なんw
2021/08/27(金) 00:25:46.96ID:vEj4Ie0t
第三者が処理系を作れるレベルで言語仕様が固まれば普及が進むと思うんだけどね
Rust Foundationにはそういう方向性を期待してたけど想像以上に何もしなかった
Rust Foundationにはそういう方向性を期待してたけど想像以上に何もしなかった
2021/08/27(金) 00:39:02.98ID:cm2Md9qJ
Foundationはもともと裏方に徹する組織だと言ってたし
その通りに動いているのでは
最近だとgccrsのライセンス絡みの知財チェックとかやってたかと
その通りに動いているのでは
最近だとgccrsのライセンス絡みの知財チェックとかやってたかと
2021/08/27(金) 00:45:32.58ID:foV8RWB5
言語仕様が固まるってのは新機能の追加をやめるということ?
2021/08/27(金) 00:49:06.81ID:21t4GoG3
言語仕様とコンパイラのバージョンが一体化しているようではミッションクリティカルな領域で採用されない
2021/08/27(金) 01:13:55.67ID:vEj4Ie0t
2021/08/27(金) 01:28:41.09ID:i+fGpSJz
>>84
現状では「今そのように動いている処理系」と「処理系の (不十分な) ドキュメント」がある状態で、
それのどこからどこまでが言語仕様として満たすべき要件なのか保証されている動作なのかがわからない。
追加するも何も今の時点でどうなっているのかわからん。
どこかにはあったりもするんだろうけど、開発者向けの議論の中などに分散していて「仕様書」としてまとまってないんだ。
現状では「今そのように動いている処理系」と「処理系の (不十分な) ドキュメント」がある状態で、
それのどこからどこまでが言語仕様として満たすべき要件なのか保証されている動作なのかがわからない。
追加するも何も今の時点でどうなっているのかわからん。
どこかにはあったりもするんだろうけど、開発者向けの議論の中などに分散していて「仕様書」としてまとまってないんだ。
2021/08/27(金) 02:31:48.28ID:RPPiA5lc
安全性は型システムによるところが大きいから、仕様書が無いと使えないというのは無いと思うがね
2021/08/27(金) 02:39:18.77ID:8/O2Ek7n
コンパイラだってバグがない保証なんてないんだから
テストするしかないね
テストするしかないね
2021/08/27(金) 02:39:45.83ID:xRe29h0Q
ISO 26262のコンパイラ認証とか無理そう
2021/08/27(金) 07:59:32.64ID:ebhntqkF
LLVMの中間表現に依存してる時点で、言語仕様をまともに設定するのは無理。
だから他のコンパイラが作られることもない。
だから他のコンパイラが作られることもない。
2021/08/27(金) 08:07:16.05ID:PnoFi7iU
仕様書、仕様書言っている人はOSやライブラリのAPIとかシステムコールとかはどう考えているんだろうね
MSDNだって盲信できるほどの信頼性はないし、OSS系なんてソースコードが仕様書状態だろ
もっと言えば処理系だってオプティマイザの仕様などは文書化されていなく、実際に調査しないと判らない事も多いよな
MSDNだって盲信できるほどの信頼性はないし、OSS系なんてソースコードが仕様書状態だろ
もっと言えば処理系だってオプティマイザの仕様などは文書化されていなく、実際に調査しないと判らない事も多いよな
2021/08/27(金) 08:07:24.55ID:/EVH9JcP
こんな状態じゃc++の置き替えなんて夢のまた夢だな。
2021/08/27(金) 08:43:05.29ID:8HMvxqPN
完全な仕様書wがないのが問題だ思うなら使わなければいいだけ
クッソ無駄なやりとりでスレ消費すんな
クッソ無駄なやりとりでスレ消費すんな
2021/08/27(金) 08:54:32.00ID:ZVb7iGYH
少なくともC++はもっとずっと細かな仕様が書いてある。
例で説明する時でも、変な例で説明せずに数学の教科書の様な粒度の細かい例で
説明されているで、数学の教科書の様な雰囲気を持っている。
Rustの場合、ライフタイムの説明をとってみても、ちゃんとした数学的説明になってない。
例で説明する時でも、変な例で説明せずに数学の教科書の様な粒度の細かい例で
説明されているで、数学の教科書の様な雰囲気を持っている。
Rustの場合、ライフタイムの説明をとってみても、ちゃんとした数学的説明になってない。
2021/08/27(金) 08:57:07.99ID:ZVb7iGYH
時々プログラミングは文系でも出来るという人が居るが、そういう人には、
数学的な説明とは何かがぴんと来ないかもしれないので、良い仕様書も
書けないかもしれない。Rustのbookの著者ももしかしたらそうなのかも。
本人は頑張って書いているつもりでも数学的な論法になってない。
数学的な説明とは何かがぴんと来ないかもしれないので、良い仕様書も
書けないかもしれない。Rustのbookの著者ももしかしたらそうなのかも。
本人は頑張って書いているつもりでも数学的な論法になってない。
2021/08/27(金) 09:04:15.77ID:ZVb7iGYH
高校数学レベルで言えば、ベクトルの和の定義は図で例を使って説明されるが、
3つの矢印で、c = a + b が説明される。
これは最も粒度が細かい説明で、これ以上簡単に説明できない。
ところがRustのライフタイム注釈の説明は、説明に使われている例が不適切で
とても長いが本質が説明し切れてない。
本来は、「ライフタイム注釈とは何か」を数式や擬似命令などを使ってせいぜい2ページ以内で
説明できるはずだ。
ところが実際の説明は、変な例を使って長々と説明されている。
数学的な説明になっていないので応用が効かない。
数学的説明とはほとんどの場合「パターン」だ。パターンになっているから応用が効く。
パターンとして説明されてないと応用が効かない。
3つの矢印で、c = a + b が説明される。
これは最も粒度が細かい説明で、これ以上簡単に説明できない。
ところがRustのライフタイム注釈の説明は、説明に使われている例が不適切で
とても長いが本質が説明し切れてない。
本来は、「ライフタイム注釈とは何か」を数式や擬似命令などを使ってせいぜい2ページ以内で
説明できるはずだ。
ところが実際の説明は、変な例を使って長々と説明されている。
数学的な説明になっていないので応用が効かない。
数学的説明とはほとんどの場合「パターン」だ。パターンになっているから応用が効く。
パターンとして説明されてないと応用が効かない。
2021/08/27(金) 09:06:37.74ID:pCZxoLJn
コンパイラが一つしかない状況は現状メリットでしかない
C++のようなレガシー言語の轍を踏まない賢い選択
C++のようなレガシー言語の轍を踏まない賢い選択
2021/08/27(金) 09:11:46.45ID:ZVb7iGYH
数学的説明にしたいなら、
「仮定」を置く。
「入力」と「出力」を明確にする。
「最も粒度の小さい例を書き、パターン」にする。
集合論や論理学の「かつ」「または」「積集合」「和集合」「背反集合」「区間の積」
などの言葉を使って書く。
ところが、Rustのbookはこのようなことが全く出来てない。
「仮定」を置く。
「入力」と「出力」を明確にする。
「最も粒度の小さい例を書き、パターン」にする。
集合論や論理学の「かつ」「または」「積集合」「和集合」「背反集合」「区間の積」
などの言葉を使って書く。
ところが、Rustのbookはこのようなことが全く出来てない。
100デフォルトの名無しさん
2021/08/27(金) 09:15:12.91ID:ZVb7iGYH >>98
仕様書が数学的(パターン的、自動機械的)に書いてないので、厳密な
仕組みや仕様が分からず、他の人がコンパイラが作りにく。
だから、「Rustは実験してみないと分からない」。
ところが、CやC++やRuby,Java,C#,Pythonなどは実験しなくても分かる
ようになっている。それはなぜかというと、仕様が粒度が細かく説明されて
いるから、パターンになっており「パターンの一部への代入」や「当てはめ」
が出来るので頭の中だけで全てプログラミングできてしまうから。
仕様書が数学的(パターン的、自動機械的)に書いてないので、厳密な
仕組みや仕様が分からず、他の人がコンパイラが作りにく。
だから、「Rustは実験してみないと分からない」。
ところが、CやC++やRuby,Java,C#,Pythonなどは実験しなくても分かる
ようになっている。それはなぜかというと、仕様が粒度が細かく説明されて
いるから、パターンになっており「パターンの一部への代入」や「当てはめ」
が出来るので頭の中だけで全てプログラミングできてしまうから。
101デフォルトの名無しさん
2021/08/27(金) 09:17:17.15ID:X7Hfy4km 今日のNGIDがすぐ分かって助かった
感謝感謝
感謝感謝
102デフォルトの名無しさん
2021/08/27(金) 09:20:43.18ID:ZVb7iGYH ちょっと難解だが高速なスクリプト言語としては使えるとは思う。
でもC++の置き換えは難しいな。
なぜならC++で出来ていたことがRustには移植できないから。
でもC++の置き換えは難しいな。
なぜならC++で出来ていたことがRustには移植できないから。
103デフォルトの名無しさん
2021/08/27(金) 09:47:25.61ID:nKzWHFHq 算数がクラスで一番君がきてますね
104デフォルトの名無しさん
2021/08/27(金) 10:21:55.10ID:EkQRESx5 なんやいつぞやのパターンマッチングの規格についてゴネてた子か
105デフォルトの名無しさん
2021/08/27(金) 11:04:36.95ID:VpJ5g/uH ・Fortran/BASICからCへの移植は容易。単純なパターンが存在する。
アルゴリズムの変更は不要。
・C++からJavaやC#への移植は容易。単純なパターンが存在する。
アルゴリズムの変更は不要。
・C++からRustへの移植は困難。単純なパターンは存在せず。
アルゴリズムを根本的に変える必要がある場合がある。
アルゴリズムの変更は不要。
・C++からJavaやC#への移植は容易。単純なパターンが存在する。
アルゴリズムの変更は不要。
・C++からRustへの移植は困難。単純なパターンは存在せず。
アルゴリズムを根本的に変える必要がある場合がある。
106デフォルトの名無しさん
2021/08/27(金) 11:10:56.79ID:ANmCg7EV Rustアンチスレでやればいいのに
107デフォルトの名無しさん
2021/08/27(金) 16:15:37.78ID:Ogrd1P9P 嫌なら使うなでおわり
現状嫌でも使うしかないくらいまでのシェア獲得してないし
現状嫌でも使うしかないくらいまでのシェア獲得してないし
108デフォルトの名無しさん
2021/08/27(金) 16:28:39.42ID:i+fGpSJz 個人としては使いたいけど組織として導入するには仕様の確実さというのは必要なんだわ。
109デフォルトの名無しさん
2021/08/27(金) 16:36:16.05ID:+7PBhugx C++ドロップアウターがOOPを学び直すには良いんでないの
110デフォルトの名無しさん
2021/08/27(金) 16:44:56.69ID:2IayjhUe 大手IT企業たちの方針
プログラミング言語「Rust」のための「Rust Foundation」設立 -- AWS(Amazon)、Microsoft、Google、Mozilla、Huaweiが創設
https://japan.zdnet.com/article/35166267/
Facebookが「Rust Foundation」に参加
https://japan.zdnet.com/article/35170192/
プログラミング言語「Rust」のための「Rust Foundation」設立 -- AWS(Amazon)、Microsoft、Google、Mozilla、Huaweiが創設
https://japan.zdnet.com/article/35166267/
Facebookが「Rust Foundation」に参加
https://japan.zdnet.com/article/35170192/
111デフォルトの名無しさん
2021/08/27(金) 16:56:21.47ID:e9EjTnUc112デフォルトの名無しさん
2021/08/27(金) 17:09:08.75ID:dNdDj0y1 >>111
lifetime関連
lifetime関連
113デフォルトの名無しさん
2021/08/27(金) 17:14:05.77ID:CxV5dN8D114デフォルトの名無しさん
2021/08/27(金) 17:44:50.51ID:i+fGpSJz で、それはどこにあるっていうんだ。
これについての仕様はこっちに有ってあれについての仕様はあっちに有って
詳細はブログのここにあって……でもこれは議論のための暫定的なまとめで……
みたいなのじゃ組織の中で話を通せんのよ。
「Rust の仕様はこれです」「これを満たした処理系は (少なくとも今のところは) Rust と呼べます」
というのが仕様書であって、そういうのが欲しいわけよ。
これについての仕様はこっちに有ってあれについての仕様はあっちに有って
詳細はブログのここにあって……でもこれは議論のための暫定的なまとめで……
みたいなのじゃ組織の中で話を通せんのよ。
「Rust の仕様はこれです」「これを満たした処理系は (少なくとも今のところは) Rust と呼べます」
というのが仕様書であって、そういうのが欲しいわけよ。
115デフォルトの名無しさん
2021/08/27(金) 17:53:04.46ID:n5KpIChT その論法は流石に違和感が強い
GAFA級の組織(のどこか)では採択されるのにその組織では通らないというなら、その組織か説得者が外れ値なだけでは?
GAFA級の組織(のどこか)では採択されるのにその組織では通らないというなら、その組織か説得者が外れ値なだけでは?
116デフォルトの名無しさん
2021/08/27(金) 17:58:34.36ID:VUXc1RWG 老害さん 今日も公式読まずに 愚痴たれる
117デフォルトの名無しさん
2021/08/27(金) 18:02:52.05ID:i+fGpSJz >>115
そのレベルの大企業というのは策定側で関与しうるし
投機的な技術的投資にも貪欲だから
「大企業は動きが遅い」「稟議が厳密」という感覚ではない。
グーグルが大規模なサービスを開始からそれほど間を置かずに畳んだことなんて何度もあるだろう。
ぽんっとやって駄目だったらポイッと捨てられるんだよ。
そのレベルの大企業というのは策定側で関与しうるし
投機的な技術的投資にも貪欲だから
「大企業は動きが遅い」「稟議が厳密」という感覚ではない。
グーグルが大規模なサービスを開始からそれほど間を置かずに畳んだことなんて何度もあるだろう。
ぽんっとやって駄目だったらポイッと捨てられるんだよ。
118デフォルトの名無しさん
2021/08/27(金) 18:09:32.26ID:34BhyfmP そういう考え方ならISO標準でもできてから検討すればいいよ
時期尚早で時間の無駄
時期尚早で時間の無駄
119デフォルトの名無しさん
2021/08/27(金) 18:10:07.62ID:EkQRESx5 実際のところC++みたいに委員会とかが仕様がっちり決める言語ってどんくらいあるの?
そもそもC++だって仕様は決まってもコンパイラが微妙に準拠しきれてない気がするんだが
gccとclangは実用上困らんレベルだとは思うが
そもそもC++だって仕様は決まってもコンパイラが微妙に準拠しきれてない気がするんだが
gccとclangは実用上困らんレベルだとは思うが
120デフォルトの名無しさん
2021/08/27(金) 18:16:18.84ID:V38ET8xt ISO標準のある言語で一番新しいのがRubyくらいか
もっと新しいのあったっけ?
やはりリリースから10年以上はかかる感じかね
もっと新しいのあったっけ?
やはりリリースから10年以上はかかる感じかね
121デフォルトの名無しさん
2021/08/27(金) 18:18:18.61ID:i+fGpSJz 今の時点ではアーリーアダプタが使う言語なんだという立場でやってるならそれでもいいんだけど、
個別には割と (どこかには) まとまってるっぽいからもったいねーなという感覚がある。
個別には割と (どこかには) まとまってるっぽいからもったいねーなという感覚がある。
122デフォルトの名無しさん
2021/08/27(金) 18:27:08.06ID:zNEUYlcQ お前が標準化委員会になるんだよ!
123デフォルトの名無しさん
2021/08/27(金) 18:31:21.32ID:6epxU4jC GAFAMだけでなく
日本でもNTTやTOYOTAなどもRustを採用しているわけで
まともな企業ならば支障なくRust採用を決定していってるでしょう
日本でもNTTやTOYOTAなどもRustを採用しているわけで
まともな企業ならば支障なくRust採用を決定していってるでしょう
124デフォルトの名無しさん
2021/08/27(金) 18:52:17.41ID:nKzWHFHq 特定の組織の土着信仰を一般論のように入れてもね
125デフォルトの名無しさん
2021/08/27(金) 18:54:13.62ID:+wfLaYar 権威でものを判断したり
権威を借りて発言したり
頭ワリーわ
正気になれ
権威を借りて発言したり
頭ワリーわ
正気になれ
126デフォルトの名無しさん
2021/08/27(金) 19:30:34.42ID:wbifwX7a127デフォルトの名無しさん
2021/08/27(金) 19:32:40.90ID:+7PBhugx あの松下もわが社の製品を採用しているんですよ〜
情弱「ほほう、じゃうちも採用率するわ!」
情弱「ほほう、じゃうちも採用率するわ!」
128デフォルトの名無しさん
2021/08/27(金) 19:33:38.34ID:ul1V6iOZ メモリ開放の意味が解らない馬鹿に合わせるための言語なんだよな
馬鹿に合わせるとロクなことがない気がするんだけど
馬鹿に合わせるとロクなことがない気がするんだけど
129デフォルトの名無しさん
2021/08/27(金) 19:36:05.44ID:i+fGpSJz わかってても間違えるのが人間なんだよ。
ヒューマンエラーを防止するのに「注意する」とかで対策を済ませちゃうわけ?
ヒューマンエラーを防止するのに「注意する」とかで対策を済ませちゃうわけ?
130デフォルトの名無しさん
2021/08/27(金) 19:43:24.40ID:6epxU4jC >グーグルによればAndroidに存在した深刻なセキュリティー脆弱性の70%近くがメモリー安全に関するバグに起因するという。
>同様にマイクロソフトも、同社製品に存在したセキュリティー脆弱性の70%がメモリー安全に関するバグに起因すると述べている。
>C/C++を使う限りセキュリティー脆弱性を根絶するのは不可能と考えて、Rustを採用するに至ったというわけだ。
https://xtech.nikkei.com/atcl/nxt/column/18/00692/042700054/
>同様にマイクロソフトも、同社製品に存在したセキュリティー脆弱性の70%がメモリー安全に関するバグに起因すると述べている。
>C/C++を使う限りセキュリティー脆弱性を根絶するのは不可能と考えて、Rustを採用するに至ったというわけだ。
https://xtech.nikkei.com/atcl/nxt/column/18/00692/042700054/
131デフォルトの名無しさん
2021/08/27(金) 19:45:18.24ID:+7PBhugx132デフォルトの名無しさん
2021/08/27(金) 19:48:14.38ID:+wfLaYar C++で苦しんできた連中は
Rustのやろうとしたことは分かるし
例え失敗に終わっても責める気にはならん
どうころんでもしょせん死屍累々
Rustは人類の明日への尊い礎になるだけ
Rustのやろうとしたことは分かるし
例え失敗に終わっても責める気にはならん
どうころんでもしょせん死屍累々
Rustは人類の明日への尊い礎になるだけ
133デフォルトの名無しさん
2021/08/27(金) 19:57:25.52ID:2e6D9xTm134デフォルトの名無しさん
2021/08/27(金) 21:00:14.71ID:lzIWzz0k135デフォルトの名無しさん
2021/08/27(金) 21:03:28.03ID:lzIWzz0k 人々の関心の高さは感じるけどな。twitterとか見てると。
136デフォルトの名無しさん
2021/08/27(金) 21:07:48.98ID:lzIWzz0k でもtwitterでは、Pythonも活況だし、KotlinもRustと似たり寄ったりの数、検索される。
なぜかQtやRailsは検索されにくい。Djangoは沢山検索される。
cplusplusは僅かに検索される。C++やC#は直接的にはそもそもtwitterでは検索できない。
Rustの話題性がPythonやKotlinやDjangoと比べて取り立てて多いということではないようだ。
なぜかQtやRailsは検索されにくい。Djangoは沢山検索される。
cplusplusは僅かに検索される。C++やC#は直接的にはそもそもtwitterでは検索できない。
Rustの話題性がPythonやKotlinやDjangoと比べて取り立てて多いということではないようだ。
137デフォルトの名無しさん
2021/08/27(金) 21:44:01.80ID:pUsRfODL The Bookは読まないくせにどうでもいいTwitter検索ばっかりしやがって
あーあのTwitterで独り言つぶやき続けてるひとだっけ?
忘れてた
あーあのTwitterで独り言つぶやき続けてるひとだっけ?
忘れてた
138デフォルトの名無しさん
2021/08/27(金) 21:51:00.96ID:6al70LN5 とにかく仕様が必要ならC++使えばよいのでは。主要メンバーがC++標準理解しているようなすごい人ばかりなんだろう
139デフォルトの名無しさん
2021/08/27(金) 21:58:56.53ID:LFxFkvSL140デフォルトの名無しさん
2021/08/27(金) 22:04:01.75ID:cMIVTei2 実際は、Rails : Laravel = 8:2。
Django は、0
どこの学校・サロンもほぼ、Ruby on Rails
Django は、0
どこの学校・サロンもほぼ、Ruby on Rails
141デフォルトの名無しさん
2021/08/27(金) 23:00:14.26ID:n5qLAlq9 確実にinline展開する方法ってある?
手動で書く?
マクロだとどうにかなる?
手動で書く?
マクロだとどうにかなる?
142デフォルトの名無しさん
2021/08/27(金) 23:01:33.75ID:81/NfoJ7143デフォルトの名無しさん
2021/08/27(金) 23:13:16.52ID:EkQRESx5 #[inline(always)]でも100%ではないんだっけ?
144デフォルトの名無しさん
2021/08/27(金) 23:22:31.27ID:i+fGpSJz >>138
把握してないから必要なときにそれを調べればいいというようなまとまったものが必要なんだよ。
把握してないから必要なときにそれを調べればいいというようなまとまったものが必要なんだよ。
145デフォルトの名無しさん
2021/08/27(金) 23:40:58.77ID:Q0/jYufH Rust以外で高信頼性指向だとAdaとかMISRA Cとか?
146デフォルトの名無しさん
2021/08/27(金) 23:45:38.03ID:8/O2Ek7n >>143
実装はわからんけど、スペック的にはalwaysも飽くまでヒントらしい
実装はわからんけど、スペック的にはalwaysも飽くまでヒントらしい
147デフォルトの名無しさん
2021/08/27(金) 23:52:40.05ID:8/O2Ek7n148デフォルトの名無しさん
2021/08/28(土) 00:02:42.33ID:sJf3n258 ファッション感覚のバカしかアピールしてない言語だわ。
c++理解してない奴がライフタイムをまともに理解できるとも思わん。
それもわからんバカがcをバインディングなんかしたら事故しか起きんわ。
安全性もクソもない。
c++理解してない奴がライフタイムをまともに理解できるとも思わん。
それもわからんバカがcをバインディングなんかしたら事故しか起きんわ。
安全性もクソもない。
149デフォルトの名無しさん
2021/08/28(土) 00:03:44.74ID:7QeSIxjF 組み込み向けRustって1冊本が出たみたいだけど
実際のとこ、見込みありそうなの?
ただのホビー?
実際のとこ、見込みありそうなの?
ただのホビー?
150デフォルトの名無しさん
2021/08/28(土) 00:05:05.86ID:V8MBAFoh >>148
C++ はわかっててもミスるんだってば。
C++ はわかっててもミスるんだってば。
151デフォルトの名無しさん
2021/08/28(土) 01:13:09.37ID:d8vtmqNS C/C++知らないと〜と言う人には型理論知ってる?って聞きたくなる
コンパイルが通れば大体ちゃんと動くようになってるって感覚はhaskellとかOCaml寄りだと思う
コンパイルが通れば大体ちゃんと動くようになってるって感覚はhaskellとかOCaml寄りだと思う
152デフォルトの名無しさん
2021/08/28(土) 01:30:02.36ID:V8MBAFoh Haskell の型システムは好きなんだけど
さすがに副作用 (Haskell 的にはアクションだが……) の扱いがしんどすぎるし
元から C++ には慣れてるので C++ (というか C) 風な文法や意味論と
組み合わせた言語があったらいいなぁと思ってたので
Rust の台頭にはばんじゃーい ∩( ・ω・)∩
さすがに副作用 (Haskell 的にはアクションだが……) の扱いがしんどすぎるし
元から C++ には慣れてるので C++ (というか C) 風な文法や意味論と
組み合わせた言語があったらいいなぁと思ってたので
Rust の台頭にはばんじゃーい ∩( ・ω・)∩
153デフォルトの名無しさん
2021/08/28(土) 01:31:18.92ID:RscIlgzn おまえらスルー力低すぎやろw
154デフォルトの名無しさん
2021/08/28(土) 07:36:29.05ID:sJf3n258155デフォルトの名無しさん
2021/08/28(土) 08:21:08.61ID:t8+wI51G ガファムがファッションでプログラミングしてるとは知らなかった
156デフォルトの名無しさん
2021/08/28(土) 08:46:20.33ID:YWpKrN9v twitterでRustは話題性があるように見えるが、ためしにLISPやSchemeや
Clojure(言語)を検索してみてもRustと似たり寄ったりの書き込みがあった。
Haskelが次代を担う言語だ、的な書き込みすらある。
Clojure(言語)を検索してみてもRustと似たり寄ったりの書き込みがあった。
Haskelが次代を担う言語だ、的な書き込みすらある。
157デフォルトの名無しさん
2021/08/28(土) 09:10:33.46ID:sJf3n258 今のgoogleじゃまともなc++プログラマもだいぶ減ってるわな。。
kumagiとかイキってるだけでまともに理解してねーじゃん。
kumagiとかイキってるだけでまともに理解してねーじゃん。
158デフォルトの名無しさん
2021/08/28(土) 10:14:03.36ID:M1lC0AeK159デフォルトの名無しさん
2021/08/28(土) 11:32:23.88ID:70jgR/1l CG無し
160デフォルトの名無しさん
2021/08/28(土) 11:39:53.86ID:mx2u+dFv 特撮オンリーでいくわけですねわかります
161デフォルトの名無しさん
2021/08/28(土) 11:48:49.70ID:H94428G1 >>145
MISRAに従ってコーディングするの辛いぞ。
MISRAに従ってコーディングするの辛いぞ。
162デフォルトの名無しさん
2021/08/28(土) 12:14:36.47ID:UcVwcAtV >>160
特撮にはCG有るぞ
特撮にはCG有るぞ
163デフォルトの名無しさん
2021/08/28(土) 12:24:36.28ID:WeXzUgff 次のようなloop文のプログラム(可動)を
while文やfor文に書き換えてわかりやすくしたいのですが
上手く値をbreakできないので助けてください
fn main() {
let a = [3, 5, 1, 6, 9, 4];
print_first_even_else_zero(&a);
}
fn print_first_even_else_zero(a: &[i32]) {
let mut i = a.iter();
let even = loop {
if let Some(&n) = i.next() {
if n % 2 == 0 {
break n;
}
} else {
break 0; // not found
}
};
println!("{}", even);
}
例えばwhile文なら let even = while let Some(&n) = i.next() { となりそうで
さらに可能ならfor文で let even = for &n in a { となるかと思うのですが
while文やfor文に書き換えてわかりやすくしたいのですが
上手く値をbreakできないので助けてください
fn main() {
let a = [3, 5, 1, 6, 9, 4];
print_first_even_else_zero(&a);
}
fn print_first_even_else_zero(a: &[i32]) {
let mut i = a.iter();
let even = loop {
if let Some(&n) = i.next() {
if n % 2 == 0 {
break n;
}
} else {
break 0; // not found
}
};
println!("{}", even);
}
例えばwhile文なら let even = while let Some(&n) = i.next() { となりそうで
さらに可能ならfor文で let even = for &n in a { となるかと思うのですが
164デフォルトの名無しさん
2021/08/28(土) 12:44:34.41ID:t8+wI51G let even = a.iter().find(|n| *n % 2 == 0).unwrap_or(&0);
165デフォルトの名無しさん
2021/08/28(土) 13:03:12.27ID:WeXzUgff >>164
当然それはわかりますが、for式やwhile式ではどうなるのか、という質問です
当然それはわかりますが、for式やwhile式ではどうなるのか、という質問です
166デフォルトの名無しさん
2021/08/28(土) 13:07:44.67ID:lHkfX/Au 前スレより
625 デフォルトの名無しさん 2021/08/16(月) 09:44:36.63 ID:MZWGbmHz
loop式はbreakで指定した値を返せるのに
なぜwhile式やfor式は値を返せないの?
Option型にしてbreakで値を指定した時だけSome(値)としてそれ以外はNoneとすれば便利なのに
630 デフォルトの名無しさん sage 2021/08/16(月) 14:32:54.40 ID:ebJKRLr3
手間かけて機能拡張するほどのメリットがないってことだろうね
https://github.com/rust-lang/rfcs/issues/1767#issuecomment-292678002
625 デフォルトの名無しさん 2021/08/16(月) 09:44:36.63 ID:MZWGbmHz
loop式はbreakで指定した値を返せるのに
なぜwhile式やfor式は値を返せないの?
Option型にしてbreakで値を指定した時だけSome(値)としてそれ以外はNoneとすれば便利なのに
630 デフォルトの名無しさん sage 2021/08/16(月) 14:32:54.40 ID:ebJKRLr3
手間かけて機能拡張するほどのメリットがないってことだろうね
https://github.com/rust-lang/rfcs/issues/1767#issuecomment-292678002
167デフォルトの名無しさん
2021/08/28(土) 13:08:21.57ID:t8+wI51G そうでしたかすみません
forとwhileは値を返さないのでご想像のようにはなりません
forとwhileは値を返さないのでご想像のようにはなりません
168デフォルトの名無しさん
2021/08/28(土) 14:07:01.17ID:WeXzUgff >>166
なるほど
そこでの議論を読むと一番の肝が、
「for式が()を返さないと、最後がfor式で終わる関数の返り値で互換性が無くなる」
というところにあるようですが
「break;」が()を返すことにすれば特に問題ないように見えます
実際にloop式で値なしのbreakだと()を返しています
つまり
・「for/while/loop式が返す型」は「break式の型」とする
・「値指定のない『break;』の型」は()とする
・「break式がない場合の型」も()とする
ここまでは現状と同じになりますね
問題はfor/while式はbreakせずともループを抜けるので、値を返すには、
・「『break 値;』があるfor/while式」は「else節を取ってbreak式と同じ型を返す」
という単純ルールだけで済むように見えます
何か見落としがあるでしょうか?
なるほど
そこでの議論を読むと一番の肝が、
「for式が()を返さないと、最後がfor式で終わる関数の返り値で互換性が無くなる」
というところにあるようですが
「break;」が()を返すことにすれば特に問題ないように見えます
実際にloop式で値なしのbreakだと()を返しています
つまり
・「for/while/loop式が返す型」は「break式の型」とする
・「値指定のない『break;』の型」は()とする
・「break式がない場合の型」も()とする
ここまでは現状と同じになりますね
問題はfor/while式はbreakせずともループを抜けるので、値を返すには、
・「『break 値;』があるfor/while式」は「else節を取ってbreak式と同じ型を返す」
という単純ルールだけで済むように見えます
何か見落としがあるでしょうか?
169デフォルトの名無しさん
2021/08/28(土) 14:41:22.43ID:AMsYRDZ6170デフォルトの名無しさん
2021/08/28(土) 15:14:25.46ID:WeXzUgff >>169
なるほどありがとうございます
ところで現状のRustで>>163の例のloop式をfor式で行おうとすると
即時関数を使ってbreakをreturnに置き換えることで
let even = (|| {
for &n in a {
if n % 2 == 0 {
return n;
}
}
0
})();
と実現できることを思いつきましたが
この方法は表記コストはともかく実行コストもかかってしまいますか?
ちなみにこの「最初の偶数を見つけるコード」はあくまでも例として単純化したものを出しているだけで
実際には様々な例でこのパターン(=forやwhileで値を返せると便利)が出てくるので簡略な例題として話をしています
なるほどありがとうございます
ところで現状のRustで>>163の例のloop式をfor式で行おうとすると
即時関数を使ってbreakをreturnに置き換えることで
let even = (|| {
for &n in a {
if n % 2 == 0 {
return n;
}
}
0
})();
と実現できることを思いつきましたが
この方法は表記コストはともかく実行コストもかかってしまいますか?
ちなみにこの「最初の偶数を見つけるコード」はあくまでも例として単純化したものを出しているだけで
実際には様々な例でこのパターン(=forやwhileで値を返せると便利)が出てくるので簡略な例題として話をしています
171デフォルトの名無しさん
2021/08/28(土) 15:30:38.48ID:TLYe8gOd >>168
イテレータのコードのほうが遥かにわかりやすい上に簡潔なので
新しく文法を拡張する価値がないと開発陣は考えてる点を見落としてる。る?
特にPythonの失敗例を鑑みれば機能追加される可能性は限りなくゼロ
イテレータのコードのほうが遥かにわかりやすい上に簡潔なので
新しく文法を拡張する価値がないと開発陣は考えてる点を見落としてる。る?
特にPythonの失敗例を鑑みれば機能追加される可能性は限りなくゼロ
172デフォルトの名無しさん
2021/08/28(土) 15:43:20.61ID:M1lC0AeK173デフォルトの名無しさん
2021/08/28(土) 16:01:24.35ID:Zz3t2OiP Rustに限った話じゃないけど新しめの言語だとイテレータで記述可能な
ループは、出来るだけイテレータで記述するのが主流じゃね
forだのwhileはループ条件の誤りから簡単にバグが生まれるし
使わないで済むならそれに越したことはない
CやCの派生系言語がメインの人には理解しがたいかもしれないが
ループは、出来るだけイテレータで記述するのが主流じゃね
forだのwhileはループ条件の誤りから簡単にバグが生まれるし
使わないで済むならそれに越したことはない
CやCの派生系言語がメインの人には理解しがたいかもしれないが
174デフォルトの名無しさん
2021/08/28(土) 16:07:59.88ID:V8MBAFoh C++ だとテンプレートの組み合わせで回すのも一般的だけど
Go だと凝ったことするよりなんでも愚直にループを回したほうがいいというのは
基本的なスタンスになってるよね。
Go だと凝ったことするよりなんでも愚直にループを回したほうがいいというのは
基本的なスタンスになってるよね。
175デフォルトの名無しさん
2021/08/28(土) 16:18:39.14ID:TLYe8gOd >>172
説得力のある実例を出せば今みたいにRFCが即closeされることはないんじゃない?
状況によってはイテレータを拡張したほうがいいという判断も有り得るし
今のforやwhileループみたいにmutで定義した変数を更新するのでも十分かもしれない
説得力のある実例を出せば今みたいにRFCが即closeされることはないんじゃない?
状況によってはイテレータを拡張したほうがいいという判断も有り得るし
今のforやwhileループみたいにmutで定義した変数を更新するのでも十分かもしれない
176デフォルトの名無しさん
2021/08/28(土) 17:39:28.92ID:WeXzUgff >>173
なるほど
出来るだけイテレータで記述する質問です
コマンドライン引数の数字の和をイテレータでpanicさせずに求める場合
これよりもっと短く出来ないでしょうか?
fn main() -> Result<(), std::num::ParseIntError> {
println!("Sum: {}", std::env::args().skip(1).map(|s| s.parse::<i32>()).collect::<Result<Vec<i32>,_>>()?.iter().sum::<i32>());
Ok(())
}
以下のように正しく実行できているのですがコードが長いのが気になっています
$ cargo run 10 20 30 40 50
Sum: 150
$ cargo run 10 20 XX 40 50
Error: ParseIntError { kind: InvalidDigit }
なるほど
出来るだけイテレータで記述する質問です
コマンドライン引数の数字の和をイテレータでpanicさせずに求める場合
これよりもっと短く出来ないでしょうか?
fn main() -> Result<(), std::num::ParseIntError> {
println!("Sum: {}", std::env::args().skip(1).map(|s| s.parse::<i32>()).collect::<Result<Vec<i32>,_>>()?.iter().sum::<i32>());
Ok(())
}
以下のように正しく実行できているのですがコードが長いのが気になっています
$ cargo run 10 20 30 40 50
Sum: 150
$ cargo run 10 20 XX 40 50
Error: ParseIntError { kind: InvalidDigit }
177デフォルトの名無しさん
2021/08/28(土) 17:58:47.12ID:pl5LALbI そんなに長い?
178デフォルトの名無しさん
2021/08/28(土) 18:59:50.15ID:78cNf6mY twitterで「Rust過激派がルール違反と判断された」
「CやC++のこと書いてた人にRustの話吹っかけて迷惑かけてた怖い人たち」
という話を見たが、誰の事?
どういうことなんだ?
「CやC++のこと書いてた人にRustの話吹っかけて迷惑かけてた怖い人たち」
という話を見たが、誰の事?
どういうことなんだ?
179デフォルトの名無しさん
2021/08/28(土) 19:21:11.03ID:0ROz2KLh >>178
c++テンプレートテクニックの著者のことか?
c++テンプレートテクニックの著者のことか?
180デフォルトの名無しさん
2021/08/28(土) 19:24:41.12ID:0ROz2KLh >>61
int* p1 = malloc(sizeof(int));
int* p2 = malloc(sizeof(int));
int* p3;
if (なんかの条件) p3 = p1; else p3 = p2;
free(p1);
p1 = NULL;
if (なんかの条件) p3 = NULL;
// p2はまだまだ使う
こうすればいいだけの話だろ?ガイジか?
このコードの後 p2またはp3どちらかをfreeしても二重開放にならんよ
このぐらいも考えられないのかガイジは(笑)
int* p1 = malloc(sizeof(int));
int* p2 = malloc(sizeof(int));
int* p3;
if (なんかの条件) p3 = p1; else p3 = p2;
free(p1);
p1 = NULL;
if (なんかの条件) p3 = NULL;
// p2はまだまだ使う
こうすればいいだけの話だろ?ガイジか?
このコードの後 p2またはp3どちらかをfreeしても二重開放にならんよ
このぐらいも考えられないのかガイジは(笑)
181デフォルトの名無しさん
2021/08/28(土) 19:28:28.84ID:LR/RwLxP いちいち差別的な用語を使わないとレスもできないのか
プログラマとしては一流なのかもしれないが、人間としては最低だな
プログラマとしては一流なのかもしれないが、人間としては最低だな
182デフォルトの名無しさん
2021/08/28(土) 20:41:09.02ID:WeXzUgff >>177
このcollectしてから再びiterするところを何とか出来ないものかなと
println!("Sum: {}", std::env::args().skip(1).map(|s| s.parse::<i32>()).collect::<Result<Vec<i32>,_>>()?.iter().sum::<i32>());
イテレータだけを使う限界?
同じことをfor文を使うと短くなってわかりやすくなります
let mut total = 0;
for s in std::env::args().skip(1) {
total += s.parse::<i32>()?;
}
println!("Sum: {}", total);
このcollectしてから再びiterするところを何とか出来ないものかなと
println!("Sum: {}", std::env::args().skip(1).map(|s| s.parse::<i32>()).collect::<Result<Vec<i32>,_>>()?.iter().sum::<i32>());
イテレータだけを使う限界?
同じことをfor文を使うと短くなってわかりやすくなります
let mut total = 0;
for s in std::env::args().skip(1) {
total += s.parse::<i32>()?;
}
println!("Sum: {}", total);
183デフォルトの名無しさん
2021/08/28(土) 21:00:48.99ID:t8+wI51G std::env::args().skip(1).map(|s| s.parse::<i32>()).sum::<Result<i32, _>>()?
184デフォルトの名無しさん
2021/08/28(土) 21:02:35.90ID:TLYe8gOd ParseIntError返しても処理しないんだから
unwrap_or(0)みたいなので十分じゃないの?
fn main() {
let args = std::env::args().skip(1);
let sum: i32 = args.map(|s| s.parse().unwrap_or(0)).sum();
println!("Sum: {}", sum);
}
入力、計算、出力で分けてる
unwrap_or(0)みたいなので十分じゃないの?
fn main() {
let args = std::env::args().skip(1);
let sum: i32 = args.map(|s| s.parse().unwrap_or(0)).sum();
println!("Sum: {}", sum);
}
入力、計算、出力で分けてる
185デフォルトの名無しさん
2021/08/28(土) 21:14:51.79ID:M1lC0AeK186デフォルトの名無しさん
2021/08/28(土) 21:23:19.42ID:AMsYRDZ6 println!("{}", std::env::args().skip().try_fold(|sum, s| Ok(sum + s.parse::<i32>()?))?);
try_fold使うと?演算子の入る場所が変わらずに済むっぽいな
try_fold使うと?演算子の入る場所が変わらずに済むっぽいな
187デフォルトの名無しさん
2021/08/28(土) 21:24:03.32ID:WeXzUgff >>183
なるほど!
sum()もcollect()のように様々な形の集積方法が指定できるのですね
i32整数一覧が入力に来るのにsum::<i32>()とi32型指定をしないと怒られた理由がようやくわかりました
sumとcollect以外にもそういう仕様のメソッドはありますか?
なるほど!
sum()もcollect()のように様々な形の集積方法が指定できるのですね
i32整数一覧が入力に来るのにsum::<i32>()とi32型指定をしないと怒られた理由がようやくわかりました
sumとcollect以外にもそういう仕様のメソッドはありますか?
188デフォルトの名無しさん
2021/08/28(土) 21:34:12.61ID:iw2Y3ERl いちいち固有のiterator使うとか可読性悪くなるだけって場合も多い
189デフォルトの名無しさん
2021/08/28(土) 21:54:20.22ID:WeXzUgff190デフォルトの名無しさん
2021/08/28(土) 22:01:27.46ID:TLYe8gOd >>185
エラーだと示したいなら結果をハンドリングすればいいんじゃないの?
type Result<T> = std::result::Result<T, std::num::ParseIntError>;
fn main() {
let args = std::env::args().skip(1);
let sum: Result<i32> = args.map(|s| s.parse::<i32>()).sum();
match sum {
Ok(sum) => println!("Sum: {}", sum),
Err(e) => println!("Error: {}", e),
};
}
引数ゼロ個とかエラーは1種類じゃまかなえない
ハンドリングしたいならエラー設計がもう少し必要になるだろうね
エラーだと示したいなら結果をハンドリングすればいいんじゃないの?
type Result<T> = std::result::Result<T, std::num::ParseIntError>;
fn main() {
let args = std::env::args().skip(1);
let sum: Result<i32> = args.map(|s| s.parse::<i32>()).sum();
match sum {
Ok(sum) => println!("Sum: {}", sum),
Err(e) => println!("Error: {}", e),
};
}
引数ゼロ個とかエラーは1種類じゃまかなえない
ハンドリングしたいならエラー設計がもう少し必要になるだろうね
191デフォルトの名無しさん
2021/08/28(土) 22:12:53.29ID:M1lC0AeK192デフォルトの名無しさん
2021/08/28(土) 22:34:29.66ID:TLYe8gOd >>191
何をそんなにカリカリしてるんだ?
main()でResult返したいなら別にそれでもいいんじゃない?
fn main() -> Result<()> {
let args = std::env::args().skip(1);
let sum: Result<i32> = args.map(|s| s.parse::<i32>()).sum();
println!("{}", sum?);
Ok(())
}
何をそんなにカリカリしてるんだ?
main()でResult返したいなら別にそれでもいいんじゃない?
fn main() -> Result<()> {
let args = std::env::args().skip(1);
let sum: Result<i32> = args.map(|s| s.parse::<i32>()).sum();
println!("{}", sum?);
Ok(())
}
193デフォルトの名無しさん
2021/08/28(土) 22:53:59.26ID:M1lC0AeK194デフォルトの名無しさん
2021/08/28(土) 23:36:35.98ID:WeXzUgff 今回はargs部分も枝葉末節なので外してまとめ直すと
『数値と思われる文字列の配列が与えられた時に非数値があればエラーを返すとして』
let a = ["1", "3", "5", "7", "9"];
和の場合はmap()でResultのままsum()に渡してResultを返せる
let sum = a.iter().map(|s| s.parse::<i32>()).sum::<Result<i32, _>>()?;
和だけでなく積などもtry_fold()を使えばResultを返せる
let sum = a.iter().try_fold(0, |sum, s| Ok(sum + s.parse::<i32>()?))?;
let mul = a.iter().try_fold(1, |mul, s| Ok(mul * s.parse::<i32>()?))?;
今回はparse()で文字列→数値のResultだけど一般的にResultを返す関数なら応用可能
皆さんありがとうございました
『数値と思われる文字列の配列が与えられた時に非数値があればエラーを返すとして』
let a = ["1", "3", "5", "7", "9"];
和の場合はmap()でResultのままsum()に渡してResultを返せる
let sum = a.iter().map(|s| s.parse::<i32>()).sum::<Result<i32, _>>()?;
和だけでなく積などもtry_fold()を使えばResultを返せる
let sum = a.iter().try_fold(0, |sum, s| Ok(sum + s.parse::<i32>()?))?;
let mul = a.iter().try_fold(1, |mul, s| Ok(mul * s.parse::<i32>()?))?;
今回はparse()で文字列→数値のResultだけど一般的にResultを返す関数なら応用可能
皆さんありがとうございました
195デフォルトの名無しさん
2021/08/29(日) 09:06:24.35ID:CQyaTqyh >>179
指摘している人も、加害者もエピステーメー氏とは全く関係ない人だと思う。
指摘している人も、加害者もエピステーメー氏とは全く関係ない人だと思う。
196デフォルトの名無しさん
2021/08/29(日) 12:05:26.47ID:ehQ9raC/ >>195
えぴすめーてーじゃないほうの共著者のほうでしょ
えぴすめーてーじゃないほうの共著者のほうでしょ
197デフォルトの名無しさん
2021/08/29(日) 13:31:13.01ID:pAl4bTqC ローマ字で takaha... の人のことか。
Ukic...の人も何か言ってるんだけどどういう相関関係なのか。。
Ukic...の人も何か言ってるんだけどどういう相関関係なのか。。
198デフォルトの名無しさん
2021/08/29(日) 17:50:42.33ID:rRIESWs9 対立煽りに乗らないように
199デフォルトの名無しさん
2021/08/29(日) 20:28:38.19ID:TMfqiUgQ >>174
Goは確かにその方針だけど、イテレータというか高階関数を受ける型が総称では無いから.collectや.mapなんて
型ごとに定義しないと使えないから。Go2になってくれば違ってくると思う
一方でPythonだとfunctools.reduceなんかより、リスト内包表記が使われるのは局所性で速度が速いからだけど
ループで書かずにかなり長い表現をこれで書かれると保守しずらい。
Rustでもイテレータを何回も取り出してcollectしたり、foldしたりをドットで繋げられるのはあまり読み易いとは
言えないと思う。普通にiter()を何度も呼ぶのなら、let it = a.iter();して欲しい
Goは確かにその方針だけど、イテレータというか高階関数を受ける型が総称では無いから.collectや.mapなんて
型ごとに定義しないと使えないから。Go2になってくれば違ってくると思う
一方でPythonだとfunctools.reduceなんかより、リスト内包表記が使われるのは局所性で速度が速いからだけど
ループで書かずにかなり長い表現をこれで書かれると保守しずらい。
Rustでもイテレータを何回も取り出してcollectしたり、foldしたりをドットで繋げられるのはあまり読み易いとは
言えないと思う。普通にiter()を何度も呼ぶのなら、let it = a.iter();して欲しい
200デフォルトの名無しさん
2021/08/29(日) 21:26:36.38ID:FKMKprYN そのitは一度しか使えないのでわ
201デフォルトの名無しさん
2021/08/29(日) 21:37:15.37ID:3sJ97RgW collect()したやつに.iter()は確かにやめてほしい
終端操作するなら何か変数に入れた上でやってほしい
終端操作するなら何か変数に入れた上でやってほしい
202デフォルトの名無しさん
2021/08/29(日) 21:56:31.67ID:Y4MENvlF AdapterとConsumerは必ず分けろってこと?
もちろん分けたほうがいい場合もあるだろうけど
別に一緒でもいいと思うんだけどな
もちろん分けたほうがいい場合もあるだろうけど
別に一緒でもいいと思うんだけどな
203デフォルトの名無しさん
2021/08/29(日) 22:06:52.56ID:4xE/eKOX204デフォルトの名無しさん
2021/08/29(日) 22:08:51.10ID:Y4MENvlF 上にあるコードでcollect()した後にiter()してるやつのことか
それなら分かる
それなら分かる
205デフォルトの名無しさん
2021/08/29(日) 22:19:15.00ID:FKMKprYN あぁそういうこと
俺は別に繋がってていいかな
俺は別に繋がってていいかな
206デフォルトの名無しさん
2021/08/29(日) 22:49:50.89ID:4xE/eKOX207デフォルトの名無しさん
2021/08/29(日) 23:12:51.30ID:Y4MENvlF >>206
だからこそcollect()した後にiter()してるコードは改善したほうがいいよって話だろ?
だからこそcollect()した後にiter()してるコードは改善したほうがいいよって話だろ?
208デフォルトの名無しさん
2021/08/29(日) 23:54:47.37ID:6tO3Pyjl 和も積も求めたい時はどうすればいいかな?
文字列から数値への変換を二度するのを避けるとして
一つの方法はこのように一旦collectとして数値のVecを作ってしまう
fn main() -> Result<(), std::num::ParseIntError> {
let input_numbers: Vec<i32> = std::env::args().skip(1).map(|s| s.parse::<i32>()).collect::<Result<_,_>>()?;
println!("和: {}", input_numbers.iter().sum::<i32>());
println!("積: {}", input_numbers.iter().fold(1, |mul, n| mul * n));
Ok(())
}
それともcollectせずにイテレータのままで止めておいて使う?
文字列から数値への変換を二度するのを避けるとして
一つの方法はこのように一旦collectとして数値のVecを作ってしまう
fn main() -> Result<(), std::num::ParseIntError> {
let input_numbers: Vec<i32> = std::env::args().skip(1).map(|s| s.parse::<i32>()).collect::<Result<_,_>>()?;
println!("和: {}", input_numbers.iter().sum::<i32>());
println!("積: {}", input_numbers.iter().fold(1, |mul, n| mul * n));
Ok(())
}
それともcollectせずにイテレータのままで止めておいて使う?
209デフォルトの名無しさん
2021/08/29(日) 23:59:56.40ID:53Xl0cl7 質問者とイライラ君が同一人物のパターン?
210デフォルトの名無しさん
2021/08/30(月) 00:06:07.90ID:gpHI1J3P product()使わないの?
211デフォルトの名無しさん
2021/08/30(月) 00:06:33.11ID:kOjyqHoG >>208
foldで和と差の2要素のタプルをとりまわせば良いだけ
foldで和と差の2要素のタプルをとりまわせば良いだけ
212デフォルトの名無しさん
2021/08/30(月) 00:56:00.83ID:5WtxtfY9 こうかな
println!("和: {}", std::env::args().skip(1).map(|s| s.parse::<i32>()).sum::<Result<i32,_>>()?);
println!("積: {}", std::env::args().skip(1).map(|s| s.parse::<i32>()).product::<Result<i32,_>>()?);
println!("(和,積): {:?}", std::env::args().skip(1).try_fold((0, 1), |(sum, mul), s| { let n = s.parse::<i32>()?; Ok((sum + n, mul * n))})?);
println!("和: {}", std::env::args().skip(1).map(|s| s.parse::<i32>()).sum::<Result<i32,_>>()?);
println!("積: {}", std::env::args().skip(1).map(|s| s.parse::<i32>()).product::<Result<i32,_>>()?);
println!("(和,積): {:?}", std::env::args().skip(1).try_fold((0, 1), |(sum, mul), s| { let n = s.parse::<i32>()?; Ok((sum + n, mul * n))})?);
213デフォルトの名無しさん
2021/08/30(月) 01:17:16.84ID:XeeK64dt >>209
っぽい
っぽい
214デフォルトの名無しさん
2021/08/30(月) 01:45:40.23ID:Fg1XXjYH C++君も
215デフォルトの名無しさん
2021/08/30(月) 05:11:39.37ID:1N5t7Emb この前はNim連呼してた
216デフォルトの名無しさん
2021/08/30(月) 05:23:26.66ID:YLwuWBBL 二重解放NULL荒らしもな
217デフォルトの名無しさん
2021/08/30(月) 08:14:19.28ID:Bz8fsAkW >>209
確かにこんな特徴的な勘違いをするやつが同時に二人出現するわけないわな
確かにこんな特徴的な勘違いをするやつが同時に二人出現するわけないわな
218デフォルトの名無しさん
2021/08/30(月) 08:46:37.85ID:nNe2AEIB じゃあワイはガリガリ君で
219デフォルトの名無しさん
2021/08/30(月) 09:38:42.61ID:j0aQcfY/ >>214
C++ vs Rustスレでやれと何度言っても聞かずにここでイライラしてるよな
C++ vs Rustスレでやれと何度言っても聞かずにここでイライラしてるよな
220デフォルトの名無しさん
2021/08/30(月) 10:38:26.28ID:iy37Frot 上のイテレータ関連の質問に便乗ですが、
二次元vecの各要素をv[i][j]としたときに、
jごとの総和を計算するやつをイテレータできれいに書く方法ありますか?
例えばこういうやつです
let v = vec![vec![0; n]; m];
// (vの各要素を設定)
let mut result = vec![0; n];
for i in 0..m {
for j in 0..n {
result[j] += v[i][j];
}
}
二次元vecの各要素をv[i][j]としたときに、
jごとの総和を計算するやつをイテレータできれいに書く方法ありますか?
例えばこういうやつです
let v = vec![vec![0; n]; m];
// (vの各要素を設定)
let mut result = vec![0; n];
for i in 0..m {
for j in 0..n {
result[j] += v[i][j];
}
}
221デフォルトの名無しさん
2021/08/30(月) 10:46:23.34ID:qTeljjrO >中間変数を使うか否かだけの問題だからどうでもいい話
Rustの場合、ライフタイムとオーナーシップの関係で
中間変数を使うか否かは結構重要な問題だったりする
Rustの場合、ライフタイムとオーナーシップの関係で
中間変数を使うか否かは結構重要な問題だったりする
222デフォルトの名無しさん
2021/08/30(月) 10:56:01.57ID:b2fdtQYv223デフォルトの名無しさん
2021/08/30(月) 12:15:23.57ID:OrMFDzce224デフォルトの名無しさん
2021/08/30(月) 12:35:22.36ID:iy37Frot225デフォルトの名無しさん
2021/08/30(月) 13:18:46.38ID:cyaLRDjw (0..n).map(|j| (0..m).map(|i| v[i][j]).sum()).collect()
2重forをの親子を逆転してイテレータメソッドチェーンに変換しただけという感じ
こんなことよりもっと意味のあることに頭使ったほうがいい
イテレータでとあったから上を書いたが現実にはndarray入れてsum_axis使うのがいいだろう
https://docs.rs/ndarray/0.15.3/ndarray/struct.ArrayBase.html#method.sum_axis
2重forをの親子を逆転してイテレータメソッドチェーンに変換しただけという感じ
こんなことよりもっと意味のあることに頭使ったほうがいい
イテレータでとあったから上を書いたが現実にはndarray入れてsum_axis使うのがいいだろう
https://docs.rs/ndarray/0.15.3/ndarray/struct.ArrayBase.html#method.sum_axis
226デフォルトの名無しさん
2021/08/30(月) 13:30:16.69ID:w/2FJku9 こんなかんじかな
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=e302c841c8dd709418f923ea1ad07868
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=e302c841c8dd709418f923ea1ad07868
227デフォルトの名無しさん
2021/08/30(月) 13:33:43.06ID:w/2FJku9 ほぼかぶってたごめん
228デフォルトの名無しさん
2021/08/30(月) 13:38:15.69ID:iy37Frot >>225-226 インデックス自体のイテレータを作るって発想がありませんでした、ありがとうございます
競プロ用ではないしndarray使うのも考えてみます
競プロ用ではないしndarray使うのも考えてみます
229デフォルトの名無しさん
2021/08/30(月) 14:45:34.31ID:07yK3Bti 汎用的には縦横入れ替えのtransposeを作っておけば色んな操作が楽かもね
イテレータ作成はサボってとりあえず関数版
fn transpose<T>(v: &Vec<Vec<T>>) -> Vec<Vec<T>> where T: Copy {
(0..v[0].len()).map(|j| v.into_iter().map(|vv| (*vv)[j]).collect::<Vec<T>>()).collect()
}
fn main() {
let v = vec![vec![1,2,3], vec![4,5,6], vec![7,8,9], vec![10,11,12]];
let w = transpose(&v);
println!("{:?}", v); // [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
println!("{:?}", w); // [[1, 4, 7, 10], [2, 5, 8, 11], [3, 6, 9, 12]]
}
イテレータ作成はサボってとりあえず関数版
fn transpose<T>(v: &Vec<Vec<T>>) -> Vec<Vec<T>> where T: Copy {
(0..v[0].len()).map(|j| v.into_iter().map(|vv| (*vv)[j]).collect::<Vec<T>>()).collect()
}
fn main() {
let v = vec![vec![1,2,3], vec![4,5,6], vec![7,8,9], vec![10,11,12]];
let w = transpose(&v);
println!("{:?}", v); // [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
println!("{:?}", w); // [[1, 4, 7, 10], [2, 5, 8, 11], [3, 6, 9, 12]]
}
230デフォルトの名無しさん
2021/08/30(月) 20:06:03.21ID:kOjyqHoG transposeみたいな関数用意すべきかは配列の要素数次第かなあ
たかだか1度しか読まないデータのためだけに配列全体をコピーするのはもったいないケースはありそう
たかだか1度しか読まないデータのためだけに配列全体をコピーするのはもったいないケースはありそう
231デフォルトの名無しさん
2021/08/30(月) 20:10:57.31ID:kOjyqHoG 性能気にするなら Vec<Vec<_>> の形で数値格納するのではなく
Vec<_> に格納して (i, j) -> j*n+i みたいにインデックスを変換してくれるラッパーを被せた方がよさそう
Vec<_> に格納して (i, j) -> j*n+i みたいにインデックスを変換してくれるラッパーを被せた方がよさそう
232デフォルトの名無しさん
2021/08/30(月) 20:40:55.84ID:W4wNS06G >>231
それがndarrayなのでは?
それがndarrayなのでは?
233デフォルトの名無しさん
2021/08/30(月) 20:50:30.90ID:k7vUdD10234デフォルトの名無しさん
2021/08/30(月) 21:09:01.34ID:bfTdIfIK C++ドロップアウターの吹き溜まりスレ
235デフォルトの名無しさん
2021/08/30(月) 21:16:46.70ID:Xk6FdWtE >>223
競プロではむしろ回答時間や処理速度のほうが重要なので、
あえてこういうのをイテレータで実装しようとしないよ
おれなら間違いなくforで回す。わざわざイテレータで回そうと考える時間が無駄
だけど、後から振り返って、これをイテレータで1行で簡単に表示できるんじゃないかな?と思うことはよくあるんよ。
そして、ドキュメントを見返したり、他人のソースを見て、ああこういうやり方もあるんだなと学習する
競プロは実際のコーディングに役立たないという人もいるけど、
普段、自分が利用しないメソッドや方法を発見すること、実務で役立ちそうなアルゴリズムがあることを知る
という意味では意味があると思う
競プロではむしろ回答時間や処理速度のほうが重要なので、
あえてこういうのをイテレータで実装しようとしないよ
おれなら間違いなくforで回す。わざわざイテレータで回そうと考える時間が無駄
だけど、後から振り返って、これをイテレータで1行で簡単に表示できるんじゃないかな?と思うことはよくあるんよ。
そして、ドキュメントを見返したり、他人のソースを見て、ああこういうやり方もあるんだなと学習する
競プロは実際のコーディングに役立たないという人もいるけど、
普段、自分が利用しないメソッドや方法を発見すること、実務で役立ちそうなアルゴリズムがあることを知る
という意味では意味があると思う
236デフォルトの名無しさん
2021/08/30(月) 21:24:57.91ID:zvivEi6g237デフォルトの名無しさん
2021/08/31(火) 00:14:29.47ID:NYCNDL8F238デフォルトの名無しさん
2021/08/31(火) 01:03:24.14ID:P5Wfb+Ix 今日もまたこのパターンw
ヤバいやつっすね
ヤバいやつっすね
239デフォルトの名無しさん
2021/08/31(火) 01:24:07.51ID:uga9Wpe3 たまにLKMLのURL貼られるけどURLだけ貼られてもなんもわからん
240デフォルトの名無しさん
2021/08/31(火) 09:11:07.02ID:7zPv8PJ6 >>235
最適化まで考えるならforなんだろうけど、iterやcollectなんかが最適化が効かないのは今昔で、いずれは
最適化されるんじゃないだろうかと希望的観測を述べてみたり。実際gccなんかだとリンク時の最適化なんて
オプションあるし、あんまり凝ったiter/map/collect/foldだと理解に時間が掛かることはいなめない
最適化まで考えるならforなんだろうけど、iterやcollectなんかが最適化が効かないのは今昔で、いずれは
最適化されるんじゃないだろうかと希望的観測を述べてみたり。実際gccなんかだとリンク時の最適化なんて
オプションあるし、あんまり凝ったiter/map/collect/foldだと理解に時間が掛かることはいなめない
241デフォルトの名無しさん
2021/08/31(火) 09:16:05.39ID:uIcWKBVk ぼくのかんがえた最強のコードが見下されたと思って悔しかったんだろうな
図星だったからこそ競プロでは逆にこんな書き方しないとか競プロは役に立つとか自己正当化に必死になる
追い越されたらバカにされたと思って煽り運転をする人と心理と同じなのでどちらの側も少し気を付けたほうがいい
図星だったからこそ競プロでは逆にこんな書き方しないとか競プロは役に立つとか自己正当化に必死になる
追い越されたらバカにされたと思って煽り運転をする人と心理と同じなのでどちらの側も少し気を付けたほうがいい
242デフォルトの名無しさん
2021/08/31(火) 10:02:54.76ID:Mir3UPzo forよりイテレータのメソッドチェーンのほうが処理速度速かった気がするんだが
243デフォルトの名無しさん
2021/08/31(火) 10:51:36.61ID:ajUm3fTo やっていることが同じなら (最適化などによって) 結果のコードもおおよそ同じところに着地するよ。
244デフォルトの名無しさん
2021/08/31(火) 12:44:14.75ID:Iv8lyMCD C/C++でポインタを使うと速い(プラシーボ)
245デフォルトの名無しさん
2021/08/31(火) 13:28:16.71ID:ajUm3fTo せやな。 素朴なコンパイラならともかく
いまどきの最適化能力を期待できるなら
ポインタはエイリアス解析を困難にするから
むしろ足を引っ張る要素になる。
いまどきの最適化能力を期待できるなら
ポインタはエイリアス解析を困難にするから
むしろ足を引っ張る要素になる。
246デフォルトの名無しさん
2021/08/31(火) 14:25:42.76ID:SlncBcTV >>244
ポインタは適切に使えばデータ構造やアルゴリズム自体が根本的に変えることが
できるので使わない時と比べて計算オーダー自体が劇的に変化することがあり、
プラシーボではない。
Rustはその点でC/C++に勝てない事がある。
ポインタは適切に使えばデータ構造やアルゴリズム自体が根本的に変えることが
できるので使わない時と比べて計算オーダー自体が劇的に変化することがあり、
プラシーボではない。
Rustはその点でC/C++に勝てない事がある。
247デフォルトの名無しさん
2021/08/31(火) 14:28:10.16ID:SlncBcTV 例えば、動的配列であるところのVectorはポインタでアクセスしても余り
効率は良くならないが、LinkedListは構造的にポインタで連結されており、
首尾一貫して添え字アクセスを使わずに必ずポインタでノードを識別する
ようにすれば、Vectorに比べて劇的に効率アップできることがある。
それはRustではほぼ不可能。ベンチマークはこの点が反映されてない。
効率は良くならないが、LinkedListは構造的にポインタで連結されており、
首尾一貫して添え字アクセスを使わずに必ずポインタでノードを識別する
ようにすれば、Vectorに比べて劇的に効率アップできることがある。
それはRustではほぼ不可能。ベンチマークはこの点が反映されてない。
248デフォルトの名無しさん
2021/08/31(火) 15:24:34.70ID:8qO1h2Cp249デフォルトの名無しさん
2021/08/31(火) 21:08:01.25ID:NYCNDL8F >>240
最適化ではなくて、forを利用してindexで回さないとできないことが山ほどあるんだよね
例えば、二分探索や三分探索とか
foreach(a in vec)で順繰りに回せる処理ならいいけど、
そういう処理ではできないこともあるので、
forで回す前提で考えたほうが、あとから修正する余地があるので、どうしてもforでindexで回すことになる
これは、イテレータのほうがループが速いというのと、また別の問題
最適化ではなくて、forを利用してindexで回さないとできないことが山ほどあるんだよね
例えば、二分探索や三分探索とか
foreach(a in vec)で順繰りに回せる処理ならいいけど、
そういう処理ではできないこともあるので、
forで回す前提で考えたほうが、あとから修正する余地があるので、どうしてもforでindexで回すことになる
これは、イテレータのほうがループが速いというのと、また別の問題
250デフォルトの名無しさん
2021/08/31(火) 21:25:16.59ID:RnSwjxg3 rustのforは他言語でいうforeach(a in vec)やろ
251デフォルトの名無しさん
2021/08/31(火) 21:26:56.02ID:RnSwjxg3 そもそも二分探索を普通forで実装しないだろ
252デフォルトの名無しさん
2021/08/31(火) 21:39:55.47ID:KWeLtswn for each 的なループで書いたものを二分探索に直す時点でプログラムとしては別物になりそうなんだけど
元のコードを iter じゃなく index アクセスするコードにしておくことでこの書き換えがどれほど楽になるのかね
まあここまでくると個人の好みの話なのでお好きにどうぞとしか言えないが
元のコードを iter じゃなく index アクセスするコードにしておくことでこの書き換えがどれほど楽になるのかね
まあここまでくると個人の好みの話なのでお好きにどうぞとしか言えないが
253デフォルトの名無しさん
2021/08/31(火) 21:59:30.62ID:Gkdn/HXs Rustのfor式を理解してなかったんかーいっ!!!
254デフォルトの名無しさん
2021/08/31(火) 22:43:09.54ID:JHqwYLi1 >>250
それは違う
まず1点目
リスト対するfor文をforeachと書かずforと書く言語の方が非常に多く一般的
C++もJavaもJavaScriptもPythonもRubyもAwkもshもリストに対してfor文
次に2点目
Rustのfor文はIterator loopと明確に書かれてるようにリストや配列に対してではなくイテレータ正確にはIntoIteratorを実装するものに対して
それは違う
まず1点目
リスト対するfor文をforeachと書かずforと書く言語の方が非常に多く一般的
C++もJavaもJavaScriptもPythonもRubyもAwkもshもリストに対してfor文
次に2点目
Rustのfor文はIterator loopと明確に書かれてるようにリストや配列に対してではなくイテレータ正確にはIntoIteratorを実装するものに対して
255デフォルトの名無しさん
2021/08/31(火) 23:30:53.76ID:lNvHqkvm もうコイツどうにかしてくれwww
256デフォルトの名無しさん
2021/08/31(火) 23:44:40.84ID:Gy6+Rq7L257デフォルトの名無しさん
2021/08/31(火) 23:52:15.67ID:3ENBWRwS 調べたのにfor式を理解できんかったんかーいっ!!!
258デフォルトの名無しさん
2021/08/31(火) 23:54:52.53ID:uga9Wpe3 Rustのforで二分探索ってどうやるのか気になる
259デフォルトの名無しさん
2021/08/31(火) 23:56:09.61ID:cANa6qyq どうせ自分で二分探索なんか実装しないだろ
気にするな
標準ライブラリ使え
気にするな
標準ライブラリ使え
260デフォルトの名無しさん
2021/09/01(水) 01:38:57.54ID:iOouKnxp261デフォルトの名無しさん
2021/09/01(水) 01:59:11.36ID:p49DyIKy262デフォルトの名無しさん
2021/09/01(水) 03:29:00.40ID:MtyAaHfZ >>254
もちろんRustのforはVecや配列に適用じゃなくてイテレータに適用
だからリスト処理しかできない言語のfor/foreachよりはRustのforは適用範囲が広い
しかし
>>258
for以前に確定しているデータしかイテレータ内で使えなくて
これはforの中で算出されたデータを借用規則によりイテレータに反映させられないためで
forの中でif分岐などする形で二分探索は無理と思う
しかし
元々の>>249が言う
「forを利用してindexで回さないとできないことが山ほどある。例えば二分探索とか」も間違い
このforはC言語などのfor (index初期値; index条件判定; index更新)を指しているが
二分探索はindex更新が状況により増減変化するためfor(;;)文を使えない
無理やりにforを使っても更新項がないため最初からwhile文を使うのが正解
つまりCでもRustでも同じでforではなくwhileが使われる
もちろんRustのforはVecや配列に適用じゃなくてイテレータに適用
だからリスト処理しかできない言語のfor/foreachよりはRustのforは適用範囲が広い
しかし
>>258
for以前に確定しているデータしかイテレータ内で使えなくて
これはforの中で算出されたデータを借用規則によりイテレータに反映させられないためで
forの中でif分岐などする形で二分探索は無理と思う
しかし
元々の>>249が言う
「forを利用してindexで回さないとできないことが山ほどある。例えば二分探索とか」も間違い
このforはC言語などのfor (index初期値; index条件判定; index更新)を指しているが
二分探索はindex更新が状況により増減変化するためfor(;;)文を使えない
無理やりにforを使っても更新項がないため最初からwhile文を使うのが正解
つまりCでもRustでも同じでforではなくwhileが使われる
263デフォルトの名無しさん
2021/09/01(水) 05:05:49.84ID:W5DSGMZK こんな感じ?
fn binary_search<T>(array: &[T], target: T) -> Option<usize> where T: std::cmp::PartialOrd {
let mut left = 0;
let mut right = array.len() as i32 - 1;
while left <= right {
let mid = (left + right) / 2;
if array[mid as usize] == target {
return Some(mid as usize);
} else if array[mid as usize] < target {
left = mid + 1;
} else {
right = mid - 1;
}
}
return None;
}
Cで書いてもほぼ同じコードになるね
同じコードで任意の型に楽に対応できるRustの方が有利かな
fn binary_search<T>(array: &[T], target: T) -> Option<usize> where T: std::cmp::PartialOrd {
let mut left = 0;
let mut right = array.len() as i32 - 1;
while left <= right {
let mid = (left + right) / 2;
if array[mid as usize] == target {
return Some(mid as usize);
} else if array[mid as usize] < target {
left = mid + 1;
} else {
right = mid - 1;
}
}
return None;
}
Cで書いてもほぼ同じコードになるね
同じコードで任意の型に楽に対応できるRustの方が有利かな
264デフォルトの名無しさん
2021/09/01(水) 08:56:44.94ID:wrwogreT265デフォルトの名無しさん
2021/09/01(水) 19:34:58.07ID:8EcW0Jj4 >>249
お、249は俺だ。
言われてみれば確かに二分探索でforはないなww
while max-min > 0 とかそんな感じだった。飲んで書いてたからすまんすまん
でも、イテレータでなくてindexでやるほうが便利なことのほうが多いのは事実なのよ
動的計画法で現在の参照している配列の前後の内容を参照する時とか
お、249は俺だ。
言われてみれば確かに二分探索でforはないなww
while max-min > 0 とかそんな感じだった。飲んで書いてたからすまんすまん
でも、イテレータでなくてindexでやるほうが便利なことのほうが多いのは事実なのよ
動的計画法で現在の参照している配列の前後の内容を参照する時とか
266デフォルトの名無しさん
2021/09/01(水) 20:35:07.40ID:+RqlKI+M indexが便利なことの "方が" 多いの?
indexが便利なこと "も" 多いならわかる
indexが便利なこと "も" 多いならわかる
267デフォルトの名無しさん
2021/09/01(水) 21:13:02.22ID:8EcW0Jj4 自分は競プロでRustを使ってるけど、その範囲では圧倒的にindex
268デフォルトの名無しさん
2021/09/01(水) 21:38:57.15ID:8EcW0Jj4 うーん、こういうのはイテレータだけでもいけるね
ttps://atcoder.jp/contests/abc138/tasks/abc138_d
static mut tree_list: Vec<(i64, i64)> = Vec::new();
static mut job_list: Vec<(i64, i64)> = Vec::new();
static mut res_list: Vec<i64> = Vec::new();
fn main() {
unsafe {
input! {
edge: i64, job: i64,
tree_list0: [(i64, i64); edge-1],
job_list0: [(i64, i64); job],
}
tree_list = tree_list0;
job_list = job_list0;
res_list = vec![0_i64; edge as usize + 1];
unsafe fn calc(index: i64, count: i64) {
res_list[index as usize] += count;
for &(a, b) in &tree_list { if a == index { calc(b, count); } }
}
for &(a, b) in &job_list { calc(a, b); }
for i in 1..res_list.len() { print!("{} ", res_list[i]); }
println!();
}
}
ttps://atcoder.jp/contests/abc138/tasks/abc138_d
static mut tree_list: Vec<(i64, i64)> = Vec::new();
static mut job_list: Vec<(i64, i64)> = Vec::new();
static mut res_list: Vec<i64> = Vec::new();
fn main() {
unsafe {
input! {
edge: i64, job: i64,
tree_list0: [(i64, i64); edge-1],
job_list0: [(i64, i64); job],
}
tree_list = tree_list0;
job_list = job_list0;
res_list = vec![0_i64; edge as usize + 1];
unsafe fn calc(index: i64, count: i64) {
res_list[index as usize] += count;
for &(a, b) in &tree_list { if a == index { calc(b, count); } }
}
for &(a, b) in &job_list { calc(a, b); }
for i in 1..res_list.len() { print!("{} ", res_list[i]); }
println!();
}
}
269デフォルトの名無しさん
2021/09/02(木) 00:21:53.48ID:nqohbFGX ところで非同期ライブラリはどれが標準になるの?
270デフォルトの名無しさん
2021/09/02(木) 01:42:02.99ID:S2XiqXH4 そりゃあれでしょ
271デフォルトの名無しさん
2021/09/02(木) 11:37:50.37ID:UEpMLVw4 名前がダセェあれか
272デフォルトの名無しさん
2021/09/02(木) 14:15:51.06ID:AObLO14s お江戸
273デフォルトの名無しさん
2021/09/02(木) 14:55:26.38ID:2FuyxSW6 >>269
futuresで行ける
futuresで行ける
274デフォルトの名無しさん
2021/09/02(木) 15:18:41.35ID:l4XbE5cZ Rustは、Tiobe index で、少し前に始めて20位に入ったが、今見たら
24位に下がってる。
このランキングの信憑性にも議論の余地はあろうが。
でも、日経の調査ではプロが使っている言語のTOPは、C/C++ということなので、
その調査とも整合はしている。
他の調査でも、CとC++を合算するとTOPか、2位になる。
24位に下がってる。
このランキングの信憑性にも議論の余地はあろうが。
でも、日経の調査ではプロが使っている言語のTOPは、C/C++ということなので、
その調査とも整合はしている。
他の調査でも、CとC++を合算するとTOPか、2位になる。
275デフォルトの名無しさん
2021/09/02(木) 15:28:38.88ID:l4XbE5cZ https://www.rust-lang.org/ja/production/users
には、Rust公式サイト(?)で製品に使っている企業名が書いてあるが、
聞いたことが無い企業が多い。それはそういうものなのかもしれないが。
には、Rust公式サイト(?)で製品に使っている企業名が書いてあるが、
聞いたことが無い企業が多い。それはそういうものなのかもしれないが。
276デフォルトの名無しさん
2021/09/02(木) 17:24:27.18ID:oZlwZEWk >>254
お前の負けやでw
お前の負けやでw
277デフォルトの名無しさん
2021/09/02(木) 17:50:16.02ID:5ahReTWB >>256
そらそろ宿題できたかい?
そらそろ宿題できたかい?
278デフォルトの名無しさん
2021/09/02(木) 18:51:20.53ID:oZlwZEWk >>277
お前の負けやでw
お前の負けやでw
279デフォルトの名無しさん
2021/09/02(木) 19:10:59.17ID:2FuyxSW6 また荒らしが来てるな
ところで非同期関数を呼ぶとfuture/promiseを返すだけでそのタイミングては実行開始しない怠惰タイプのプログラミング言語はRust以外に何があります?
ところで非同期関数を呼ぶとfuture/promiseを返すだけでそのタイミングては実行開始しない怠惰タイプのプログラミング言語はRust以外に何があります?
280デフォルトの名無しさん
2021/09/02(木) 19:14:26.82ID:rwq3+G7G281デフォルトの名無しさん
2021/09/02(木) 20:17:55.99ID:cdb/p6kF >>279
イテレータも理解してないのに他スレでRustをバカ推しすんなよな
イテレータも理解してないのに他スレでRustをバカ推しすんなよな
282デフォルトの名無しさん
2021/09/02(木) 21:18:33.70ID:5ahReTWB イテレータも理解してないアホがいるのか
283デフォルトの名無しさん
2021/09/02(木) 21:26:15.36ID:+7Q9WvZy >>282
ほぅ(for)( ^ω^)・・・
ほぅ(for)( ^ω^)・・・
284デフォルトの名無しさん
2021/09/02(木) 22:29:04.14ID:2FuyxSW6 >>269
せめてfutures::io::AsyncRead,AsyncWriteトレイトあたりで中立に互換性問題なんとかしてほしい
せめてfutures::io::AsyncRead,AsyncWriteトレイトあたりで中立に互換性問題なんとかしてほしい
285デフォルトの名無しさん
2021/09/02(木) 23:41:15.18ID:Ubg4tWaQ >>268
これじゃナイーブ過ぎて通らないでしょ
これじゃナイーブ過ぎて通らないでしょ
286デフォルトの名無しさん
2021/09/03(金) 00:54:23.74ID:2xSRfF9g >>283
いちゃラブ ((っ´ω`)♡(´ω`⊂ )) すればすぐわかるのにね
いちゃラブ ((っ´ω`)♡(´ω`⊂ )) すればすぐわかるのにね
287デフォルトの名無しさん
2021/09/03(金) 13:54:25.02ID:j8ut1qUg let a = [10, 20, 130, 40];
let v = vec!a;//←これってなんでダメなんですか?
let v = vec!a;//←これってなんでダメなんですか?
288デフォルトの名無しさん
2021/09/03(金) 14:17:04.75ID:9y+1HwQb >>287
そういう構文規則(syntax)だから。
二行目は、vec! はマクロ名で、直後からはマクロの引数列が続く。
そして、その引数列は決まった形式で書く必要があり、
vec!a という形式はそれに当てはまってない。
そういう構文規則(syntax)だから。
二行目は、vec! はマクロ名で、直後からはマクロの引数列が続く。
そして、その引数列は決まった形式で書く必要があり、
vec!a という形式はそれに当てはまってない。
289デフォルトの名無しさん
2021/09/03(金) 14:20:52.38ID:12Im1YVo >>287
vec![]の[]は配列リテラルではなくて、一般的にマクロ呼び出しは[]か()か{}で引数を渡す
なので実はvec!(1)やvec!{1}も通るのだが、配列リテラルの見た目と合わせるために普通[]が使われる
vec![]の[]は配列リテラルではなくて、一般的にマクロ呼び出しは[]か()か{}で引数を渡す
なので実はvec!(1)やvec!{1}も通るのだが、配列リテラルの見た目と合わせるために普通[]が使われる
291デフォルトの名無しさん
2021/09/03(金) 15:36:22.40ID:eAcQJHwr Cのvolatileって低レイヤで多用されるにもかかわらず実装依存なんだな
処理系依存の属性値的なのと同じようなもんか
Rustはcoreの中にvolatileアクセス用のメソッドが用意されている分進んでいる
処理系依存の属性値的なのと同じようなもんか
Rustはcoreの中にvolatileアクセス用のメソッドが用意されている分進んでいる
292デフォルトの名無しさん
2021/09/03(金) 15:55:22.52ID:4g+/rgm+293デフォルトの名無しさん
2021/09/03(金) 18:49:30.86ID:XJw5Azdc 何らか単純なmacroリライトとは異なるproprocessorが必要になりそうね
cとかlisp(cより遥かにまし)みたいなエラー挟み込むだけのマクロよりかは
rustのマクロはマシよね殆ど利便性は特になくcompile前にregex雑魚ver replace導入してるだけだけど
まぁ、素直なアプローチというか何というか(´・ω・`)
cとかlisp(cより遥かにまし)みたいなエラー挟み込むだけのマクロよりかは
rustのマクロはマシよね殆ど利便性は特になくcompile前にregex雑魚ver replace導入してるだけだけど
まぁ、素直なアプローチというか何というか(´・ω・`)
294デフォルトの名無しさん
2021/09/03(金) 23:47:36.72ID:g/jq2Cau rustの勉強のため自作のbashコマンドを、rustで書き直してるんですが、
コマンド置換( $(echo ) )はどうやればいいでしょうか?
Command::new('hoge').args......は調べたのですが、コマンド置換の方法が
どうしてもわかりません。
コマンド置換( $(echo ) )はどうやればいいでしょうか?
Command::new('hoge').args......は調べたのですが、コマンド置換の方法が
どうしてもわかりません。
295デフォルトの名無しさん
2021/09/04(土) 01:53:11.04ID:HZGHSQTb >>294
Command::outputでstdout取得してきてそれをコマンド列に埋め込むとか?
Command::outputでstdout取得してきてそれをコマンド列に埋め込むとか?
296デフォルトの名無しさん
2021/09/04(土) 05:20:01.42ID:iqtSb51S インタプリタを作るのでなければ置換の必要性ある?
例えばこういうことが出来ればいいんだよね?
let s = format!("今日は{}曜日です", String::from_utf8(std::process::Command::new("date").arg("+%a").env("LANG", "ja_JP.utf8").output()?.stdout)?.trim_end());
例えばこういうことが出来ればいいんだよね?
let s = format!("今日は{}曜日です", String::from_utf8(std::process::Command::new("date").arg("+%a").env("LANG", "ja_JP.utf8").output()?.stdout)?.trim_end());
297デフォルトの名無しさん
2021/09/04(土) 09:57:53.03ID:KxfCnNFO 汚いコードだなぁ
298デフォルトの名無しさん
2021/09/04(土) 12:45:59.97ID:mADKIhQi299デフォルトの名無しさん
2021/09/04(土) 14:38:37.40ID:1i5Z4ndW >>298
Command は system 関数相当じゃなくて fork/exec だから shell は関与しないと思ってたんだけど違うの?
Command は system 関数相当じゃなくて fork/exec だから shell は関与しないと思ってたんだけど違うの?
300デフォルトの名無しさん
2021/09/04(土) 17:05:10.13ID:iqtSb51S >>297
美しいコードをご教示して下さい
美しいコードをご教示して下さい
301デフォルトの名無しさん
2021/09/04(土) 17:33:46.64ID:mADKIhQi >>299
fork/execだからとかそういう問題じゃなくて、
外部コマンド使うんだったら、それは単なるラッパーだろうと
要求する機能を満たすだけなら別にそれでも良いと思うが、
勉強のためにrustで書き直すというなら違和感がある
自作コマンドの内容にもよるけど
fork/execだからとかそういう問題じゃなくて、
外部コマンド使うんだったら、それは単なるラッパーだろうと
要求する機能を満たすだけなら別にそれでも良いと思うが、
勉強のためにrustで書き直すというなら違和感がある
自作コマンドの内容にもよるけど
302デフォルトの名無しさん
2021/09/04(土) 19:48:22.92ID:FwiYtexa303デフォルトの名無しさん
2021/09/04(土) 20:41:42.28ID:HZGHSQTb >>301
shell を作ってるんだから外部コマンド呼び出してなんぼだと思うんだが
shell を作ってるんだから外部コマンド呼び出してなんぼだと思うんだが
305デフォルトの名無しさん
2021/09/04(土) 22:09:11.34ID:HZGHSQTb >>304
自作のbashコマンドを自作の bash 互換シェルと読んでコマンド置換の仕組みを作ろうとしてるのかと思ったけど
もしかして bash スクリプトで書いたコマンドのことだったりする?
それにしたって外部コマンド含めて自作する必要はないと思うが
自作のbashコマンドを自作の bash 互換シェルと読んでコマンド置換の仕組みを作ろうとしてるのかと思ったけど
もしかして bash スクリプトで書いたコマンドのことだったりする?
それにしたって外部コマンド含めて自作する必要はないと思うが
306デフォルトの名無しさん
2021/09/04(土) 23:54:37.12ID:iqtSb51S なるほど
>>296と書くのではRustで書き直したことになっていないとはそういう意味か
これでいいのかな
use locale::Time;
use chrono::{Local, Datelike};
let s = format!("今日は{}曜日です", Time::load_user_locale().unwrap().short_day_name(Local::now().date().weekday().num_days_from_sunday() as usize));
>>296と書くのではRustで書き直したことになっていないとはそういう意味か
これでいいのかな
use locale::Time;
use chrono::{Local, Datelike};
let s = format!("今日は{}曜日です", Time::load_user_locale().unwrap().short_day_name(Local::now().date().weekday().num_days_from_sunday() as usize));
307デフォルトの名無しさん
2021/09/05(日) 01:20:41.47ID:lJqHVJAL $ foo=$(bar $(baz))
↓
let foo = bar(baz())
↓
let foo = bar(baz())
308デフォルトの名無しさん
2021/09/05(日) 14:42:42.92ID:5vCe2TIK >>294
>rustの勉強のため自作のbashコマンドを、rustで書き直し
https://github.com/uutils/coreutils/blob/master/src/uu/echo/src/echo.rs
> コマンド置換( $(echo ) )はどうやればいいでしょうか?
https://www.joshmcguigan.com/blog/build-your-own-shell-rust/
https://zenn.dev/garebare/articles/a463257c447fa9
独自shellスクリプトをbashやzshのように実行する際は標準入力を逐次読むインタラクティブシェルの
動作モードの他に第一引数のスクリプトパスを受け取り連続的に動作するようにしなければなりません。
上記のサンプルのように変数やコマンド置換を展開(子プロを作って実行結果を保持する)パーサーが
必要になります。(上の例ではリダイレクトやパイプなどしか処理していませんが)またファイル先頭の
#!/bin/shと同じようにshebangを認識するのはOSが行います。
そのほかにもifに使われるや"["もしくはtestなどは大昔はコマンドでしたが、現在は多くのシェルでは
組み込みのビルトインコマンドになっています。
また現在でもbashなどでクラッシュさせる脆弱性が発見されていますが、GNU bashの場合はパーサーは
手書きではなく、parse.yなどのyaccです
>rustの勉強のため自作のbashコマンドを、rustで書き直し
https://github.com/uutils/coreutils/blob/master/src/uu/echo/src/echo.rs
> コマンド置換( $(echo ) )はどうやればいいでしょうか?
https://www.joshmcguigan.com/blog/build-your-own-shell-rust/
https://zenn.dev/garebare/articles/a463257c447fa9
独自shellスクリプトをbashやzshのように実行する際は標準入力を逐次読むインタラクティブシェルの
動作モードの他に第一引数のスクリプトパスを受け取り連続的に動作するようにしなければなりません。
上記のサンプルのように変数やコマンド置換を展開(子プロを作って実行結果を保持する)パーサーが
必要になります。(上の例ではリダイレクトやパイプなどしか処理していませんが)またファイル先頭の
#!/bin/shと同じようにshebangを認識するのはOSが行います。
そのほかにもifに使われるや"["もしくはtestなどは大昔はコマンドでしたが、現在は多くのシェルでは
組み込みのビルトインコマンドになっています。
また現在でもbashなどでクラッシュさせる脆弱性が発見されていますが、GNU bashの場合はパーサーは
手書きではなく、parse.yなどのyaccです
309デフォルトの名無しさん
2021/09/05(日) 19:37:48.09ID:vqQF7q4/ シェル自体をRustで実装する話なん?
310デフォルトの名無しさん
2021/09/05(日) 20:23:09.21ID:qXYO1Gcj 想定外。
シェルスクリプトで書かれてる日常ツール類を、高速化&練習ついでにRust化、ってのはよくある話なので、今回もそういうことかと想定してた。
シェルスクリプトで書かれてる日常ツール類を、高速化&練習ついでにRust化、ってのはよくある話なので、今回もそういうことかと想定してた。
311デフォルトの名無しさん
2021/09/05(日) 20:31:50.21ID:Mq9n6pyZ grepの書き換えとか入門用テキストあるあるだしな俺もそれかと思ってたw
インタープリターみたいの作りたいなら単純に考えて$(.+)みたいの発見し次第rustで書かれたプログラムに書き換え
この際$(.+)の.+の部分にもrust書き換えプログラムを同様に適用のrecursiveな奴考えるな
match等でregex構文が扱いやすい分rust native interpreterみたいの造りやすそう
あとそうゆうのredosだかなんだかのrust os projectみたいのあるから見たら面白いんじゃね(´・ω・`)
インタープリターみたいの作りたいなら単純に考えて$(.+)みたいの発見し次第rustで書かれたプログラムに書き換え
この際$(.+)の.+の部分にもrust書き換えプログラムを同様に適用のrecursiveな奴考えるな
match等でregex構文が扱いやすい分rust native interpreterみたいの造りやすそう
あとそうゆうのredosだかなんだかのrust os projectみたいのあるから見たら面白いんじゃね(´・ω・`)
312デフォルトの名無しさん
2021/09/07(火) 12:42:27.81ID:O1QkM6d3 nullの可能性がある複数の参照を作りたい場合って
OptionとかRcを組み合わせるの?
縦によも横にもコードが長くなりそう
OptionとかRcを組み合わせるの?
縦によも横にもコードが長くなりそう
313デフォルトの名無しさん
2021/09/07(火) 13:22:01.93ID:J2y4//gF Option<&T> や &Option<T>でも良いかも知れないけど状況次第
可変参照にしたいなら Rc<RefCell<Option<T>>> とかになるかも
可変参照にしたいなら Rc<RefCell<Option<T>>> とかになるかも
314デフォルトの名無しさん
2021/09/07(火) 14:39:19.62ID:vfOWvkqv Rustの文化詳しくないけど、null objectは使わないの?
せっかく静的安全性にこだわっているのに、型無しのnullを使うのはこだわりが足りない気がするなぁ。
せっかく静的安全性にこだわっているのに、型無しのnullを使うのはこだわりが足りない気がするなぁ。
315デフォルトの名無しさん
2021/09/07(火) 15:00:30.72ID:gb4OeP+0 OptionがあるのにNullObjectいらなくないです?
316デフォルトの名無しさん
2021/09/07(火) 15:16:47.38ID:yn0D/zff317デフォルトの名無しさん
2021/09/07(火) 15:20:59.00ID:oZHnA/lF NullObjectは時代遅れ過ぎる
318312
2021/09/07(火) 15:36:48.61ID:O1QkM6d3319デフォルトの名無しさん
2021/09/07(火) 15:42:12.42ID:gb4OeP+0 参照をRcするような場面てあんまりないような気がする
ところでRc<RefCell<Option<T>>>は、
参照じゃなくてヒープにある(かもしれない)Tの共有になりませんか
ところでRc<RefCell<Option<T>>>は、
参照じゃなくてヒープにある(かもしれない)Tの共有になりませんか
320デフォルトの名無しさん
2021/09/07(火) 15:58:38.34ID:X4ha4H+D321デフォルトの名無しさん
2021/09/07(火) 18:22:59.95ID:J2y4//gF322デフォルトの名無しさん
2021/09/07(火) 19:09:15.95ID:/9ekKyA5323デフォルトの名無しさん
2021/09/07(火) 20:06:06.42ID:Z/GuZfd2324デフォルトの名無しさん
2021/09/07(火) 21:28:45.74ID:GNL8Ud6q325デフォルトの名無しさん
2021/09/07(火) 22:29:28.46ID:KSe0arFM 本来はOption/Result/(Either)はRust言語的な仕組みでは無く、ライブラリの作法に過ぎないが、ランタイムが
無いはずなのに、Resultなどで宣言しているところで原則として捕捉しないpanicがあるのは納得できない人は
結構いると思う。言語の構文でmatchや?など、まさにそれのサポート構文があるのに、unwrapしたらpanicで
この話は嫌がる人が結構いるけど、OptionもResultもPanicも取っ払った最小の標準ライブラリが欲しい
無いはずなのに、Resultなどで宣言しているところで原則として捕捉しないpanicがあるのは納得できない人は
結構いると思う。言語の構文でmatchや?など、まさにそれのサポート構文があるのに、unwrapしたらpanicで
この話は嫌がる人が結構いるけど、OptionもResultもPanicも取っ払った最小の標準ライブラリが欲しい
326デフォルトの名無しさん
2021/09/07(火) 22:45:10.91ID:rBwLSogt >>325
何が言いたいのか分からん
何が言いたいのか分からん
327デフォルトの名無しさん
2021/09/07(火) 23:03:38.48ID:2A/XDTjQ >>325
そこは使い分け。
エラーな時にそのままエラー吐かせても構わない場合は、main()をResult型にしてしまうし、
きちんとエラー処理する必要あるものな場合は、少なくともmain()やそれより下でmatchでResultを必ず受け止める。
そこは使い分け。
エラーな時にそのままエラー吐かせても構わない場合は、main()をResult型にしてしまうし、
きちんとエラー処理する必要あるものな場合は、少なくともmain()やそれより下でmatchでResultを必ず受け止める。
328デフォルトの名無しさん
2021/09/07(火) 23:11:59.18ID:oZHnA/lF329デフォルトの名無しさん
2021/09/07(火) 23:18:49.53ID:2A/XDTjQ あと後者の場合、unwrap()も基本的には使わない。
例外的に使うのはフィルタし終えて必ずSome(T)となっているものを剥がす時だけ。
つまりpanicはさせないので、その>>325の懸念事項は発生しない。
例外的に使うのはフィルタし終えて必ずSome(T)となっているものを剥がす時だけ。
つまりpanicはさせないので、その>>325の懸念事項は発生しない。
330デフォルトの名無しさん
2021/09/08(水) 07:19:42.43ID:yXT40j/x 素人です、質問させてください
Rustでスマホアプリやwebアプリは作れますか?
作れるとしたら
java/kotlinやswiftやjavascriptより作りやすいですか?
アプリ制作でこれらの言語よりRustは優れてますか?
Rustでスマホアプリやwebアプリは作れますか?
作れるとしたら
java/kotlinやswiftやjavascriptより作りやすいですか?
アプリ制作でこれらの言語よりRustは優れてますか?
331デフォルトの名無しさん
2021/09/08(水) 07:34:28.50ID:bql1CtjZ Rust+JavaScriptでウェブアプリとそのためのサーバーサイドは作れる
ウェブブラウザ上ではJavaScriptが必須なのでRustだけにはできない
ただしウェブブラウザ上ではJavaScriptに加えてWebAssembly(Wasm)も動いてこれはRustで書いたプログラムが動く
なのでJavaScript部分を最小限にしてRustで書いたWasmがメインというケースもないわけではない
サーバーサイドはRustだけで全て構築できる
ウェブブラウザ上ではJavaScriptが必須なのでRustだけにはできない
ただしウェブブラウザ上ではJavaScriptに加えてWebAssembly(Wasm)も動いてこれはRustで書いたプログラムが動く
なのでJavaScript部分を最小限にしてRustで書いたWasmがメインというケースもないわけではない
サーバーサイドはRustだけで全て構築できる
332デフォルトの名無しさん
2021/09/08(水) 07:48:35.45ID:yXT40j/x ありがとうございました
スマホアプリを作るならKotlinやswiftってことなんですね
大変に参考になりました。ありがとうございました。
スマホアプリを作るならKotlinやswiftってことなんですね
大変に参考になりました。ありがとうございました。
333デフォルトの名無しさん
2021/09/08(水) 08:09:19.60ID:nCYYHiA4 オマケみたいなもんやな
334デフォルトの名無しさん
2021/09/08(水) 08:14:48.98ID:bql1CtjZ >>332
そんなことはない
スマホアプリならKotlinとSwiftの2種類を無駄に覚えずともJavaScriptだけで両OS向けスマホアプリ作成が可能
もちろんスマホでもウェブアプリが動きアプリの種類によってはウェブアプリで十分なためスマホアプリを作らないケースも出ている
一方でRustで書いてAndroid上でツワモノもいるがそれはおいとくとして
Rustをこの件で使うケースはウェブブラウザで動くWasmのプログラミングする時かサーバーサイド側
あとはGoogleがAndroid OS開発にRustを使い始めた
そんなことはない
スマホアプリならKotlinとSwiftの2種類を無駄に覚えずともJavaScriptだけで両OS向けスマホアプリ作成が可能
もちろんスマホでもウェブアプリが動きアプリの種類によってはウェブアプリで十分なためスマホアプリを作らないケースも出ている
一方でRustで書いてAndroid上でツワモノもいるがそれはおいとくとして
Rustをこの件で使うケースはウェブブラウザで動くWasmのプログラミングする時かサーバーサイド側
あとはGoogleがAndroid OS開発にRustを使い始めた
335デフォルトの名無しさん
2021/09/08(水) 14:35:34.40ID:kw5H9VGz めっちゃWasm使ってるわ、使い心地としてはgoのが良いのだが
てか絶対JS書きたくない勢以外は勧められないけどな
エントリーポイントで4〜5行JS書かざるを得ないが、そこはコピペだから俺は1行も書いてない
てか絶対JS書きたくない勢以外は勧められないけどな
エントリーポイントで4〜5行JS書かざるを得ないが、そこはコピペだから俺は1行も書いてない
336デフォルトの名無しさん
2021/09/08(水) 19:04:28.13ID:beXhRlkk >>335
javascriptからwasmにディスパッチする際のオーバーヘッドってどう?
javascriptからwasmにディスパッチする際のオーバーヘッドってどう?
337デフォルトの名無しさん
2021/09/08(水) 19:45:38.33ID:tR72XlKG getopt()みたいなのでRust標準はどのクレイト?
338デフォルトの名無しさん
2021/09/08(水) 20:27:20.45ID:aH1RnViv clapだけど、それを使ったさらに便利なstructoptのほうがおすすめかも
339デフォルトの名無しさん
2021/09/08(水) 21:24:09.27ID:Ug8WkgwI clapはv3でstructoptの機能を取り込むから、今ならclapの3.0.0-beta4を使うのでもいいかも
340デフォルトの名無しさん
2021/09/08(水) 21:44:07.80ID:XbOUeFJA >>339
その後、structoptはどうなるの?
その後、structoptはどうなるの?
341デフォルトの名無しさん
2021/09/08(水) 23:46:53.75ID:tR72XlKG342デフォルトの名無しさん
2021/09/09(木) 00:04:52.59ID:fa/WJTRs マクロは見やすさだけじゃなくてコンパイル時に諸々チェックされるのが嬉しい
343デフォルトの名無しさん
2021/09/09(木) 20:16:33.24ID:Rwhy6P/q 数値の並びがある時に
その中の一番大きなものがある場所(index)が欲しいのですが
Rustではどう書くとよいでしょうか?
その中の一番大きなものがある場所(index)が欲しいのですが
Rustではどう書くとよいでしょうか?
344デフォルトの名無しさん
2021/09/09(木) 20:38:00.34ID:fa/WJTRs >>343
たとえばこう
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=c7a0d0459c540d7b373b124d7faf239a
たとえばこう
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=c7a0d0459c540d7b373b124d7faf239a
345デフォルトの名無しさん
2021/09/09(木) 21:09:46.20ID:18O2MBOf >>344
copied()っているっけ?
copied()っているっけ?
346デフォルトの名無しさん
2021/09/09(木) 21:32:28.08ID:Rwhy6P/q ありがとうございます
無しでもいけました
別の質問です
Vecにスライス(の各値のコピー)をappendしたいのですが
append()メソッドはVecしか引数に取れず困っています
どうすればいいでしょうか?
無しでもいけました
別の質問です
Vecにスライス(の各値のコピー)をappendしたいのですが
append()メソッドはVecしか引数に取れず困っています
どうすればいいでしょうか?
347デフォルトの名無しさん
2021/09/09(木) 21:36:39.36ID:dEhWYfPh ちったあググれよ
教えて君は嫌われるよ
教えて君は嫌われるよ
348デフォルトの名無しさん
2021/09/09(木) 21:55:23.66ID:aKI9+8DZ349デフォルトの名無しさん
2021/09/09(木) 22:34:44.73ID:18O2MBOf >>346
append()はその名前から想像しにくい実はムーブで引数側のVecは空になるw
じゃあappendはどうすればいいかというと
1つだけappendするpush()の複数版のpush_all()が元々あって
それは名前変更で今はextend_from_slice()になった
がその中身はより一般化したExtendトレイトのextend()を呼んでるだけになったので
結論としてはv.extend(&a)が正解
append()はその名前から想像しにくい実はムーブで引数側のVecは空になるw
じゃあappendはどうすればいいかというと
1つだけappendするpush()の複数版のpush_all()が元々あって
それは名前変更で今はextend_from_slice()になった
がその中身はより一般化したExtendトレイトのextend()を呼んでるだけになったので
結論としてはv.extend(&a)が正解
350デフォルトの名無しさん
2021/09/09(木) 23:25:03.49ID:12Nq5czF Rust 1.55.0 リリース
351デフォルトの名無しさん
2021/09/10(金) 01:12:44.66ID:t0Gbnfvj faqのような気がするんだが、以下のようなコードって
どうすればコンパイル通る?
#[derive (Copy)]
struct St{
s: String
}
fn main(){
let ar = [St{s: String::from("str")}; 10];
}
どうすればコンパイル通る?
#[derive (Copy)]
struct St{
s: String
}
fn main(){
let ar = [St{s: String::from("str")}; 10];
}
352デフォルトの名無しさん
2021/09/10(金) 01:34:46.88ID:Dnq/g++J 参照を配列に格納するか
let st = St{s: String::from("str")};
let array = [&st; 10];
Stringじゃなく&strにするか
#[derive (Debug, Clone, Copy)]
struct St{
s: &'static str
}
かな?
let st = St{s: String::from("str")};
let array = [&st; 10];
Stringじゃなく&strにするか
#[derive (Debug, Clone, Copy)]
struct St{
s: &'static str
}
かな?
353デフォルトの名無しさん
2021/09/10(金) 01:38:58.21ID:t0Gbnfvj354デフォルトの名無しさん
2021/09/10(金) 01:44:26.77ID:59f2QwjZ355デフォルトの名無しさん
2021/09/10(金) 05:44:54.18ID:XIGB6bHM もはやご希望のものかどうかはわからんが
#[derive(Clone)]
struct St{
s: String
}
fn main(){
let ar = vec![St {s: String::from("str")}; 10];
}
CopyをCloneして配列をvecにしただけ
#[derive(Clone)]
struct St{
s: String
}
fn main(){
let ar = vec![St {s: String::from("str")}; 10];
}
CopyをCloneして配列をvecにしただけ
356デフォルトの名無しさん
2021/09/10(金) 06:59:27.65ID:59f2QwjZ357デフォルトの名無しさん
2021/09/10(金) 07:55:51.69ID:tPSWyt2L358デフォルトの名無しさん
2021/09/10(金) 13:58:45.81ID:iOAXb/4V >>351
その後の用途によって7通りのやり方がある
let st = St {s: &"str"}; の場合は
let ar = [st; 10];
let ar = [&st; 10];
let ar = vec![st; 10];
let ar = vec![&st; 10]; の4通りが使い分け可能で
1番目はまとめて let ar = [St {s: &"str"}; 10];
3番目はまとめて let ar = vec![St {s: &"str"}; 10]; と省略可能
2番めと4番目が省略できない理由は参照なのに実体が変数にバインドされていないため
let st = St {s: String::from("str")}; の場合は
let ar = [st; 10]; の1番目だけは出来なくて
let ar = [&st; 10];
let ar = vec![st; 10];
let ar = vec![&st; 10]; の3通りが可能
3番目はまとめて let ar3 = vec![St {s: String::from("str")}; 10]; と省略可能
1番目が出来ない理由はヒープ上に作られるStringを暗黙的にコピーできないため
その後の用途によって7通りのやり方がある
let st = St {s: &"str"}; の場合は
let ar = [st; 10];
let ar = [&st; 10];
let ar = vec![st; 10];
let ar = vec![&st; 10]; の4通りが使い分け可能で
1番目はまとめて let ar = [St {s: &"str"}; 10];
3番目はまとめて let ar = vec![St {s: &"str"}; 10]; と省略可能
2番めと4番目が省略できない理由は参照なのに実体が変数にバインドされていないため
let st = St {s: String::from("str")}; の場合は
let ar = [st; 10]; の1番目だけは出来なくて
let ar = [&st; 10];
let ar = vec![st; 10];
let ar = vec![&st; 10]; の3通りが可能
3番目はまとめて let ar3 = vec![St {s: String::from("str")}; 10]; と省略可能
1番目が出来ない理由はヒープ上に作られるStringを暗黙的にコピーできないため
359デフォルトの名無しさん
2021/09/10(金) 15:18:43.49ID:ylBsVH1G 無駄な長文乙
360デフォルトの名無しさん
2021/09/11(土) 02:12:58.97ID:xfwty4qw 数百行程度で、Rustらしいコードの例ってありませんか?
361デフォルトの名無しさん
2021/09/11(土) 02:31:10.17ID:PFLibieQ362デフォルトの名無しさん
2021/09/11(土) 02:47:02.21ID:xfwty4qw >>361
学習のために自分で読むだけです
学習のために自分で読むだけです
363デフォルトの名無しさん
2021/09/11(土) 02:58:05.44ID:s9euJTi1 現状はどのレベル?
とりあえず入門書は読み終わったって感じ?
とりあえず入門書は読み終わったって感じ?
364デフォルトの名無しさん
2021/09/11(土) 03:10:01.40ID:w5S7rLqj365デフォルトの名無しさん
2021/09/11(土) 04:59:53.97ID:7r8uHUGr ただのコード例ってのとは違うけどこれ読み進めるとかどうだろう
https://rust-unofficial.github.io/too-many-lists/index.html
Linked Listを色々頑張るやつ
https://rust-unofficial.github.io/too-many-lists/index.html
Linked Listを色々頑張るやつ
366デフォルトの名無しさん
2021/09/11(土) 05:21:08.84ID:w5S7rLqj >>365
それはあまりにも偏った特殊ケースであることと
初心者向けではないということと
その件だとむしろ標準ライブラリとして提供されているリンクリストや双方向キューを覚えた方が実用的かなーhttps://doc.rust-lang.org/std/collections/
それはあまりにも偏った特殊ケースであることと
初心者向けではないということと
その件だとむしろ標準ライブラリとして提供されているリンクリストや双方向キューを覚えた方が実用的かなーhttps://doc.rust-lang.org/std/collections/
367デフォルトの名無しさん
2021/09/11(土) 17:59:37.96ID:iQv7wiiS >>349
なるほど
なるほど
368デフォルトの名無しさん
2021/09/11(土) 21:06:20.65ID:KPnRgCeh Rustは可読性をもう少し良くできなかったのかな
後発なのにJavaより読みにくいってのは問題だろ
後発なのにJavaより読みにくいってのは問題だろ
369デフォルトの名無しさん
2021/09/11(土) 21:16:46.98ID:PRM8i6LA >>368
どのあたりが?
どのあたりが?
370デフォルトの名無しさん
2021/09/11(土) 22:08:56.74ID:UoP9tTBS >>368
どうすれば良くなると思う?
どうすれば良くなると思う?
371デフォルトの名無しさん
2021/09/11(土) 22:10:09.25ID:HMdcT5ar >>370
専用フォントを開発
専用フォントを開発
372デフォルトの名無しさん
2021/09/11(土) 23:22:27.41ID:7r8uHUGr Javaより読みにくいとはさすがに思わんけど、
ジェネリクスが<>囲いなところとか、
そもそも中かっこ+セミコロンってのもどうなんだ、とか
Haskell並にとは言わんがもうちょっとかっこ少なくかけないのか、とか
思うところはいろいろとある
ジェネリクスが<>囲いなところとか、
そもそも中かっこ+セミコロンってのもどうなんだ、とか
Haskell並にとは言わんがもうちょっとかっこ少なくかけないのか、とか
思うところはいろいろとある
373デフォルトの名無しさん
2021/09/11(土) 23:44:46.13ID:zUj2TAiQ >>372
ジェネリクスが<>囲いなところ、ってメジャーなプログラミング言語のほとんどがそうだよね?
ジェネリクスが<>囲いなところ、ってメジャーなプログラミング言語のほとんどがそうだよね?
374デフォルトの名無しさん
2021/09/11(土) 23:48:51.34ID:7r8uHUGr >>373
その通りだけどあんまり筋がよくないことでもちらほらごく一部の界隈で話題になってるような
その通りだけどあんまり筋がよくないことでもちらほらごく一部の界隈で話題になってるような
375デフォルトの名無しさん
2021/09/12(日) 00:05:19.01ID:2NCRgpdh 変にRubyの影響受けてる部分は変えて欲しいなあ
376デフォルトの名無しさん
2021/09/12(日) 00:20:02.96ID:Q5FBinyU377デフォルトの名無しさん
2021/09/12(日) 00:39:47.78ID:qC6wZUfs それはSmalltalkじゃないの?
378デフォルトの名無しさん
2021/09/12(日) 00:49:53.96ID:Q5FBinyU https://doc.rust-lang.org/reference/influences.html
ここによるとクロージャの記法はRuby由来
ここによるとクロージャの記法はRuby由来
379デフォルトの名無しさん
2021/09/12(日) 01:31:54.94ID:q/A4LK0H クロージャの記法は各言語で様々だから大して気にならないけど
こう書きたいのに書けないのが悲しい
fn make_counter_closure(init: i32) -> impl FnMut() -> i32 {
let mut counter = init;
move || counter--
}
この件はRustやRubyだけでなくPythonやScalaやSwiftなどでも同じで
Swiftでは昔は出来たのに後から削除されたようだから最近はそういう傾向なの?
こう書きたいのに書けないのが悲しい
fn make_counter_closure(init: i32) -> impl FnMut() -> i32 {
let mut counter = init;
move || counter--
}
この件はRustやRubyだけでなくPythonやScalaやSwiftなどでも同じで
Swiftでは昔は出来たのに後から削除されたようだから最近はそういう傾向なの?
380デフォルトの名無しさん
2021/09/12(日) 01:35:25.37ID:x/LB5mED >>378
RubyのクロージャがSmalltalk由来だからどうなんだろ
RubyのクロージャがSmalltalk由来だからどうなんだろ
381デフォルトの名無しさん
2021/09/12(日) 07:25:17.64ID:+2JnoCR+382デフォルトの名無しさん
2021/09/12(日) 08:11:23.50ID:s09Gb+ph だッさw
383デフォルトの名無しさん
2021/09/12(日) 10:53:10.17ID:Q5FBinyU >>380
起源をたどればそうかもしれないけどRustが直接的に影響を受けたのはRuby
起源をたどればそうかもしれないけどRustが直接的に影響を受けたのはRuby
384デフォルトの名無しさん
2021/09/12(日) 12:43:40.70ID:7NdeG55C ベストなジェネリクスの書き方ってなんだよ
Scalaみたいなのがいいの?
Scalaみたいなのがいいの?
385デフォルトの名無しさん
2021/09/12(日) 14:11:08.78ID:aiqNVBie Scalaみたいに[]にするのもアリだけど配列がちょっとアレになるからさすがに避けたい気がする
D言語みたいに、例えば定義時には
struct(T) Foo { foo: T }
impl(T) Foo {
fn(T) new(foo: T) { Self { foo } }
}
みたいな感じにして、使用時には
let bar = Foo!i64::new(42);
って感じにするとか・・・?
実際に書いてみるとこれはこれで微妙な気もするが
D言語みたいに、例えば定義時には
struct(T) Foo { foo: T }
impl(T) Foo {
fn(T) new(foo: T) { Self { foo } }
}
みたいな感じにして、使用時には
let bar = Foo!i64::new(42);
って感じにするとか・・・?
実際に書いてみるとこれはこれで微妙な気もするが
386デフォルトの名無しさん
2021/09/12(日) 14:19:29.99ID:UrK9UNLE387デフォルトの名無しさん
2021/09/12(日) 15:54:09.04ID:aiqNVBie move || { counter-=1; counter }では???
388デフォルトの名無しさん
2021/09/12(日) 15:59:39.60ID:lBuMyCBZ >>387
それは後置デクリメントになっていない
それは後置デクリメントになっていない
389デフォルトの名無しさん
2021/09/12(日) 16:29:00.55ID:aiqNVBie 後置であるということをそもそも認識できていなかった、やっべえ
390デフォルトの名無しさん
2021/09/12(日) 16:37:25.63ID:458u6HPV まさにバグの温床となりうることが示されたな
391デフォルトの名無しさん
2021/09/12(日) 16:48:32.00ID:Q5FBinyU392デフォルトの名無しさん
2021/09/12(日) 22:21:50.69ID:s09Gb+ph >>387
見ろ!Rustがゴミのようだ!
見ろ!Rustがゴミのようだ!
393デフォルトの名無しさん
2021/09/13(月) 00:58:36.15ID:1X9d0oCW 型変数を明示しなきゃならないのは汎用プログラミング言語の欠点だよな
394デフォルトの名無しさん
2021/09/13(月) 01:54:16.68ID:+ZZ666OR 何言ってんだこのバカ
395デフォルトの名無しさん
2021/09/13(月) 11:03:41.66ID:HWJQ0k95 let mut counter = init + 1;
move || { counter -= 1; counter }
これが普通だと思うのは俺だけか?
move || { counter -= 1; counter }
これが普通だと思うのは俺だけか?
396デフォルトの名無しさん
2021/09/13(月) 16:07:27.15ID:1X9d0oCW >>395
Rubyだと普通にそういう書き方するから特に違和感はないな
Rubyだと普通にそういう書き方するから特に違和感はないな
397デフォルトの名無しさん
2021/09/14(火) 21:41:07.14ID:qEUG/jlq 配列がusizeだけなのを何とかして欲しい
i32 as usizeとかいちいち面倒
i32 as usizeとかいちいち面倒
398デフォルトの名無しさん
2021/09/14(火) 21:52:21.64ID:yDfeC3hP399デフォルトの名無しさん
2021/09/14(火) 23:13:54.76ID:/xeH/JpQ usizeだとうっかりマイナスにしちゃって死ぬことがある
デバッグビルドならぱにくって気づくけど、
テストすり抜けちゃうとやばい
デバッグビルドならぱにくって気づくけど、
テストすり抜けちゃうとやばい
400デフォルトの名無しさん
2021/09/14(火) 23:25:50.44ID:G8gCvJ5V i32は流石にどうかと思うけど
グリッドの4-隣接とか8-隣接をforで回すときに中心からの差分で表現したくて、
isizeとusizeでガチャガチャ変換したときはちょっとウザいなーとは思った
グリッドの4-隣接とか8-隣接をforで回すときに中心からの差分で表現したくて、
isizeとusizeでガチャガチャ変換したときはちょっとウザいなーとは思った
401デフォルトの名無しさん
2021/09/14(火) 23:35:48.81ID:9cp1Eg6y impl From<u16> for usize はあるのに u32 はないのが面倒
usize のサイズがプラットフォーム依存なのは分かるけど毎回 trt_from().unwap() したくない
usize のサイズがプラットフォーム依存なのは分かるけど毎回 trt_from().unwap() したくない
402デフォルトの名無しさん
2021/09/15(水) 06:35:42.54ID:21ZYJzvz Rustの難しさってある程度マスターしたあとは納得の難しさなんですか?
面倒だなー。でも(メモリ安全のためには)しょうがないか〜、みたいな
面倒だなー。でも(メモリ安全のためには)しょうがないか〜、みたいな
403デフォルトの名無しさん
2021/09/15(水) 07:06:01.76ID:WxLXvftP バカ矯正用補助輪付言語の難しさ
404デフォルトの名無しさん
2021/09/15(水) 07:55:49.68ID:nFHSO/L2 補助輪なし言語でバグなしプログラム作れたらどこに行っても採用されると思うよ
405デフォルトの名無しさん
2021/09/15(水) 08:36:21.78ID:P0HV9c3B >>401
asでいけないっけ
asでいけないっけ
406デフォルトの名無しさん
2021/09/15(水) 09:04:47.19ID:77IP/X5S407デフォルトの名無しさん
2021/09/15(水) 09:15:01.47ID:P0HV9c3B オーバーフローの懸念がある文脈ならtry_fromはしょうがないのでは
usizeがu32以上のプラットフォームだけ想定するならasでいいように思えちゃうんだけど
usizeがu32以上のプラットフォームだけ想定するならasでいいように思えちゃうんだけど
408デフォルトの名無しさん
2021/09/15(水) 09:44:19.90ID:77IP/X5S asを使うとu32から別の型に変更したときに修正漏れのリスクがあるのが気になってしまう
まあfrom相当のユーティリティ関数自分で用意すれば良いか
まあfrom相当のユーティリティ関数自分で用意すれば良いか
409デフォルトの名無しさん
2021/09/15(水) 15:12:38.68ID:6EsPXkcj >>398
じゃあunsafe時には許可して欲しい
じゃあunsafe時には許可して欲しい
410デフォルトの名無しさん
2021/09/15(水) 15:24:13.77ID:a6LjJ0wO 暗黙の型変換が増えるのはやだよ
411デフォルトの名無しさん
2021/09/15(水) 20:24:30.93ID:77IP/X5S 緩く簡単に書きたい人向けの言語じゃないよね全体的に
412デフォルトの名無しさん
2021/09/15(水) 21:01:30.58ID:AIQN4pXi それはそう
緩く簡単に書けるせいで起きていた全てのバグを撲滅したい、的な執念を感じる
緩く簡単に書けるせいで起きていた全てのバグを撲滅したい、的な執念を感じる
413デフォルトの名無しさん
2021/09/15(水) 21:30:37.23ID:rqQTOJGj IntelliJ Rust pluginの新バージョン、関数とかの補完を機械学習でやるんだってさ
すごいね
試してないけど
すごいね
試してないけど
414デフォルトの名無しさん
2021/09/16(木) 00:03:22.08ID:5v2yv6GZ 誰も見ていなければ海や川でも裸で泳ぐCちゃんと
温泉の女湯でも深夜一人で水着で入るRustちゃん
温泉の女湯でも深夜一人で水着で入るRustちゃん
415デフォルトの名無しさん
2021/09/16(木) 00:56:52.16ID:sz29YBQA エラーハンドリング可能な形ですっきりしたルールを定義できるならやればいいんだけど
現実にそういう上手い方法がないなら煩雑でも変換の手順を書くしかない。
現実にそういう上手い方法がないなら煩雑でも変換の手順を書くしかない。
416デフォルトの名無しさん
2021/09/16(木) 01:12:36.12ID:Efcezeu+ 低レイヤーいじる言語のエラー処理内容の粒度はそれこそプログラムごとに違うとしか言いようがない。
だから仕方ない。
だから仕方ない。
417デフォルトの名無しさん
2021/09/16(木) 05:10:39.16ID:7K5k42SQ418デフォルトの名無しさん
2021/09/16(木) 05:50:12.68ID:P9SoBPvJ おっきしてきた
419デフォルトの名無しさん
2021/09/16(木) 06:27:10.25ID:s4mLRLKS 椎ちゃんの方逝くわw
420デフォルトの名無しさん
2021/09/16(木) 18:55:26.69ID:cHl8Y0Er as usize祭り絶賛開催中
unsafe fn calc(a_index: isize, b_index: isize) -> isize {
if a_index == a.len() as isize { return 0; };
let mut res: isize = 0;
for i in b_index..b.len() as isize {
if a[a_index as usize] == b[b_index as usize] {
res = res.max(calc(a_index + 1, b_index + 1) + 1);
}
}
res
}
unsafe fn calc(a_index: isize, b_index: isize) -> isize {
if a_index == a.len() as isize { return 0; };
let mut res: isize = 0;
for i in b_index..b.len() as isize {
if a[a_index as usize] == b[b_index as usize] {
res = res.max(calc(a_index + 1, b_index + 1) + 1);
}
}
res
}
421デフォルトの名無しさん
2021/09/16(木) 19:34:21.47ID:vxj0ze2Y422デフォルトの名無しさん
2021/09/16(木) 19:36:15.88ID:cHl8Y0Er unsafeだしな
そして、その指摘にas usizeを擁護(容認)する意見は皆無だっていう
そして、その指摘にas usizeを擁護(容認)する意見は皆無だっていう
423デフォルトの名無しさん
2021/09/16(木) 19:38:22.07ID:cHl8Y0Er あと祭り発生中の実況だったので稼働するコードではなく、
if a[a_index as usize] == b[i as usize] {
}
と修正した
if a[a_index as usize] == b[i as usize] {
}
と修正した
424デフォルトの名無しさん
2021/09/16(木) 20:03:32.03ID:Y8GNLhYC なんでunsafeなのかもわからないしなんでusizeじゃなくてisizeを受け取るのかもわからん
425デフォルトの名無しさん
2021/09/16(木) 20:06:54.23ID:Y8GNLhYC ああ、aとbグローバル変数なんかこれ?
426デフォルトの名無しさん
2021/09/16(木) 20:47:15.02ID:cHl8Y0Er 引数がマイナスになることもあるので条件判断の必要からisizeなんだよね
もしusizeを引数にするとしても、引数に渡すところでisize as usizeになるので、やっぱりusize祭りが大発生
お祭りワッショイワッショイ
もしusizeを引数にするとしても、引数に渡すところでisize as usizeになるので、やっぱりusize祭りが大発生
お祭りワッショイワッショイ
427デフォルトの名無しさん
2021/09/16(木) 21:30:12.52ID:+FxVjnil 引数がマイナスになるならチェックしないと範囲外アクセスするだろ馬鹿か?
428デフォルトの名無しさん
2021/09/16(木) 22:25:53.04ID:XSar1IoX 今どきIndex使って回すとか化石脳かよ
429デフォルトの名無しさん
2021/09/16(木) 22:48:14.07ID:VRkuCUuZ ボロクソワロタ
430デフォルトの名無しさん
2021/09/16(木) 23:11:45.54ID:C/6oeybD431デフォルトの名無しさん
2021/09/17(金) 01:14:24.53ID:+px3FZ+H グローバル変数小文字にしたら警告出なかったっけ
432デフォルトの名無しさん
2021/09/17(金) 03:56:57.86ID:L8yNiQtv そもそもusizeで受け取って呼び出し側でケアすべきやろ
433デフォルトの名無しさん
2021/09/17(金) 13:27:45.55ID:5NPaLNkl >>412
経験的に、縛れば縛るほど最終的にはラクできるようなのを皆知ってると思う
ラクに書けるような言語は一見いいのだが
人間が生まれ持って自堕落であるのを伴って
最終的には苦しみをもたらすことになるコードを書いてしまう
経験的に、縛れば縛るほど最終的にはラクできるようなのを皆知ってると思う
ラクに書けるような言語は一見いいのだが
人間が生まれ持って自堕落であるのを伴って
最終的には苦しみをもたらすことになるコードを書いてしまう
434デフォルトの名無しさん
2021/09/17(金) 15:13:45.88ID:dr0oo8mV435デフォルトの名無しさん
2021/09/17(金) 15:20:07.79ID:0JdlCgnp 3歩あるけば忘れるからヘーキヘーキ
436デフォルトの名無しさん
2021/09/17(金) 16:32:00.60ID:5ZlSq2T+ いきなり unsafe fn とか書いてるあたり普段からrust書いるが競プロとかでついた変な癖を引きずってる人だと思う
余計悪いが
余計悪いが
437デフォルトの名無しさん
2021/09/17(金) 17:02:49.25ID:+63qaQLV >>420
これって何するコードなの?
これって何するコードなの?
438デフォルトの名無しさん
2021/09/17(金) 18:51:16.87ID:s3DmK0IG439デフォルトの名無しさん
2021/09/17(金) 20:36:20.90ID:B1Ewzio/ usize祭り絶賛発生中
while !next_pos.is_empty() {
let mut tmp_next_pos: Vec<(i32, i32)> = Vec::new();
for &(n_yr, n_xc) in &next_pos {
map[n_yr as usize][n_xc as usize] = 2;
for (a_yr, a_xc) in around(n_yr, n_xc) {
if a_yr >= 0 && a_yr < m_yr + 2 && a_xc >= 0 && a_xc < m_xc + 2 {
if map[a_yr as usize][a_xc as usize] == 0 {
map[a_yr as usize][a_xc as usize] = 2;
tmp_next_pos.push((a_yr, a_xc))
}
if map[a_yr as usize][a_xc as usize] == 1 {
total += 1;
}
}
}
}
next_pos = tmp_next_pos;
}
while !next_pos.is_empty() {
let mut tmp_next_pos: Vec<(i32, i32)> = Vec::new();
for &(n_yr, n_xc) in &next_pos {
map[n_yr as usize][n_xc as usize] = 2;
for (a_yr, a_xc) in around(n_yr, n_xc) {
if a_yr >= 0 && a_yr < m_yr + 2 && a_xc >= 0 && a_xc < m_xc + 2 {
if map[a_yr as usize][a_xc as usize] == 0 {
map[a_yr as usize][a_xc as usize] = 2;
tmp_next_pos.push((a_yr, a_xc))
}
if map[a_yr as usize][a_xc as usize] == 1 {
total += 1;
}
}
}
}
next_pos = tmp_next_pos;
}
440デフォルトの名無しさん
2021/09/17(金) 21:04:31.14ID:dr0oo8mV >>439
しつこいなw
しつこいなw
441デフォルトの名無しさん
2021/09/17(金) 21:09:35.15ID:j5AVpFMs isize ってどういう時に使います?
添字は基本的に usize しか使いませんし符号付き整数が欲しくなったらi32かi64で大体事足りるのでいまいち使い所が分かってません
添字は基本的に usize しか使いませんし符号付き整数が欲しくなったらi32かi64で大体事足りるのでいまいち使い所が分かってません
442デフォルトの名無しさん
2021/09/17(金) 21:43:47.45ID:hv2MZm4l 添え字に使う値を算出する途中計算で負数が必要になったら isize が妥当という場合もある。
443デフォルトの名無しさん
2021/09/17(金) 21:44:59.72ID:NEgFw8y9 can isize and usize be different in rust?
Can isize and usize be different? Both of them can be used for memory size, index, offset.
Since usize is used for arrays why don't we just have usize
I am new to Rust so this might be a basic question.
・usize cannot be negative and is generally used for memory addresses, positions, indices, lengths (or sizes!).
・isize can be negative, and is generally used for offsets to addresses, positions, indices, or lengths.
https://stackoverflow.com/questions/55506647/can-isize-and-usize-be-different-in-rust
意識高い系がウンコードを量産し罵倒するクソスレ
Can isize and usize be different? Both of them can be used for memory size, index, offset.
Since usize is used for arrays why don't we just have usize
I am new to Rust so this might be a basic question.
・usize cannot be negative and is generally used for memory addresses, positions, indices, lengths (or sizes!).
・isize can be negative, and is generally used for offsets to addresses, positions, indices, or lengths.
https://stackoverflow.com/questions/55506647/can-isize-and-usize-be-different-in-rust
意識高い系がウンコードを量産し罵倒するクソスレ
444デフォルトの名無しさん
2021/09/17(金) 21:45:51.61ID:B1Ewzio/ そして、その結果、as usize祭りにもなる場合もある
445デフォルトの名無しさん
2021/09/17(金) 21:51:17.48ID:2U7psvzf >>432
経験的に縛れば縛るほど脱法行為が横行する。
経験的に縛れば縛るほど脱法行為が横行する。
446デフォルトの名無しさん
2021/09/17(金) 22:20:51.81ID:so2YCyjR RustlingsをReplitで動かして学習したいのですが、これってrustlingsコマンドはどうやって動かすのですか?
https://github.com/rust-lang/rustlings
公式サイトが用意しているReplitの環境で学習をやりたいのです
よろしくお願いします
https://github.com/rust-lang/rustlings
公式サイトが用意しているReplitの環境で学習をやりたいのです
よろしくお願いします
447デフォルトの名無しさん
2021/09/17(金) 23:24:24.54ID:L8yNiQtv >>446
ReplitのRustのバージョンが古くて(1.44)ビルド失敗するっぽい
見た感じローカルでやるのとそんな変わらん気がするから、
こだわりないならローカルでやるのが吉
この環境ビルドむっちゃくちゃ遅いし
ReplitのRustのバージョンが古くて(1.44)ビルド失敗するっぽい
見た感じローカルでやるのとそんな変わらん気がするから、
こだわりないならローカルでやるのが吉
この環境ビルドむっちゃくちゃ遅いし
448デフォルトの名無しさん
2021/09/17(金) 23:26:48.18ID:qc9SKwMT449デフォルトの名無しさん
2021/09/17(金) 23:34:57.92ID:L8yNiQtv450デフォルトの名無しさん
2021/09/17(金) 23:57:58.10ID:L8yNiQtv とはいえasナントカが一部のシチュエーションでめんどくさくなることはある(主に競プロ)
let (h, w) = (100usize, 100usize); // 多くの箇所ではusizeとして扱っている
let grid = vec![vec![0; w]; h]; // 横幅w 縦幅h 左上のマスの座標(0,0)のgrid
// 省略(なんかいろいろやる)
let (x, y) = some_func(); // 着目対象となるgridのマスの位置を(usize, usize)で取得
// (x, y)の上下左右のマスを対象になにかやる
for &(dx, dy) = &[(1i32, 0i32), (-1, 0), (0, 1), (0, -1)] {
let (x2, y2) = (x as i32 + dx, y as i32 + dy);
if x2 < 0 || x2 >= w as i32 || y2 < 0 || y2 >= h as i32 {
continue; // x2,y2がgridからはみ出してたら処理飛ばす
}
let (x2, y2) = (x2 as usize, y2 as usize); // できるだけusizeで処理したいので
// 省略(x2, y2を使っていろいろやる)
}
上下左右調べたいときに負の値が出てくるのがめんどくさい
一応workaroundはあって、for以下をこうする手がある
!0が2の補数的には-1として扱えるのでオーバーフローOKな足し算をする
for &(dx, dy) = &[(1usize, 0usize), (!0, 0), (0, 1), (0, !0)] {
let (x2, y2) = (x.wrapping_add(dx), y.wrapping_add(dy));
if x2 >= w || y2 >= h {
continue; // x2,y2がgridからはみ出してたら処理飛ばす
}
// 省略(x2, y2を使っていろいろやる)
}
let (h, w) = (100usize, 100usize); // 多くの箇所ではusizeとして扱っている
let grid = vec![vec![0; w]; h]; // 横幅w 縦幅h 左上のマスの座標(0,0)のgrid
// 省略(なんかいろいろやる)
let (x, y) = some_func(); // 着目対象となるgridのマスの位置を(usize, usize)で取得
// (x, y)の上下左右のマスを対象になにかやる
for &(dx, dy) = &[(1i32, 0i32), (-1, 0), (0, 1), (0, -1)] {
let (x2, y2) = (x as i32 + dx, y as i32 + dy);
if x2 < 0 || x2 >= w as i32 || y2 < 0 || y2 >= h as i32 {
continue; // x2,y2がgridからはみ出してたら処理飛ばす
}
let (x2, y2) = (x2 as usize, y2 as usize); // できるだけusizeで処理したいので
// 省略(x2, y2を使っていろいろやる)
}
上下左右調べたいときに負の値が出てくるのがめんどくさい
一応workaroundはあって、for以下をこうする手がある
!0が2の補数的には-1として扱えるのでオーバーフローOKな足し算をする
for &(dx, dy) = &[(1usize, 0usize), (!0, 0), (0, 1), (0, !0)] {
let (x2, y2) = (x.wrapping_add(dx), y.wrapping_add(dy));
if x2 >= w || y2 >= h {
continue; // x2,y2がgridからはみ出してたら処理飛ばす
}
// 省略(x2, y2を使っていろいろやる)
}
451デフォルトの名無しさん
2021/09/18(土) 00:02:40.07ID:WtcFUHdh 競技プログラミングは
正しいプログラミングスタイルから離れていく悪です
競技プログラミングスタイルな人と一緒に開発したい人は存在しないでしょう
正しいプログラミングスタイルから離れていく悪です
競技プログラミングスタイルな人と一緒に開発したい人は存在しないでしょう
452デフォルトの名無しさん
2021/09/18(土) 00:04:38.74ID:JD4YYnZP 正当なスタイルが分かった上で競技としての割り切り方も分かっているなら問題ないんだけど、
競技から学ぶと変な癖が付きやすいというのは私も感じるなぁ。
競技から学ぶと変な癖が付きやすいというのは私も感じるなぁ。
453デフォルトの名無しさん
2021/09/18(土) 00:15:51.96ID:NeCiGTRe454デフォルトの名無しさん
2021/09/18(土) 00:21:57.18ID:NeCiGTRe455デフォルトの名無しさん
2021/09/18(土) 01:57:08.86ID:T/YDtroe type off_t = i64;(64bitOS)だからisizeを使うという発想は分かる。
でも厳密にはRustにNonZeroなどがある以上は、"本来は"実装されたfnが正常に動作する数値範囲があり
プリミティブ型で数値範囲を再定義し型定義出来ると便利だけど…、Type Aliasがあるのに無いのが辛い。
別言語の例
type Natural = range[0 .. high(int)]
type RegisteredPort = range[1024..49151, int]
type SomeSignedInt = int | int8 | int16 | int32 | int64
反対だ、コンパイルが遅くなるだけだという意見も絶対に認めない!もあるが、上記のNonZeroなどを見ると
将来的には実装されるのではなかろうか、いやヌルポインタ最適化のためのNonZeroだから入らないのでは?
という意見も分かるが…
またas演算子でキャストは安全だという話だが、符号付きから符号無しへの変換は、当然、どういう結果に
なるかを知っているべきだが、基本的な事をすっ飛ばす人も多いし、負を許容するoffsetが明確かどうかは
コードをすべて追わないと分からない場合が多い。なおこれが出来ると、コード中のキャスト変換が減るので
動作も早くなると思われるし、fnにした時の引数チェックも行わなくても良い状況が期待できる。
現実的に今のバージョンならindexもoffsetもisizeで作り、負を許容できない所にチェックを入れるだけで
as usizeは使わなくて良い箇所なら使わない。
でも厳密にはRustにNonZeroなどがある以上は、"本来は"実装されたfnが正常に動作する数値範囲があり
プリミティブ型で数値範囲を再定義し型定義出来ると便利だけど…、Type Aliasがあるのに無いのが辛い。
別言語の例
type Natural = range[0 .. high(int)]
type RegisteredPort = range[1024..49151, int]
type SomeSignedInt = int | int8 | int16 | int32 | int64
反対だ、コンパイルが遅くなるだけだという意見も絶対に認めない!もあるが、上記のNonZeroなどを見ると
将来的には実装されるのではなかろうか、いやヌルポインタ最適化のためのNonZeroだから入らないのでは?
という意見も分かるが…
またas演算子でキャストは安全だという話だが、符号付きから符号無しへの変換は、当然、どういう結果に
なるかを知っているべきだが、基本的な事をすっ飛ばす人も多いし、負を許容するoffsetが明確かどうかは
コードをすべて追わないと分からない場合が多い。なおこれが出来ると、コード中のキャスト変換が減るので
動作も早くなると思われるし、fnにした時の引数チェックも行わなくても良い状況が期待できる。
現実的に今のバージョンならindexもoffsetもisizeで作り、負を許容できない所にチェックを入れるだけで
as usizeは使わなくて良い箇所なら使わない。
456デフォルトの名無しさん
2021/09/18(土) 09:35:47.96ID:z3n3Kv/4457デフォルトの名無しさん
2021/09/18(土) 11:21:13.85ID:I+biH5jK winitのmasterでstdwebのサポートが切られてweb_sysに一本化されていた
stdwebってオワコンになりつつあるのかな?
stdwebってオワコンになりつつあるのかな?
458デフォルトの名無しさん
2021/09/18(土) 17:05:43.72ID:NeCiGTRe >>455
NonZeroはOptionとかのサイズ最適化やポインタの値がnullでないことを示すのが主目的なので
汎用的な範囲を組み込み型で示すのはちょっと違うかと
必要ならnewtypeパターンで自分で作ればよい
NonZeroはOptionとかのサイズ最適化やポインタの値がnullでないことを示すのが主目的なので
汎用的な範囲を組み込み型で示すのはちょっと違うかと
必要ならnewtypeパターンで自分で作ればよい
459デフォルトの名無しさん
2021/09/18(土) 17:29:18.29ID:1LwUu6qJ 配列がusizeなのはpythonなんかのa[-1]の最後尾アクセスを見てると、なぜそんな言語仕様にしたのかと
off_tなんかを見ると不思議に思う。いずれも Index bounds checkが掛るのに。符号無し64bitの巨大な
配列が欲しかったから?でもi128とかあるし
off_tなんかを見ると不思議に思う。いずれも Index bounds checkが掛るのに。符号無し64bitの巨大な
配列が欲しかったから?でもi128とかあるし
460デフォルトの名無しさん
2021/09/18(土) 17:47:44.01ID:2OOJm5Lf インデックスiが実行時に決まるとき
配列のアクセスを内部的には *(p + i) にしたかったからじゃないかな
マイナスのとき〜っていう分岐をそこに入れずに最速でアクセスしたかったと
配列のアクセスを内部的には *(p + i) にしたかったからじゃないかな
マイナスのとき〜っていう分岐をそこに入れずに最速でアクセスしたかったと
461デフォルトの名無しさん
2021/09/18(土) 18:02:33.71ID:z3n3Kv/4 >>459
>符号無し64bitの巨大な配列が欲しかったから?
配列にマイナスの値は使わないんだから、そのぶんMAXの数を増やしたほうが
オーバーフローしにくいから安全だろってことらしい
でもどうせi32 as usizeとかi64 as usizeするから意味ないんですけどね!
>符号無し64bitの巨大な配列が欲しかったから?
配列にマイナスの値は使わないんだから、そのぶんMAXの数を増やしたほうが
オーバーフローしにくいから安全だろってことらしい
でもどうせi32 as usizeとかi64 as usizeするから意味ないんですけどね!
462デフォルトの名無しさん
2021/09/19(日) 12:46:43.77ID:/yxUr6Cy463デフォルトの名無しさん
2021/09/19(日) 12:55:45.99ID:HwX1dH8g464デフォルトの名無しさん
2021/09/19(日) 15:08:42.28ID:i7fTqS33 競プロの書き方を仕事でするわけないだろ
何言ってるんだ
何言ってるんだ
465デフォルトの名無しさん
2021/09/19(日) 22:06:10.71ID:0p9m0gya してるバカがいるから言ってんだよバカ。
466デフォルトの名無しさん
2021/09/19(日) 22:13:07.84ID:xwERW7V5 矯正してやれ
467デフォルトの名無しさん
2021/09/19(日) 22:58:17.41ID:i7fTqS33 アホか
競プロと仕事、書いてる時間がどっちが長いと思ってる
競プロは趣味 仕事で書いてるほうが圧倒的に長い
競プロでの書き方が仕事に引きずられることがあっても逆はない
そういうヤツがいるとか嘘をついてまで、
競プロに難癖つける理由がまったく理解できんわ
競プロと仕事、書いてる時間がどっちが長いと思ってる
競プロは趣味 仕事で書いてるほうが圧倒的に長い
競プロでの書き方が仕事に引きずられることがあっても逆はない
そういうヤツがいるとか嘘をついてまで、
競プロに難癖つける理由がまったく理解できんわ
468デフォルトの名無しさん
2021/09/19(日) 23:07:40.22ID:k8GedCcQ お前が競プロスタイルで仕事するかどうかの話じゃないし、競プロに難癖つけてもいない
469デフォルトの名無しさん
2021/09/19(日) 23:52:05.14ID:2t5v/hEZ 競プロRustスレを専用に立てて分離するのがベストな解決かな。
大多数を占める普通のRustプログラミングをする人たちにとっては役に立たない、特殊な競プロのコーティング方法が書かれても、批判議論に陥りがちでお互いにメリットないと思うのです。
大多数を占める普通のRustプログラミングをする人たちにとっては役に立たない、特殊な競プロのコーティング方法が書かれても、批判議論に陥りがちでお互いにメリットないと思うのです。
470デフォルトの名無しさん
2021/09/19(日) 23:53:50.32ID:i7fTqS33 難癖つけてるだろ
> 競技プログラミングは
> 正しいプログラミングスタイルから離れていく悪です
からの流れだからな
> 競技プログラミングは
> 正しいプログラミングスタイルから離れていく悪です
からの流れだからな
471デフォルトの名無しさん
2021/09/19(日) 23:59:33.71ID:2t5v/hEZ >>470
それ自体は合ってますよ。
もちろん各々を使い分けられる人もいるでしょう。
でもそれはその人個人の内部の話。
競プロなプログラミングスタイル自体は、正しいプログラミングスタイルから乖離しています。
それ自体は合ってますよ。
もちろん各々を使い分けられる人もいるでしょう。
でもそれはその人個人の内部の話。
競プロなプログラミングスタイル自体は、正しいプログラミングスタイルから乖離しています。
472デフォルトの名無しさん
2021/09/20(月) 00:04:36.59ID:9haXUQHR なんで競プロの話になってるんですか?
usizeをasしまくるのが競プロってこと?
usizeをasしまくるのが競プロってこと?
473デフォルトの名無しさん
2021/09/20(月) 00:14:27.54ID:LELesARs >>472
グローバル変数を用いたりunsafeを闇雲に利用している点
グローバル変数を用いたりunsafeを闇雲に利用している点
474デフォルトの名無しさん
2021/09/20(月) 00:28:27.43ID:sE5U575H475デフォルトの名無しさん
2021/09/20(月) 00:32:13.16ID:zcJdfkjB 仕事でRust書けるなんていい職場だな
476デフォルトの名無しさん
2021/09/20(月) 01:04:41.94ID:eNefvRk4 闇雲にunsafeを使うどころか脳死で全部の関数unsafeにする勢いだからな
477デフォルトの名無しさん
2021/09/20(月) 01:34:24.92ID:9haXUQHR asはみるけどunsafeは競プロじゃめったにお目にかかれないような
478デフォルトの名無しさん
2021/09/20(月) 11:13:37.01ID:rFqIM+Ck これ初めて知ったんだけど
Webブラウザサイド(フロントエンド)もRustで書けるのね
html!マクロでRustソースの中にHTMLもそのまま書けて更にその中にRustコードが書けてReact.jsのJSXみたいな感じね
https://yew.rs/ja/
Yew は WebAssembly によってマルチスレッドなWebアプリのフロントエンドを作ることができる、モダンな Rust のフレームワークです。
Webブラウザサイド(フロントエンド)もRustで書けるのね
html!マクロでRustソースの中にHTMLもそのまま書けて更にその中にRustコードが書けてReact.jsのJSXみたいな感じね
https://yew.rs/ja/
Yew は WebAssembly によってマルチスレッドなWebアプリのフロントエンドを作ることができる、モダンな Rust のフレームワークです。
479デフォルトの名無しさん
2021/09/20(月) 13:47:36.24ID:DPax/7qN そこまでする?
480デフォルトの名無しさん
2021/09/20(月) 15:13:17.24ID:xK2QDi8C alert使うだけでunwrap使うwebsysは使いたくない
481デフォルトの名無しさん
2021/09/20(月) 21:41:35.24ID:EyFwfCvn unwrapはそこらじゅうのサンプルで見かけるが、Rustクックブックでは、unwrapを許可していません。
こういう事も敷居が高い理由です
こういう事も敷居が高い理由です
482デフォルトの名無しさん
2021/09/20(月) 22:06:55.37ID:LO5PkHvF crates.ioのライブラリを読んでて見つけたんですが、
traitを実装するのに、まず構造体に直接同名のメソッドをimplして、
traitの実装ではそれを呼び出すだけ、みたいな方式でやられていました
Sがstruct、Tがtraitだとしてこんな感じです
impl S {
pub fn f(&self) {...}
}
impl T for S {
pub fn f(&self) { self.f(); }
}
これってimpl T for Sのほうに直接実装するのに比べて何かメリットがあるんでしょうか?
traitを実装するのに、まず構造体に直接同名のメソッドをimplして、
traitの実装ではそれを呼び出すだけ、みたいな方式でやられていました
Sがstruct、Tがtraitだとしてこんな感じです
impl S {
pub fn f(&self) {...}
}
impl T for S {
pub fn f(&self) { self.f(); }
}
これってimpl T for Sのほうに直接実装するのに比べて何かメリットがあるんでしょうか?
483デフォルトの名無しさん
2021/09/20(月) 23:56:14.72ID:5wFYkRVK >>480
alert()って簡易テストくらいでしか使わないような
>>481
意味が不明です
>>482
例えば今適当に作った例だけど
struct S { x: i32, y: i32, }
impl S {
fn fmt(&self) -> String {
format!("({}, {})", self.x, self.y)
}
}
impl std::fmt::Display for S {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "S{}", self.fmt())
}
}
fn main() {
let s = S { x: 123, y: 456 };
println!("{}", s.fmt()); // (123, 456)
println!("{}", s); // S(123, 456)
}
alert()って簡易テストくらいでしか使わないような
>>481
意味が不明です
>>482
例えば今適当に作った例だけど
struct S { x: i32, y: i32, }
impl S {
fn fmt(&self) -> String {
format!("({}, {})", self.x, self.y)
}
}
impl std::fmt::Display for S {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "S{}", self.fmt())
}
}
fn main() {
let s = S { x: 123, y: 456 };
println!("{}", s.fmt()); // (123, 456)
println!("{}", s); // S(123, 456)
}
484デフォルトの名無しさん
2021/09/21(火) 03:25:03.00ID:kmDESzsF485デフォルトの名無しさん
2021/09/21(火) 09:21:03.28ID:asWFySWg >>483
これ見て思ったんだけど、
メソッド名と引数全く同じだった場合で、
構造体のメソッドがpubで、
トレイトのほう優先的に呼び出したい場合ってどうするの?
そもそもメソッド名被らせるなって話ではあるんだけど
これ見て思ったんだけど、
メソッド名と引数全く同じだった場合で、
構造体のメソッドがpubで、
トレイトのほう優先的に呼び出したい場合ってどうするの?
そもそもメソッド名被らせるなって話ではあるんだけど
486482
2021/09/21(火) 10:01:30.32ID:aEoN/PBD すみません、impl Sもimpl T for Sもpubは付いていませんでした……
Tがpubなので、外部にはTの実装としてのfだけが見える状態ですね
>>483
振る舞いを変えたいなら分ける意味も分かるんですけど、完全に同じなんですよね
>>484
すっきりするというのは確かに読んでて思いました
実際非公開の関数が他にもありました
結局これが最大の理由なんですかね?
>>485
こんな感じでいけますね
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=10cdbd17798b14faa5fb6619ceb0739d
Tがpubなので、外部にはTの実装としてのfだけが見える状態ですね
>>483
振る舞いを変えたいなら分ける意味も分かるんですけど、完全に同じなんですよね
>>484
すっきりするというのは確かに読んでて思いました
実際非公開の関数が他にもありました
結局これが最大の理由なんですかね?
>>485
こんな感じでいけますね
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=10cdbd17798b14faa5fb6619ceb0739d
487デフォルトの名無しさん
2021/09/21(火) 14:10:55.34ID:QKlGGi7s 気持ち悪い
488デフォルトの名無しさん
2021/09/21(火) 20:13:53.65ID:jzXJ8gRI >>473
match お前の職場にはコーディング規約がないの? {
規約でunsafeが許されている => { ならunsafe使うの自由だろ。問題があるなら規約を改正しろ }
規約でunsafeは禁止されているが使ってるヤツがいる => { ならなんでunsafeを利用してコーディングしてるヤツがいるんだよ。そいつをなんとかしろ }
}
結論 別に許可されてるなら自由だろ
それが問題だと思うなら上司にいって禁止させるのが先
match お前の職場にはコーディング規約がないの? {
規約でunsafeが許されている => { ならunsafe使うの自由だろ。問題があるなら規約を改正しろ }
規約でunsafeは禁止されているが使ってるヤツがいる => { ならなんでunsafeを利用してコーディングしてるヤツがいるんだよ。そいつをなんとかしろ }
}
結論 別に許可されてるなら自由だろ
それが問題だと思うなら上司にいって禁止させるのが先
489デフォルトの名無しさん
2021/09/21(火) 20:16:09.40ID:jzXJ8gRI おっと最後にこれが必要か
_ => { コーディング規約ぐらい決めとけ。決められてないぐらいの組織にいるなら文句いうな。諦めるか転職しろ }
_ => { コーディング規約ぐらい決めとけ。決められてないぐらいの組織にいるなら文句いうな。諦めるか転職しろ }
490デフォルトの名無しさん
2021/09/21(火) 20:37:04.07ID:KTLm+LXj キモ
491デフォルトの名無しさん
2021/09/21(火) 20:43:04.95ID:aEoN/PBD 規約で禁止されていてみんな守ってる場合にコーディング規約決めろと怒られるバグ
492デフォルトの名無しさん
2021/09/21(火) 20:53:30.60ID:jzXJ8gRI493デフォルトの名無しさん
2021/09/21(火) 20:54:04.75ID:YS0x7nOl 動かないコーディング規約を作られても困るわ
どのタイミングでもいいから自動で弾く仕組みまで作らないと
…誰かgit hookの練習で作ってみない?
どのタイミングでもいいから自動で弾く仕組みまで作らないと
…誰かgit hookの練習で作ってみない?
494デフォルトの名無しさん
2021/09/21(火) 21:04:02.40ID:j1Ojj5Hg こういうキチガイがいて邪魔だから
競プロは専用スレを立ててそこへ隔離すること
競プロは専用スレを立ててそこへ隔離すること
495デフォルトの名無しさん
2021/09/21(火) 21:09:08.77ID:asWFySWg なんで競プロの話に規約が出てくるんすか
496デフォルトの名無しさん
2021/09/21(火) 21:32:11.36ID:4JalLCnu rust書いたことない障がい者が騒いでるな
ゴミコード晒して叩かれたのが相当悔しかったのか
なら自分の腕を磨けよ
やってることが数人しかいない過疎スレを荒らすって
どうやったらそう言う思考になるわけ
ゴミコード晒して叩かれたのが相当悔しかったのか
なら自分の腕を磨けよ
やってることが数人しかいない過疎スレを荒らすって
どうやったらそう言う思考になるわけ
497デフォルトの名無しさん
2021/09/21(火) 23:20:56.90ID:qogxB4xv そら競プロの解答コードが規約破りまくりなの見れば関係はあるわな
498デフォルトの名無しさん
2021/09/22(水) 02:11:22.59ID:U1/YCban そもそもunsafeの利用の明確な基準って決められるのか?
利用を完全に禁止することはできるかもしないが、使ってOKな条件を担当者の最良が入り込む余地がないレベルで厳密に決めるのは難しそう
利用を完全に禁止することはできるかもしないが、使ってOKな条件を担当者の最良が入り込む余地がないレベルで厳密に決めるのは難しそう
499デフォルトの名無しさん
2021/09/22(水) 03:25:11.12ID:+50nKS9n >>498
例えばVecの実装にも一部unsafeが使われておりunsafeは忌避すべきものではなく有用なものであるがその使用には厳しい条件がある
@unsafeが極狭い範囲に閉じ込められており抽象化されたインターフェースによりその存在を意識せずに使えること
Aunsafeを使用することで明白にその操作の効率が良くなるもしくは低レベル操作によりその使用が避けられないこと
Bunsafeの使用部分がその関係する範囲全体の一貫性において完全に安全な操作であると確認できること
以上3点が関係者により合意確認できている場合のみunsafeの使用が認められそして上位ではその存在を気にせず安全に使うことができる
例えばVecの実装にも一部unsafeが使われておりunsafeは忌避すべきものではなく有用なものであるがその使用には厳しい条件がある
@unsafeが極狭い範囲に閉じ込められており抽象化されたインターフェースによりその存在を意識せずに使えること
Aunsafeを使用することで明白にその操作の効率が良くなるもしくは低レベル操作によりその使用が避けられないこと
Bunsafeの使用部分がその関係する範囲全体の一貫性において完全に安全な操作であると確認できること
以上3点が関係者により合意確認できている場合のみunsafeの使用が認められそして上位ではその存在を気にせず安全に使うことができる
500デフォルトの名無しさん
2021/09/22(水) 04:21:37.31ID:HMywcfFm501デフォルトの名無しさん
2021/09/22(水) 07:58:09.34ID:5QejlQFf 使わざるを得ないパターンを提示(この時点で滅多に無い事が分かる)、当てはまらない物は原則禁止
本来要らない箇所で使おうとする輩が湧いて出ないようにするのが目的
本来要らない箇所で使おうとする輩が湧いて出ないようにするのが目的
502デフォルトの名無しさん
2021/09/22(水) 10:40:17.54ID:88WbS542 ノーコメントunsafeは問答無用で禁止くらいのことはしてもいいと思う
そのくらいunsafeはやばい
そのくらいunsafeはやばい
503デフォルトの名無しさん
2021/09/22(水) 11:36:51.20ID:Gy06LVHu stdのunsafe APIに関してはそうだと思うけど
crates.ioのライブラリ群にまでそういうの持ち出されると面倒だなあ
crates.ioのライブラリ群にまでそういうの持ち出されると面倒だなあ
504デフォルトの名無しさん
2021/09/22(水) 12:19:04.62ID:U1/YCban clippyもpubなunsafe fnにはドキュメントコメントに # Safety のセクションがないとデフォルトで警告出すので
コメントつけるのは最低限やっておくべきラインだと思う
https://rust-lang.github.io/rust-clippy/master/#missing_safety_doc
コメントつけるのは最低限やっておくべきラインだと思う
https://rust-lang.github.io/rust-clippy/master/#missing_safety_doc
505デフォルトの名無しさん
2021/09/22(水) 12:31:35.55ID:aOvfflz7 競プロの人ってレギュレーション守れば何してもいいって考え方の人が多いよね。
規約次第ってのが正にそれ。
unsafe みたいに取り扱いが繊細な機能は基本使わない、使う時には議論した上で限定的に使うみたいな感じに取り扱うのがほとんどだろ。
規約で機械的には決められないと思うよ。
規約次第ってのが正にそれ。
unsafe みたいに取り扱いが繊細な機能は基本使わない、使う時には議論した上で限定的に使うみたいな感じに取り扱うのがほとんどだろ。
規約で機械的には決められないと思うよ。
506デフォルトの名無しさん
2021/09/22(水) 13:23:06.09ID:88WbS542 競プロでunsafeなんて使わないよ
グローバル変数おじさんなら知らんけど
グローバル変数おじさんなら知らんけど
507デフォルトの名無しさん
2021/09/22(水) 13:53:44.01ID:HlHaH6ql 久々にusize祭りキタ━━━━(゚∀゚)━━━━!!
unsafe fn calc(bit: i32) -> i32 {
if bit == 0 { return 0; };
if DP[bit as usize] != -1 { return DP[bit as usize]; };
let mut start_id: i32 = 0;
for i in 1..=K_NUM { if bit & 1 << i == 0 { start_id += C_NUM[i]; }; }
let mut res: i32 = i32::MAX;
for i in 1..=K_NUM as i32 {
if bit & 1 << i > 0 {
let mut end_id: i32 = start_id + C_NUM[i as usize];
let mut num: i32 = end_id - start_id - (SUM[end_id as usize][i as usize] - SUM[start_id as usize][i as usize]);
res = res.min(calc(bit ^ 1 << i) + num);
}
}
DP[bit as usize] = res;
res
}
unsafe fn calc(bit: i32) -> i32 {
if bit == 0 { return 0; };
if DP[bit as usize] != -1 { return DP[bit as usize]; };
let mut start_id: i32 = 0;
for i in 1..=K_NUM { if bit & 1 << i == 0 { start_id += C_NUM[i]; }; }
let mut res: i32 = i32::MAX;
for i in 1..=K_NUM as i32 {
if bit & 1 << i > 0 {
let mut end_id: i32 = start_id + C_NUM[i as usize];
let mut num: i32 = end_id - start_id - (SUM[end_id as usize][i as usize] - SUM[start_id as usize][i as usize]);
res = res.min(calc(bit ^ 1 << i) + num);
}
}
DP[bit as usize] = res;
res
}
508デフォルトの名無しさん
2021/09/22(水) 13:54:58.06ID:88WbS542 なんで来るんだよおじさんー
509デフォルトの名無しさん
2021/09/22(水) 13:57:46.22ID:88WbS542 Rust競プロでグローバル変数(static mut)はマジでおすすめしないぞ、ほんまに
意味わからんWAの原因になりうる
https://qiita.com/qnighy/items/46dbf8d2aff7c2531f4e
意味わからんWAの原因になりうる
https://qiita.com/qnighy/items/46dbf8d2aff7c2531f4e
510デフォルトの名無しさん
2021/09/22(水) 15:00:43.19ID:xw08ZBoX そんなに生配列使いたいならCで書けよ
511デフォルトの名無しさん
2021/09/22(水) 19:10:57.50ID:xKA5BBWf 結局規約頼りならrust使う意味は薄いわな。
512デフォルトの名無しさん
2021/09/22(水) 20:53:41.87ID:HlHaH6ql513デフォルトの名無しさん
2021/09/22(水) 23:41:24.94ID:U1/YCban >>511
1%でもダメな箇所があったら全部ダメって考える人?
1%でもダメな箇所があったら全部ダメって考える人?
514デフォルトの名無しさん
2021/09/22(水) 23:53:53.16ID:rujUi/9T 理想的な言語には無駄など一切無いのだ
515デフォルトの名無しさん
2021/09/23(木) 00:15:25.31ID:r4yNqkwu 規約になんもないからってunsafeまみれだとぶっ叩かれるぞ
そう、actix-webの作者のように
そう、actix-webの作者のように
516デフォルトの名無しさん
2021/09/23(木) 00:24:58.81ID:Pncl1K/q >>507 添削しました。お収めくださいまし。
1. 安易にグローバル変数を使うな。状態を引数で持つくらいやれ
2. 引数bitが負になるのかくらい考えろ。脳死でi32とusizeをコピペしてるだろテメー
暗黙のキャストが無い==明示的にキャストすればいい、じゃねえぞ
パッと見て汚いなら設計が汚えんだ。動的プログラミングだから汚えんじゃねえ、テメーが汚えんだ
…負数になる可能性がある場所はたったの1行じゃねえか!どうした?頭使ってる?
4. unsafe外す努力もしねえのか、どうした?5回deleteキー押せば外れるぞ?
5. 値とインデックスが混ざるような書き方、どうして怖がらない?ロボトミー手術でも受けたのか?
6. C/C++には無い機能も使わず、warningもlinterも無視して、一体どうしてrustで書いてるんだ?
勉強中とすら言えねえじゃねえか。
まさか、VBAスクリプトを.javaファイルにコピペして「動きません!javaはクソ!」とか言っちゃう伝説のコーダーなのか?
1. 安易にグローバル変数を使うな。状態を引数で持つくらいやれ
2. 引数bitが負になるのかくらい考えろ。脳死でi32とusizeをコピペしてるだろテメー
暗黙のキャストが無い==明示的にキャストすればいい、じゃねえぞ
パッと見て汚いなら設計が汚えんだ。動的プログラミングだから汚えんじゃねえ、テメーが汚えんだ
…負数になる可能性がある場所はたったの1行じゃねえか!どうした?頭使ってる?
4. unsafe外す努力もしねえのか、どうした?5回deleteキー押せば外れるぞ?
5. 値とインデックスが混ざるような書き方、どうして怖がらない?ロボトミー手術でも受けたのか?
6. C/C++には無い機能も使わず、warningもlinterも無視して、一体どうしてrustで書いてるんだ?
勉強中とすら言えねえじゃねえか。
まさか、VBAスクリプトを.javaファイルにコピペして「動きません!javaはクソ!」とか言っちゃう伝説のコーダーなのか?
517デフォルトの名無しさん
2021/09/23(木) 01:13:45.47ID:X5xfUo6W 質問です
デフォルト値を与えるトレイトDefaultについて例えば
#[derive(Default)]
struct S { a: i32, b: i32, c: i32 } の時に
let s = S::default(); と書いても同じ結果で短いのに
let s: S = Default::default(); と書くのはDefaultトレイトのdefault()だと明示するためでしょうか?
結局deriveすると
impl Default for S {
fn default() -> Self {
S { a: 0, b: 0, c: 0 }
}
} を自動的に定義してくれるという理解であっていますか?
驚いたのは
let s = S { b: 123, ..Default:default() };
とすると残りフィールドをデフォルト値展開してくれて S { a: 0, b: 123, c: 0 } が得られることでした
そこでderiveを使わずに自分で
impl Default for S {
fn default() -> Self {
S { ..Default::default() }
}
}
と手動かつ内部をDefault::default()に任せてみたところ
再帰しているとコンパイルで警告が出て実行するとコアダンプでしたw
なぜ?
デフォルト値を与えるトレイトDefaultについて例えば
#[derive(Default)]
struct S { a: i32, b: i32, c: i32 } の時に
let s = S::default(); と書いても同じ結果で短いのに
let s: S = Default::default(); と書くのはDefaultトレイトのdefault()だと明示するためでしょうか?
結局deriveすると
impl Default for S {
fn default() -> Self {
S { a: 0, b: 0, c: 0 }
}
} を自動的に定義してくれるという理解であっていますか?
驚いたのは
let s = S { b: 123, ..Default:default() };
とすると残りフィールドをデフォルト値展開してくれて S { a: 0, b: 123, c: 0 } が得られることでした
そこでderiveを使わずに自分で
impl Default for S {
fn default() -> Self {
S { ..Default::default() }
}
}
と手動かつ内部をDefault::default()に任せてみたところ
再帰しているとコンパイルで警告が出て実行するとコアダンプでしたw
なぜ?
518デフォルトの名無しさん
2021/09/23(木) 01:38:10.01ID:pkzlOfob >>517
Default::defaultはどこでも使えるから癖で使ってる人が多いんだと思う
S { b:123, ..Default::default() }は残りのフィールドを展開するというより、
S::default()の所有権を奪ってbだけ書き換えたものを返すという理解が正しい
, ..に続くのは構築しようとしているものと同じ型の値
例えばS { a: 123, ..s }のようにも書ける
, ..Default::default()と書けばSが期待される箇所なので, ..S::default()と同様になる
以上を踏まえれば最後のコアダンプの原因はS::defaultの無限再帰によるstack overflowだと容易に理解いただけよう
Default::defaultはどこでも使えるから癖で使ってる人が多いんだと思う
S { b:123, ..Default::default() }は残りのフィールドを展開するというより、
S::default()の所有権を奪ってbだけ書き換えたものを返すという理解が正しい
, ..に続くのは構築しようとしているものと同じ型の値
例えばS { a: 123, ..s }のようにも書ける
, ..Default::default()と書けばSが期待される箇所なので, ..S::default()と同様になる
以上を踏まえれば最後のコアダンプの原因はS::defaultの無限再帰によるstack overflowだと容易に理解いただけよう
519デフォルトの名無しさん
2021/09/23(木) 02:02:07.87ID:X5xfUo6W >>518
なるほど!よく考えれば
let base = S { a: 0, b: 0, c: 0 };
let s = S { b: 123, ..base }; の時と同じstruct base式の構文だったのですね
結局、以下のように自分で展開したところ(当たり前ですが)上手く行きました
impl Default for S {
fn default() -> Self {
Self {
a: Default::default(),
b: Default::default(),
c: Default::default(),
}
}
}
なるほど!よく考えれば
let base = S { a: 0, b: 0, c: 0 };
let s = S { b: 123, ..base }; の時と同じstruct base式の構文だったのですね
結局、以下のように自分で展開したところ(当たり前ですが)上手く行きました
impl Default for S {
fn default() -> Self {
Self {
a: Default::default(),
b: Default::default(),
c: Default::default(),
}
}
}
520デフォルトの名無しさん
2021/09/23(木) 07:42:33.86ID:WWdZV+h/ Defaultトレイトのdefaultと明示するため、で合ってるよ
Arc::cloneにもそのような文化がある
Arc::cloneにもそのような文化がある
521デフォルトの名無しさん
2021/09/23(木) 11:37:02.58ID:AZNHMrAu >>513
1%のダメな箇所で他の言語の文句言ってるのはrust信者の方ですけどね。
1%のダメな箇所で他の言語の文句言ってるのはrust信者の方ですけどね。
522デフォルトの名無しさん
2021/09/23(木) 13:01:19.66ID:4xQQttIg まあ、100%良いものなんてないんだし、子供達がせっかく作ったものを評価し、使ってやるというのも、年長者の優しさってものだろう。
今までどれだけ色々な言語が作られ、流行る、主流になると言われては下火になっていったことかと思えば、Rustもまたいずれ他のものにとってかわられるのが世の流れではあるだろうが、それならそれで良いじゃないか。
諸行無常
今までどれだけ色々な言語が作られ、流行る、主流になると言われては下火になっていったことかと思えば、Rustもまたいずれ他のものにとってかわられるのが世の流れではあるだろうが、それならそれで良いじゃないか。
諸行無常
523デフォルトの名無しさん
2021/09/23(木) 13:12:55.93ID:+msTnWug >>522
Rustを置き換えるにはコンパイル時点でのメモリ安全性保証を実現しないといけない
Rustは諸問題を解決してしまったので代わりの言語は数十年出てきそうにない
もし出てきたときには手続き型ではなくなってるだろう
Rustを置き換えるにはコンパイル時点でのメモリ安全性保証を実現しないといけない
Rustは諸問題を解決してしまったので代わりの言語は数十年出てきそうにない
もし出てきたときには手続き型ではなくなってるだろう
524デフォルトの名無しさん
2021/09/23(木) 15:20:08.54ID:xxtNZLaL みずほのシステムを全部Rustで
525デフォルトの名無しさん
2021/09/23(木) 15:55:02.56ID:Ru7FlOs1 >>524
ボンクラPGは排除できるから意外と良い選択かもw
ボンクラPGは排除できるから意外と良い選択かもw
526デフォルトの名無しさん
2021/09/23(木) 16:44:35.84ID:kF5NpOzj みずほはもっとマクロなレベルでの設計の問題じゃないの知らんけど
527デフォルトの名無しさん
2021/09/23(木) 17:01:36.77ID:Sp5Iyysf つかCOBOLならもともとメモリ安全性は高いだろ
528デフォルトの名無しさん
2021/09/23(木) 17:14:42.14ID:pKS1sRJG 昔の 1% は (注意を払うという対処法で) なんとかなったが現代のコード規模の 1% は深刻だという話なんだよ。
529デフォルトの名無しさん
2021/09/23(木) 17:44:30.23ID:NjDt/riq 静的チェックでその1%が埋まると思ってるのがお気楽だなと思うわ。
530デフォルトの名無しさん
2021/09/23(木) 18:01:26.98ID:j+XImBaS usize祭りコネ━━━━(゚д゚;)━━━━!!
let mut dp = vec![i32::MAX; n_list.len() + 1];
for &i in &n_list {
for j in 0..dp.len() {
if dp[j] > i {
dp[j] = i;
break;
}
}
}
let mut cnt = n - dp.iter().filter(|&x| x != &i32::MAX).count();
let mut dp = vec![i32::MAX; n_list.len() + 1];
for &i in &n_list {
for j in 0..dp.len() {
if dp[j] > i {
dp[j] = i;
break;
}
}
}
let mut cnt = n - dp.iter().filter(|&x| x != &i32::MAX).count();
531デフォルトの名無しさん
2021/09/23(木) 18:27:08.03ID:3ZM+sTU9 vscodeでセーブした時に、ifに付けちゃった括弧を外して欲しいんだけど、何をどう設定すればいいの?
532デフォルトの名無しさん
2021/09/23(木) 18:28:49.30ID:l8duufjf 処理系の勉強をかねてRustで
ttps://www.sigbus.info/compilerbook
これをやってみようと思う
序盤で二分木&再帰・・・うへー
ttps://www.sigbus.info/compilerbook
これをやってみようと思う
序盤で二分木&再帰・・・うへー
534デフォルトの名無しさん
2021/09/23(木) 19:12:11.01ID:+qAUZiId なんかこのスレ競プロの厄介な人に乗っ取られた?
クソコードを延々と貼り付けてるあたり開き直ったか
クソコードを延々と貼り付けてるあたり開き直ったか
535デフォルトの名無しさん
2021/09/23(木) 19:15:36.83ID:+msTnWug 競プロは別スレ建てて分離しましょう
競プロの件はいずれもRustを利用&学習する人々にとって役に立たない有害なものばかりでこのスレと別件ですから
競プロの件はいずれもRustを利用&学習する人々にとって役に立たない有害なものばかりでこのスレと別件ですから
536デフォルトの名無しさん
2021/09/23(木) 19:22:24.57ID:pkzlOfob 競技プログラミング総合スレ 63
https://mevius.5ch.net/test/read.cgi/tech/1627477128/
https://mevius.5ch.net/test/read.cgi/tech/1627477128/
537デフォルトの名無しさん
2021/09/23(木) 19:48:26.70ID:j+XImBaS >>535
いやRustで競プロをする人もいるじゃんね
Rustを使用している人は、仕事だけの人、競プロだけの人、仕事でも競プロで使う人、のそれぞれの合計
ということは、そこから競プロを排除するってことは、より少ない人数だけを対象にするスレを立てるってことだから、
競プロの話題を禁止したい人が、「Rust原理主義者スレ」とでもして、自分たちが別スレをたてて
原理主義者たちだけで移動するのが論理的かつ合理的ヽ(´ー`)ノ
いやRustで競プロをする人もいるじゃんね
Rustを使用している人は、仕事だけの人、競プロだけの人、仕事でも競プロで使う人、のそれぞれの合計
ということは、そこから競プロを排除するってことは、より少ない人数だけを対象にするスレを立てるってことだから、
競プロの話題を禁止したい人が、「Rust原理主義者スレ」とでもして、自分たちが別スレをたてて
原理主義者たちだけで移動するのが論理的かつ合理的ヽ(´ー`)ノ
538デフォルトの名無しさん
2021/09/23(木) 20:01:59.63ID:jGNo4sQ0 とキチガイが申しております
539デフォルトの名無しさん
2021/09/23(木) 20:06:06.82ID:pkzlOfob >>537
あなたはまず何の説明も無しにコード貼り散らかして祭りだとか言うことの目的を教えなさいよ
あなたはまず何の説明も無しにコード貼り散らかして祭りだとか言うことの目的を教えなさいよ
540デフォルトの名無しさん
2021/09/23(木) 20:19:26.28ID:O5HtXMYP ブログトップにキモい自撮り写真貼ってるやつを見てから
競プロ臭のくっさいコードはスルーすることに決めてる
競プロ臭のくっさいコードはスルーすることに決めてる
541デフォルトの名無しさん
2021/09/23(木) 20:34:50.85ID:j+XImBaS >>538-540
スレッドは知識の集合知である場所だと思うから、
B木を考えても、情報が細分化される場合には、
携わる人数(情報)が少ないほうを葉にするのが妥当だと思うけど
>>539
Rustにはメリットもあるし、デメリットもある
様々な側面から、こういうことがあり得るとか、こういうこともできるとか
そういう情報がプラスになるんじゃないかと思っている
仕事のみの人にとっては競プロの書き方は我流だと思うだろうし、
競プロでも書いている人は、別に仕事で競プロの書き方はしてないが
直感的にやりたいことができないこともあるという思いもある
そのあたりの折り合いを付けるのが正しいRustスレなんだと思うんだよね。個人的に。
だから競プロ以外の話をしたいなら、原理主義スレを立てればいいし、
競プロだけの話をしたいなら、競プロスレを立てればいい。
ただし、ここはRustのrootだと解釈している
スレッドは知識の集合知である場所だと思うから、
B木を考えても、情報が細分化される場合には、
携わる人数(情報)が少ないほうを葉にするのが妥当だと思うけど
>>539
Rustにはメリットもあるし、デメリットもある
様々な側面から、こういうことがあり得るとか、こういうこともできるとか
そういう情報がプラスになるんじゃないかと思っている
仕事のみの人にとっては競プロの書き方は我流だと思うだろうし、
競プロでも書いている人は、別に仕事で競プロの書き方はしてないが
直感的にやりたいことができないこともあるという思いもある
そのあたりの折り合いを付けるのが正しいRustスレなんだと思うんだよね。個人的に。
だから競プロ以外の話をしたいなら、原理主義スレを立てればいいし、
競プロだけの話をしたいなら、競プロスレを立てればいい。
ただし、ここはRustのrootだと解釈している
542デフォルトの名無しさん
2021/09/23(木) 21:50:54.44ID:9wzKaMiq ってことで以降は競プロ禁止
やりたい人は競プロのスレで
やりたい人は競プロのスレで
543デフォルトの名無しさん
2021/09/23(木) 22:02:49.74ID:j+XImBaS >>542
そういう強権的なやり方は嫌われると思う
そういう強権的なやり方は嫌われると思う
544デフォルトの名無しさん
2021/09/23(木) 22:22:06.57ID:WWdZV+h/ 俺はお前が嫌い
545デフォルトの名無しさん
2021/09/23(木) 22:56:16.76ID:pkzlOfob546デフォルトの名無しさん
2021/09/23(木) 23:17:56.15ID:Peq2Gbnq codeLLDBを消去しやがるからavastアンインストールしてやったわ
547デフォルトの名無しさん
2021/09/24(金) 00:59:53.09ID:HPu5FO6/ >>541 添削しました。お納めください。
1. Cをそのままコピペしただけじゃねえか
Rustの機能を試すだぁ?enumもtraitもパターンマッチも使えないのに何が検証だ馬鹿野郎
「Cコピペしたけどメリット無いね!」って後何回繰り返すんだ?
2. なんだこの察してちゃんなコードは。保育園にいるつもりか?
意図の明確なコードが1行も無いんだが?
3. お前がここにゴミを貼る妥当性が一つも無い
Rustの世界に持ってきた概念のどれも使わないで、何が検証できると思ってるんだ?
例えるなら「ひらがなしか知らない外国人が日本語の良し悪しを検証します!」っていうもんだぞ
誰がマトモに付き合うんだ?
1. Cをそのままコピペしただけじゃねえか
Rustの機能を試すだぁ?enumもtraitもパターンマッチも使えないのに何が検証だ馬鹿野郎
「Cコピペしたけどメリット無いね!」って後何回繰り返すんだ?
2. なんだこの察してちゃんなコードは。保育園にいるつもりか?
意図の明確なコードが1行も無いんだが?
3. お前がここにゴミを貼る妥当性が一つも無い
Rustの世界に持ってきた概念のどれも使わないで、何が検証できると思ってるんだ?
例えるなら「ひらがなしか知らない外国人が日本語の良し悪しを検証します!」っていうもんだぞ
誰がマトモに付き合うんだ?
548デフォルトの名無しさん
2021/09/24(金) 01:50:08.20ID:Dee2NcuI >>529
CやC++だと非安全コードはどこにでも現れる可能性があるので100%のコードを人力で確認する必要があったが
rustでは安全性に関してはunsafeな部分のみ(例えば全体の1%)を確認すれば良いという話では
静的チェックで100%なんとかしようという話はしていないと思うが
CやC++だと非安全コードはどこにでも現れる可能性があるので100%のコードを人力で確認する必要があったが
rustでは安全性に関してはunsafeな部分のみ(例えば全体の1%)を確認すれば良いという話では
静的チェックで100%なんとかしようという話はしていないと思うが
549デフォルトの名無しさん
2021/09/24(金) 02:35:54.11ID:Bn8yEU3N そうだなーと思う反面unsafeだらけのコードを目の前にしてげんなりする未来も見えるという…
550デフォルトの名無しさん
2021/09/24(金) 04:43:03.82ID:ow12Eod1 ほとんどの用途でunsafeを直接使うことは無いんじゃない?
グローバル変数はOnceCellで解決してしまったし
もし生ポ操作するとしたら新たな型を作ってその中に閉じ込める
グローバル変数はOnceCellで解決してしまったし
もし生ポ操作するとしたら新たな型を作ってその中に閉じ込める
551デフォルトの名無しさん
2021/09/24(金) 08:02:15.31ID:ljIO2QUf そういうコードが書ける事が問題だとあれほど批判してたのに
552デフォルトの名無しさん
2021/09/24(金) 08:30:26.85ID:ow12Eod1553デフォルトの名無しさん
2021/09/24(金) 10:22:26.34ID:RvXrBe+X >>551
どのレスに対するコメント?
どのレスに対するコメント?
554デフォルトの名無しさん
2021/09/24(金) 13:18:46.57ID:/gk8ByXn そもそも競プロにメモリ安全性とかいらないしC++で書いといてくださいよ
555デフォルトの名無しさん
2021/09/24(金) 14:03:53.31ID:6DqL6o69 Rustの良いところはメモリ安全だけではなかろう?
556デフォルトの名無しさん
2021/09/24(金) 19:03:51.27ID:clPGC+m8 機能性で言えば競プロに必要なものは大抵の言語が備えてるだろうし
使いやすさで言えばRustはきっちり書くことを求められてるから素早く書くのには向いてないし
それでも敢えてRustを選ぶ理由は趣味や慣れくらいなのでは
使いやすさで言えばRustはきっちり書くことを求められてるから素早く書くのには向いてないし
それでも敢えてRustを選ぶ理由は趣味や慣れくらいなのでは
557デフォルトの名無しさん
2021/09/24(金) 21:51:28.01ID:73j3AhJA releaseビルドするとTrojan:Script/Wacatac.B!mlを検出して
Windows Defenderに怒られる
--release付けないと大丈夫
誤検知かな?
Windows Defenderに怒られる
--release付けないと大丈夫
誤検知かな?
558デフォルトの名無しさん
2021/09/24(金) 22:12:48.28ID:ow12Eod1 >>553
ごめん
例えばUnsafeCellの存在はRustの借用ルールに制約されることなく自由に新たな型を設計して作る道を開いているけど
あくまでも安全な型を作るための素材であって具体的にはRefCellやOnceCellなどの様々な安全な型を提供する素材となっているように
unsafeの存在も上位レベルで安全な関数やモジュールを提供するための素材としてのみ用いるべきではないか
ということを伝えたかったのです
ごめん
例えばUnsafeCellの存在はRustの借用ルールに制約されることなく自由に新たな型を設計して作る道を開いているけど
あくまでも安全な型を作るための素材であって具体的にはRefCellやOnceCellなどの様々な安全な型を提供する素材となっているように
unsafeの存在も上位レベルで安全な関数やモジュールを提供するための素材としてのみ用いるべきではないか
ということを伝えたかったのです
559デフォルトの名無しさん
2021/09/24(金) 23:54:29.51ID:561kcuCK つまり競プロ君のunsafeの使い方はただ危ない逸脱のみであり、
安全かつ便利な何かを提供する目的のための使い方ではなく、
Rustの精神に反している、と。
したがって競プロの話は、
このRust本スレでやるべきことではなく、
ここでは禁じて別スレでやるべき、と。
安全かつ便利な何かを提供する目的のための使い方ではなく、
Rustの精神に反している、と。
したがって競プロの話は、
このRust本スレでやるべきことではなく、
ここでは禁じて別スレでやるべき、と。
560デフォルトの名無しさん
2021/09/25(土) 00:09:12.18ID:bZXyxueH >>559
競プロくんを競プロの代表扱いするのはさすがに競プロの人に失礼では
競プロくんを競プロの代表扱いするのはさすがに競プロの人に失礼では
561デフォルトの名無しさん
2021/09/25(土) 01:22:46.71ID:HzR9ZlyY Rustの精神とかそんな大層な話でもないでしょ
建設的に話せない奴に付き合う必要はないというだけ
建設的に話せない奴に付き合う必要はないというだけ
562デフォルトの名無しさん
2021/09/25(土) 03:09:21.77ID:r08K7R9X >>558
違う人が書いた事を、さも自分が書いたように返答するのはどうかと思う
違う人が書いた事を、さも自分が書いたように返答するのはどうかと思う
563デフォルトの名無しさん
2021/09/25(土) 08:30:11.81ID:0L4s8Q79564デフォルトの名無しさん
2021/09/25(土) 22:50:40.30ID:jDRrdRW5 >>559
こういう自分の意見にあわないと何でも排除したいヤツはどこにでもいるんだよなあ
こういう自分の意見にあわないと何でも排除したいヤツはどこにでもいるんだよなあ
565デフォルトの名無しさん
2021/09/26(日) 00:09:45.69ID:EgHC/Y9j Range関連での質問です
(Included(&x), Included(&y)) はx..=yと書けますが、
(Excluded(&x), Included(&y)) を似たように書く方法ってありますか?
(Included(&x), Included(&y)) はx..=yと書けますが、
(Excluded(&x), Included(&y)) を似たように書く方法ってありますか?
566デフォルトの名無しさん
2021/09/26(日) 01:40:54.44ID:v4wa9AaY567デフォルトの名無しさん
2021/09/26(日) 01:56:26.69ID:wsLZ/M6d Range はよく使うから構文糖を入れてちょっと簡単にするという判断がうまれたんだと思うんで、
それほど頻出しないパターンは明示的に書くしかしょうがないと思う。
自分のプログラムでよく使うのであればそういう関数を用意しておけというくらいの妥協になる。
それほど頻出しないパターンは明示的に書くしかしょうがないと思う。
自分のプログラムでよく使うのであればそういう関数を用意しておけというくらいの妥協になる。
568デフォルトの名無しさん
2021/09/26(日) 03:07:15.60ID:RXeC0HEE >>565
range式も魔法があるわけではなく
それぞれ対応する構造体があって各traitなどを実装してるだけなのですが
stdにあるのは以下の6種類のみですね
assert_eq!(.., std::ops::RangeFull);
assert_eq!(3.., std::ops::RangeFrom { start: 3 });
assert_eq!(..7, std::ops::RangeTo { end: 7 });
assert_eq!(..=7, std::ops::RangeToInclusive { end: 7 });
assert_eq!(3..7, std::ops::Range { start: 3, end: 7 });
assert_eq!(3..=7, std::ops::RangeInclusive::new(3, 7));
例えば開始点のあるRangeFrom・Range・RangeInclusiveはIteratorも実装
一方でその(Excluded(&x), Included(&y))形式すなわち
(Bound<T>, Bound<T>)および(Bound<&'a T>, Bound<&'a T>)型だと
実装されているのはRangeBoundsトレイトのみでIteratorトレイトなどは無いという違いがあるようです
開始がUnboundedだと意味がないからでしょう
つまりイテレータで回したい時にはこの形式では使えないので
(Excluded(x), Included(y)) は (x+1)..=y と書くしかないと思います
もちろんSkip構造体のコストを払って(x..=y).skip(1)もアリです
range式も魔法があるわけではなく
それぞれ対応する構造体があって各traitなどを実装してるだけなのですが
stdにあるのは以下の6種類のみですね
assert_eq!(.., std::ops::RangeFull);
assert_eq!(3.., std::ops::RangeFrom { start: 3 });
assert_eq!(..7, std::ops::RangeTo { end: 7 });
assert_eq!(..=7, std::ops::RangeToInclusive { end: 7 });
assert_eq!(3..7, std::ops::Range { start: 3, end: 7 });
assert_eq!(3..=7, std::ops::RangeInclusive::new(3, 7));
例えば開始点のあるRangeFrom・Range・RangeInclusiveはIteratorも実装
一方でその(Excluded(&x), Included(&y))形式すなわち
(Bound<T>, Bound<T>)および(Bound<&'a T>, Bound<&'a T>)型だと
実装されているのはRangeBoundsトレイトのみでIteratorトレイトなどは無いという違いがあるようです
開始がUnboundedだと意味がないからでしょう
つまりイテレータで回したい時にはこの形式では使えないので
(Excluded(x), Included(y)) は (x+1)..=y と書くしかないと思います
もちろんSkip構造体のコストを払って(x..=y).skip(1)もアリです
569デフォルトの名無しさん
2021/09/26(日) 03:55:02.75ID:EgHC/Y9j570デフォルトの名無しさん
2021/09/29(水) 09:06:12.26ID:W9rNFdvq 無職の人工衛星おじさん来て
571デフォルトの名無しさん
2021/09/30(木) 11:51:35.89ID:8/yMCOJS ttps://lkml.org/lkml/2021/7/7/349
完全にストップしたな。最低だよ。
完全にストップしたな。最低だよ。
572デフォルトの名無しさん
2021/09/30(木) 12:33:08.03ID:Ti8kA/OA >>571
どういう意味や?
どういう意味や?
573デフォルトの名無しさん
2021/10/01(金) 12:54:11.60ID:xF/FYN4O >>573
どういう意味や?
どういう意味や?
574デフォルトの名無しさん
2021/10/01(金) 13:00:05.87ID:EZf94GZ+ 自問自答かいな
575デフォルトの名無しさん
2021/10/01(金) 14:16:55.18ID:5hzjqknK Rust for Linuxに関しては結局それ以降進展無しということ?
576デフォルトの名無しさん
2021/10/01(金) 14:33:36.85ID:2Q9z0ScR そりゃ普段の作業はGitHub上でやって、まとまったところでパッチ投げるんだから
LKMLで日々の進捗報告なんかしたら迷惑でしかない
LKMLで日々の進捗報告なんかしたら迷惑でしかない
577デフォルトの名無しさん
2021/10/01(金) 14:40:28.89ID:5hzjqknK https://github.com/Rust-for-Linux/linux
ここかな? 全然活発だったわ
ここかな? 全然活発だったわ
578デフォルトの名無しさん
2021/10/01(金) 15:23:00.24ID:25/eRB6c いや実際のドライバーが動かないのにごねてるだけやん。。話になってないんだが。
579デフォルトの名無しさん
2021/10/01(金) 23:00:07.65ID:CSO4Qyhi as usize祭りの回避ができてきてる━━━━(゚∀゚)━━━━!!
let mut heap: BinaryHeap<Reverse<(usize, usize)>> = BinaryHeap::new();
heap.push(Reverse((0, 0)));
while let Some(Reverse((_, now))) = heap.pop() {
let mut que: VecDeque<(usize, usize)> = VecDeque::new();
que.push_back((now, 0));
while let Some((next, cnt)) = que.pop_front() {
if cnt == price[now].1 { break; };
for &i in &list[next] {
if total[i] > total[now] + price[now].0 {
total[i] = total[now] + price[now].0;
heap.push(Reverse((total[i], i)));
}
que.push_back((i, cnt + 1));
}
}
}
let mut heap: BinaryHeap<Reverse<(usize, usize)>> = BinaryHeap::new();
heap.push(Reverse((0, 0)));
while let Some(Reverse((_, now))) = heap.pop() {
let mut que: VecDeque<(usize, usize)> = VecDeque::new();
que.push_back((now, 0));
while let Some((next, cnt)) = que.pop_front() {
if cnt == price[now].1 { break; };
for &i in &list[next] {
if total[i] > total[now] + price[now].0 {
total[i] = total[now] + price[now].0;
heap.push(Reverse((total[i], i)));
}
que.push_back((i, cnt + 1));
}
}
}
580デフォルトの名無しさん
2021/10/02(土) 02:05:08.49ID:JhHEfT92 >>578
そうなんだ。誰がどこでごねてるの?
そうなんだ。誰がどこでごねてるの?
581デフォルトの名無しさん
2021/10/02(土) 07:25:57.30ID:VZaTbxB/ VSCodeか何かで、編集中のファイルを(保存する度ではなく)リアルタイムで構文チェックしてもらうことってできないの?
目が悪いもので、C#みたいに間違えたら即指摘みたいなのがすごく助かるんだけど・・・・
目が悪いもので、C#みたいに間違えたら即指摘みたいなのがすごく助かるんだけど・・・・
582デフォルトの名無しさん
2021/10/02(土) 08:17:40.16ID:KFBxuoB8 rust-analyzer入れれば若干のラグはあるけどそんな感じでやってくれると思うが
583デフォルトの名無しさん
2021/10/02(土) 08:21:40.61ID:KFBxuoB8 すまんオートセーブもつこうてたわw
584デフォルトの名無しさん
2021/10/02(土) 09:01:16.43ID:hpIN2xHl >>581
IntelliJRustにon the fly analysisあるぞ
IntelliJRustにon the fly analysisあるぞ
585デフォルトの名無しさん
2021/10/02(土) 15:27:53.04ID:4qLxMBdK 普通にVscodeでRustの拡張入れたらやってくれん?
俺が思てる構文チェックとかの支援とは違うんかな
俺が思てる構文チェックとかの支援とは違うんかな
586デフォルトの名無しさん
2021/10/02(土) 15:48:21.44ID:BIOPTGX0 vscode+rust-analyzerでオートセーブ無効でもリアルタイム構文チェックしてくれるよ
587デフォルトの名無しさん
2021/10/02(土) 17:14:40.18ID:0lneUYYy いつrust-analyzerに移行するか悩み中。
588デフォルトの名無しさん
2021/10/02(土) 17:43:54.53ID:KFBxuoB8589デフォルトの名無しさん
2021/10/02(土) 17:45:45.06ID:cWlg4bES rust-analyzerってvimでも使える?
流石にvim捨てるべきかなあ
流石にvim捨てるべきかなあ
590デフォルトの名無しさん
2021/10/02(土) 18:12:12.35ID:kCAgHltC vimでもneovimでも使えるよ
591デフォルトの名無しさん
2021/10/02(土) 21:14:54.36ID:Yx61ypoH rls から rust-analyzer の移行なんて躊躇するもんじゃないぞ。
試して合わなければすぐに戻せばいいだけだし、戻りたいと思う可能性は俺はゼロだと思う。
試して合わなければすぐに戻せばいいだけだし、戻りたいと思う可能性は俺はゼロだと思う。
592デフォルトの名無しさん
2021/10/02(土) 21:57:31.81ID:BIOPTGX0 >>588
構文チェックとrust-analyzerの検知できる型エラーは保存しなくても指摘されるはず(前者は即時、後者は少しラグがある)
rustcじゃないと検出できないものは確かに保存時しか出ないかもね
特に害あるものじゃないしauto save有効にしても良いのでは?
構文チェックとrust-analyzerの検知できる型エラーは保存しなくても指摘されるはず(前者は即時、後者は少しラグがある)
rustcじゃないと検出できないものは確かに保存時しか出ないかもね
特に害あるものじゃないしauto save有効にしても良いのでは?
593デフォルトの名無しさん
2021/10/02(土) 23:35:42.15ID:qO3WxvTl >>589
実際にビルドしてみてそのエラーメッセージをエディタに反映するという仕組み (いわゆる flycheck) は昔からあったんだが、
頻繁に実際にビルドするんじゃなくて処理系の構文解析プロセスとエディタを連携させればもっと効率的なんと違うか?という
のがマイクロソフトによって LSP (Language Server Protocol) として標準化されたという経緯がある。
エディタにとっては場当たり的なエラーメッセージの解析をせずによくなったので昔より楽になってるんだよ。
昔から flycheck をやってるようなエディタはだいたい LSP にも対応してる。
実際にビルドしてみてそのエラーメッセージをエディタに反映するという仕組み (いわゆる flycheck) は昔からあったんだが、
頻繁に実際にビルドするんじゃなくて処理系の構文解析プロセスとエディタを連携させればもっと効率的なんと違うか?という
のがマイクロソフトによって LSP (Language Server Protocol) として標準化されたという経緯がある。
エディタにとっては場当たり的なエラーメッセージの解析をせずによくなったので昔より楽になってるんだよ。
昔から flycheck をやってるようなエディタはだいたい LSP にも対応してる。
594デフォルトの名無しさん
2021/10/04(月) 23:18:59.60ID:AvMOOeeY https://thenewstack.io/linus-torvalds-on-community-rust-and-linuxs-longevity/
> “Probably next year, we’ll start seeing some first intrepid modules being written in Rust, and maybe being integrated in the mainline kernel.”
> “Probably next year, we’ll start seeing some first intrepid modules being written in Rust, and maybe being integrated in the mainline kernel.”
595デフォルトの名無しさん
2021/10/05(火) 01:50:58.24ID:lj8Vtprb 統合早いな。多言語プロジェクトでcargo面倒くさい問題はなんかやってんだろうか?
統合されたらソース読んでみよ。
統合されたらソース読んでみよ。
596デフォルトの名無しさん
2021/10/05(火) 03:19:27.62ID:jICKdFeA 言語を組み合わせる場合を含めてビルドプロセスの記述はなんだかんだで make が万能なんだよな。
クソみたいに場当たり的だけど必要だから機能を追加してきたという現実の前には
どんな美しいパラダイムも砂上の楼閣という印象だわ。
クソみたいに場当たり的だけど必要だから機能を追加してきたという現実の前には
どんな美しいパラダイムも砂上の楼閣という印象だわ。
597デフォルトの名無しさん
2021/10/05(火) 11:23:44.05ID:+tJei17t cargoが勝手にクレートダウンロードしてくれるのは便利だけどね
セキュリティ的には……どうなんかなー
セキュリティ的には……どうなんかなー
598デフォルトの名無しさん
2021/10/05(火) 11:55:21.23ID:ds6mcw9v ビルドはmakeからrustc呼ぶ形になってたはず
カーネルに関してはクレートのダウンロードなんかもしないならそれで問題ない
カーネルに関してはクレートのダウンロードなんかもしないならそれで問題ない
599デフォルトの名無しさん
2021/10/05(火) 12:47:41.98ID:ZN1Pvbj4 余計なことするツールに限ってモジュラリティ低い
600デフォルトの名無しさん
2021/10/05(火) 12:55:43.82ID:I8WE2KTE >>596
既存のものがクソだから俺が全く新しいクールな奴を作ってやるぜ!っていって新しいクソが1つ増えるのはもはや伝統芸やね
既存のものがクソだから俺が全く新しいクールな奴を作ってやるぜ!っていって新しいクソが1つ増えるのはもはや伝統芸やね
601デフォルトの名無しさん
2021/10/05(火) 15:46:57.33ID:q+7ifQX8 >>597
そのための --offline オプション
そのための --offline オプション
602デフォルトの名無しさん
2021/10/05(火) 18:59:42.65ID:EBA9Mr3p603デフォルトの名無しさん
2021/10/05(火) 20:24:54.05ID:aXfbUEx/ >>602
prolog難しいから流行らない
prolog難しいから流行らない
604デフォルトの名無しさん
2021/10/05(火) 21:06:12.38ID:ZN1Pvbj4 宣言的なものの依存がゴタゴタしたもののデバッグのしずらさを知らんのだろう。呑気なもんだ。
605デフォルトの名無しさん
2021/10/06(水) 17:08:43.54ID:XAVgSOSv rust-analyserだかに移行しようとうおもったけどemacs とは相性悪過ぎて結局rlsに戻した
analの方はcodeいれんとインストール出来んかったりとほぼvs用だなあれ(´・ω・`)
analの方はcodeいれんとインストール出来んかったりとほぼvs用だなあれ(´・ω・`)
606デフォルトの名無しさん
2021/10/06(水) 18:10:02.17ID:msHyc08D >>605
lsp-modeとの組み合わせで普通に使えるが
lsp-modeとの組み合わせで普通に使えるが
607デフォルトの名無しさん
2021/10/06(水) 19:54:44.67ID:yydNkGdJ マジかeglot使ってたからかも
何かfunction defとかの問い合わせ方法間違ってんのか知らんが常にno docみたいのがmessage表示されて使いもんにならんかった
lspってマジで全然分からんちんで小鳥の餌待ち状態で微塵も弄れないのよね俺(´・ω・`)
何かfunction defとかの問い合わせ方法間違ってんのか知らんが常にno docみたいのがmessage表示されて使いもんにならんかった
lspってマジで全然分からんちんで小鳥の餌待ち状態で微塵も弄れないのよね俺(´・ω・`)
608デフォルトの名無しさん
2021/10/06(水) 23:28:27.48ID:msHyc08D rlsもlspだよ
rlsのlsはlanguage serverのls
rlsのlsはlanguage serverのls
609デフォルトの名無しさん
2021/10/06(水) 23:40:35.33ID:ET8OV0WS610デフォルトの名無しさん
2021/10/07(木) 00:12:56.69ID:3bOhB6en あんま多くは試しでないがrust-analyzerインストールする時に入れさせられたvscodeではanal pluginで動いてたしanal自体はインストール出来てると思うんだがな
>>608
そのfuckin msの策定したlspを部分的にとか言語ごとに異なるoverrideてかimplで構成するプロジェクト群がrust-analyzerとかclangdだかとかgoplzとか
ただこれらだけじゃ意味不明のjson object返したり読み込んだりするだけのdaemonで役に立たないから
仲介者としてのeglotとかlsp-modeが必要になる
ここらまでも簡単に弄れるというか(弄れる必要があると言うのか...)がemacsの良いところ(´・ω・`)
>>608
そのfuckin msの策定したlspを部分的にとか言語ごとに異なるoverrideてかimplで構成するプロジェクト群がrust-analyzerとかclangdだかとかgoplzとか
ただこれらだけじゃ意味不明のjson object返したり読み込んだりするだけのdaemonで役に立たないから
仲介者としてのeglotとかlsp-modeが必要になる
ここらまでも簡単に弄れるというか(弄れる必要があると言うのか...)がemacsの良いところ(´・ω・`)
611デフォルトの名無しさん
2021/10/07(木) 06:40:58.97ID:F5HUOmxy anal plug?
612デフォルトの名無しさん
2021/10/07(木) 11:35:48.71ID:DOEkOZlT インストールもなにも実行ファイルのパス通すだけだからね
~/.vscode/ 配下にあるはずだからそれを使うか GitHub からダウンロードしてくれば良い
~/.vscode/ 配下にあるはずだからそれを使うか GitHub からダウンロードしてくれば良い
613デフォルトの名無しさん
2021/10/08(金) 22:14:06.47ID:XK73QT2t べき剰余をオーバーフローさせずに作る関数を作ったヽ(´ー`)ノ
fn calc(num: usize, pow: usize, m: usize) -> usize {
let mut bit: usize = 1;
let mut res: usize = 1;
let mut tmp_pow: usize = num;
while pow >= bit {
if pow & bit > 0 {
res = (res * tmp_pow) % m;
}
bit = bit << 1;
tmp_pow = (tmp_pow * tmp_pow) % m;
}
res
}
fn calc(num: usize, pow: usize, m: usize) -> usize {
let mut bit: usize = 1;
let mut res: usize = 1;
let mut tmp_pow: usize = num;
while pow >= bit {
if pow & bit > 0 {
res = (res * tmp_pow) % m;
}
bit = bit << 1;
tmp_pow = (tmp_pow * tmp_pow) % m;
}
res
}
614デフォルトの名無しさん
2021/10/09(土) 10:18:30.30ID:0okuLqNl615デフォルトの名無しさん
2021/10/09(土) 11:49:04.73ID:zLg6zd/V 多分競プロのやつだから各数値は32bitなんだろう
そらオーバーフローしねえよって話
そらオーバーフローしねえよって話
616デフォルトの名無しさん
2021/10/10(日) 09:49:29.12ID:bzbLkL2i 都合のいい仮定置いてそうなのがらしい感じだわな
617デフォルトの名無しさん
2021/10/10(日) 11:17:36.59ID:2mgB061S ↓これと同じアルゴリズムなのに>>613のは読みにくいね
https://ja.wikipedia.org/wiki/冪剰余#途中で剰余をとる
u64で受け取って内部ではu128で計算して
u64で返すようにしとけばオーバーフローしない
https://ja.wikipedia.org/wiki/冪剰余#途中で剰余をとる
u64で受け取って内部ではu128で計算して
u64で返すようにしとけばオーバーフローしない
618デフォルトの名無しさん
2021/10/10(日) 11:36:29.13ID:2mgB061S u16ならu32、u32ならu64、u64ならu128みたいな関係をジェネリクスで表現できたりする?
619デフォルトの名無しさん
2021/10/10(日) 11:52:04.33ID:a5kt/zmp trait作ってassociated typeで表現するのはできるかな
620デフォルトの名無しさん
2021/10/10(日) 12:00:59.32ID:ZuTCKPOD 関連型使えよ
621デフォルトの名無しさん
2021/10/10(日) 12:15:12.30ID:2mgB061S Traitを各データ型に対して全部実装するのが面倒だから
対応する倍のサイズの型を表現する方法はないのかなって話だったんだけど
なさそうってことだね
対応する倍のサイズの型を表現する方法はないのかなって話だったんだけど
なさそうってことだね
622デフォルトの名無しさん
2021/10/10(日) 16:41:29.53ID:X3SL3SyY コンパイラを単純化(高速化)するためにプリミティブ型の型クラスはありません。例えば、Haskellに
あるような数値型全般を表す Num という型クラスは、数値型全般を表しますが実体は IntやDoubleなど。
またはtypescriptのtype Tree = Leaf | Nodeはサポートされません
あるような数値型全般を表す Num という型クラスは、数値型全般を表しますが実体は IntやDoubleなど。
またはtypescriptのtype Tree = Leaf | Nodeはサポートされません
623デフォルトの名無しさん
2021/10/10(日) 17:11:17.77ID:X3SL3SyY rustはどちらかと言えばほとんどをトレイトで表現しますが、技術的にはこれらは、Tagged unionと呼ばれ
昔はSum typeともバリアント型とも呼ばれていました。プリミティブ型ではありませんが、似た機能を実現
する技術はenum variantsでも表現できます。C20にあるstd:variantもTagged unionです
もちろんassociatedでも似たことは出来るでしょう
https://en.wikipedia.org/wiki/Tagged_union
昔はSum typeともバリアント型とも呼ばれていました。プリミティブ型ではありませんが、似た機能を実現
する技術はenum variantsでも表現できます。C20にあるstd:variantもTagged unionです
もちろんassociatedでも似たことは出来るでしょう
https://en.wikipedia.org/wiki/Tagged_union
624デフォルトの名無しさん
2021/10/10(日) 17:13:00.50ID:2mgB061S >>622
num-traitsとenum
num-traitsとenum
625デフォルトの名無しさん
2021/10/10(日) 19:43:56.21ID:a5kt/zmp >>621
マクロの使いどころ
マクロの使いどころ
626デフォルトの名無しさん
2021/10/10(日) 19:46:17.72ID:a5kt/zmp >>622-623 の言ってることが何一つわからんのだが
627デフォルトの名無しさん
2021/10/10(日) 19:56:58.54ID:XwgBItsn >>622
おっしゃる通りですがRustでは別の解決方法を取っていますね
まず前者の全般的なNum型がない件ですが
Rustでは単純な例だと以下のように1を足す関数add1ををジェネリックに書こうとすると
(注釈: 足し算の「+」はstd::ops::Add traitを満たせば使えて任意の型でオーバーロード可)
fn add1<T: std::ops::Add<Output=T>>(n: T) -> T {
n + 1
}
これはコンパイラが通らなくて「1」を型Iにする必要があり「1::<T>」等とでも書ければいいのですが無理です
そこでnum craitのOne traitを使って以下のように書きます
fn add1<T: std::ops::Add<Output=T> + num::One>(n: T) -> T {
n + num::one::<T>()
}
これで以下のようにジェネリックに1を足すことができました
assert_eq!(add1(36), 37);
assert_eq!(add1(5.0), 6.0);
assert_eq!(add1(1000i128), 1001i128);
さらにこの方式ならば自分で定義する構造体など任意の型もAddとOneのtraitを満たせばadd1()を使える利点があります
つまり最初の話に戻ると全般的なNum型があるよりももっと高度なことができるわけです
後者の件は一般的に代数データ型の直和をどう扱うかという話になりますが
Rustではenumがタグ付き共用体でもあるのでenumでサポートできますね
おっしゃる通りですがRustでは別の解決方法を取っていますね
まず前者の全般的なNum型がない件ですが
Rustでは単純な例だと以下のように1を足す関数add1ををジェネリックに書こうとすると
(注釈: 足し算の「+」はstd::ops::Add traitを満たせば使えて任意の型でオーバーロード可)
fn add1<T: std::ops::Add<Output=T>>(n: T) -> T {
n + 1
}
これはコンパイラが通らなくて「1」を型Iにする必要があり「1::<T>」等とでも書ければいいのですが無理です
そこでnum craitのOne traitを使って以下のように書きます
fn add1<T: std::ops::Add<Output=T> + num::One>(n: T) -> T {
n + num::one::<T>()
}
これで以下のようにジェネリックに1を足すことができました
assert_eq!(add1(36), 37);
assert_eq!(add1(5.0), 6.0);
assert_eq!(add1(1000i128), 1001i128);
さらにこの方式ならば自分で定義する構造体など任意の型もAddとOneのtraitを満たせばadd1()を使える利点があります
つまり最初の話に戻ると全般的なNum型があるよりももっと高度なことができるわけです
後者の件は一般的に代数データ型の直和をどう扱うかという話になりますが
Rustではenumがタグ付き共用体でもあるのでenumでサポートできますね
628デフォルトの名無しさん
2021/10/10(日) 19:58:36.14ID:S81FmWQC >>617
rustは可変参照を基本的に好まないスタイルだから、ああなるのは仕方ないな
rustは可変参照を基本的に好まないスタイルだから、ああなるのは仕方ないな
629デフォルトの名無しさん
2021/10/10(日) 21:20:06.28ID:Dxd5NlvW 他人のフリして自分のレスに返信してるやつなんなのwww
630デフォルトの名無しさん
2021/10/10(日) 21:23:34.82ID:XwgBItsn >>628
可変参照は関係あるのかな?
どちらもbit処理を下から順にするアルゴリズムで変わりなく
>>613はbitマスクを大きく(左シフト)していく方法
>>617はbitマスクは常に1で本体を小さく(右シフト)していく方法の違いだけだよね
だから後者の方式でもRustでコーディングできて動くよね
両者の差分
fn calc(num: usize, pow: usize, m: usize) -> usize {
- let mut bit: usize = 1;
+ let mut bit: usize = pow;
let mut res: usize = 1;
let mut tmp_pow: usize = num;
- while pow >= bit {
- if pow & bit > 0 {
+ while bit > 0 {
+ if bit & 1 > 0 {
res = (res * tmp_pow) % m;
}
- bit = bit << 1;
+ bit = bit >> 1;
tmp_pow = (tmp_pow * tmp_pow) % m;
}
res
}
可変参照は関係あるのかな?
どちらもbit処理を下から順にするアルゴリズムで変わりなく
>>613はbitマスクを大きく(左シフト)していく方法
>>617はbitマスクは常に1で本体を小さく(右シフト)していく方法の違いだけだよね
だから後者の方式でもRustでコーディングできて動くよね
両者の差分
fn calc(num: usize, pow: usize, m: usize) -> usize {
- let mut bit: usize = 1;
+ let mut bit: usize = pow;
let mut res: usize = 1;
let mut tmp_pow: usize = num;
- while pow >= bit {
- if pow & bit > 0 {
+ while bit > 0 {
+ if bit & 1 > 0 {
res = (res * tmp_pow) % m;
}
- bit = bit << 1;
+ bit = bit >> 1;
tmp_pow = (tmp_pow * tmp_pow) % m;
}
res
}
631デフォルトの名無しさん
2021/10/11(月) 00:12:55.43ID:EeZezr6D632デフォルトの名無しさん
2021/10/11(月) 00:34:40.68ID:JbC5nNmw633デフォルトの名無しさん
2021/10/11(月) 06:54:36.68ID:95tWd+L1 mutをつけたベクター型について教えてください
これはまず、入っているのは参照なんですか?
また、参照が変わらない(?)のに、参照先を変更するにはmutがなぜ必要になってくるのですか?
(所有権概念のせいなのでしょうか?それともスマートポインタの仕組み上、参照するアドレスが変わるのでしょうか?)
これはまず、入っているのは参照なんですか?
また、参照が変わらない(?)のに、参照先を変更するにはmutがなぜ必要になってくるのですか?
(所有権概念のせいなのでしょうか?それともスマートポインタの仕組み上、参照するアドレスが変わるのでしょうか?)
634デフォルトの名無しさん
2021/10/11(月) 08:28:39.20ID:LNZ+tGdJ >>633
let mut x = vec![1,2,3];
xに入ってるのはVec<i32>、これはスマートポインタ(pointer, capacity, length)。
「参照」というのはRustでは&Vec<i32>のようにアンパサンドがついてる型のこと
なのでxに入ってるのは参照ではない
例えばx.push(10)するのにxがmutじゃなきゃいけないのは
直接的にはpushのシグニチャが&mut selfを要求してるからだけど
考え方としては「multiple readers or single writer」ルールをコンパイル時に強制するため
連続したバッファを確保できなければアドレスが変わる可能性も有るし
ゼロキャパシティなら具体的なアドレスを持ってない
let mut x = vec![1,2,3];
xに入ってるのはVec<i32>、これはスマートポインタ(pointer, capacity, length)。
「参照」というのはRustでは&Vec<i32>のようにアンパサンドがついてる型のこと
なのでxに入ってるのは参照ではない
例えばx.push(10)するのにxがmutじゃなきゃいけないのは
直接的にはpushのシグニチャが&mut selfを要求してるからだけど
考え方としては「multiple readers or single writer」ルールをコンパイル時に強制するため
連続したバッファを確保できなければアドレスが変わる可能性も有るし
ゼロキャパシティなら具体的なアドレスを持ってない
635デフォルトの名無しさん
2021/10/11(月) 13:32:30.30ID:15cV1HfU Cortex-M対応がClangよりRustの方が進んでいて草
636デフォルトの名無しさん
2021/10/11(月) 14:07:37.59ID:lgurMcJY core::ptr::unique::Uniqueもalloc::raw_vecもただのdoc(hidden)なのに
Vecがスマートポインタってデタラメ広めてる奴らどこが出処だよ。
以下の関係で、
Vec has-a RawVec
RawVec has-a Unique
- Vecがrustの作法を強制するためのnewtypeパターン←composition
- RawVecが動的配列の低レベルapi←composition
- Uniqueがユニークポインタ←smart pointer
これだけだろ。
rustのコレクションはデータ構造上直接実装することになる型以外
Box含めて基本newtypeパターン(composition)だぞ。
>>633
GCのある言語しか触ったことない限りその発想にはならんから
まずアロケータの仕組みからやりな。
Vecがスマートポインタってデタラメ広めてる奴らどこが出処だよ。
以下の関係で、
Vec has-a RawVec
RawVec has-a Unique
- Vecがrustの作法を強制するためのnewtypeパターン←composition
- RawVecが動的配列の低レベルapi←composition
- Uniqueがユニークポインタ←smart pointer
これだけだろ。
rustのコレクションはデータ構造上直接実装することになる型以外
Box含めて基本newtypeパターン(composition)だぞ。
>>633
GCのある言語しか触ったことない限りその発想にはならんから
まずアロケータの仕組みからやりな。
637デフォルトの名無しさん
2021/10/11(月) 14:34:19.59ID:Ei1usHzb ホラふきが あらわれた!
638デフォルトの名無しさん
2021/10/11(月) 14:44:50.63ID:CP46ljNK また他人のフリして間違いを指摘するレスが来るから乞うご期待www
639デフォルトの名無しさん
2021/10/11(月) 15:28:05.06ID:YVW/m0g2 compositionだからスマートポインタでないという理屈だと Rc も Arc も非公開な内部型の composition だからスマートポインタでなくなってしまう
640デフォルトの名無しさん
2021/10/11(月) 15:42:18.11ID:LNZ+tGdJ >>636
C++のことは一旦忘れて、Rustにおけるスマートポインタの意味を学ぶことをすすめる
https://doc.rust-lang.org/book/ch15-00-smart-pointers.html
C++のことは一旦忘れて、Rustにおけるスマートポインタの意味を学ぶことをすすめる
https://doc.rust-lang.org/book/ch15-00-smart-pointers.html
641デフォルトの名無しさん
2021/10/11(月) 18:57:50.60ID:0Mn4AOx6 >>640
The concept of smart pointers isn’t unique to Rust: smart pointers originated in C++ and exist in other languages as well.
とあるけど?
The concept of smart pointers isn’t unique to Rust: smart pointers originated in C++ and exist in other languages as well.
とあるけど?
642デフォルトの名無しさん
2021/10/11(月) 19:29:34.65ID:YVW/m0g2 We’ve already encountered a few smart pointers in this book, such as String and Vec<T> in Chapter 8, although we didn’t call them smart pointers at the time. Both these types count as smart pointers because they own some memory and allow you to manipulate it. They also have metadata (such as their capacity) and extra capabilities or guarantees (such as with String ensuring its data will always be valid UTF-8).
というわけで Rust の定義では Vec<T> はスマートポインタ
というわけで Rust の定義では Vec<T> はスマートポインタ
643デフォルトの名無しさん
2021/10/11(月) 20:38:32.88ID:oB6cAYFd クイズ: この中にウソはいくつウソがある?
「またはtypescriptのtype Tree = Leaf | Nodeはサポートされません」
「rustはどちらかと言えばほとんどをトレイトで表現しますが、技術的にはこれらは、Tagged unionと呼ばれ 昔はSum typeともバリアント型とも呼ばれていました。」
「rustは可変参照を基本的に好まないスタイルだから、ああなるのは仕方ないな」
「Vecがスマートポインタってデタラメ広めてる奴らどこが出処だよ。 」
「またはtypescriptのtype Tree = Leaf | Nodeはサポートされません」
「rustはどちらかと言えばほとんどをトレイトで表現しますが、技術的にはこれらは、Tagged unionと呼ばれ 昔はSum typeともバリアント型とも呼ばれていました。」
「rustは可変参照を基本的に好まないスタイルだから、ああなるのは仕方ないな」
「Vecがスマートポインタってデタラメ広めてる奴らどこが出処だよ。 」
644デフォルトの名無しさん
2021/10/11(月) 23:52:58.48ID:FfJkoMsS >>633
pub struct Vec<略> {
buf: RawVec<T, A>,
len: usize,
}
pub struct RawVec<略> {
ptr: Unique<T>,
cap: usize,
alloc: A,
}
pub struct Unique<T: ?Sized> {
pointer: *const T,
_marker: PhantomData<T>,
}
push|insertの際にlen|capとアロケート先が変化するという事、上のは難しい事をわざと言ってる
スマートポインタ議論は無視でOK。しかしPhantomDataなんて理解してる人に会ったことない
pub struct Vec<略> {
buf: RawVec<T, A>,
len: usize,
}
pub struct RawVec<略> {
ptr: Unique<T>,
cap: usize,
alloc: A,
}
pub struct Unique<T: ?Sized> {
pointer: *const T,
_marker: PhantomData<T>,
}
push|insertの際にlen|capとアロケート先が変化するという事、上のは難しい事をわざと言ってる
スマートポインタ議論は無視でOK。しかしPhantomDataなんて理解してる人に会ったことない
645デフォルトの名無しさん
2021/10/11(月) 23:58:39.10ID:ATb6fs5R >>631
その冪剰余関数の引数は全て数値すなわちCopy traitを持つので
関数呼び出しに参照を渡す必要はありません
また、可変参照の数値を渡す必要がある別の関数がもしあったとしても
普通に値を渡して変更値は返り値とする方がわかりやすいでしょう
その冪剰余関数の引数は全て数値すなわちCopy traitを持つので
関数呼び出しに参照を渡す必要はありません
また、可変参照の数値を渡す必要がある別の関数がもしあったとしても
普通に値を渡して変更値は返り値とする方がわかりやすいでしょう
646デフォルトの名無しさん
2021/10/12(火) 02:02:02.32ID:yPuGDG3+ >スマートポインタ議論は無視でOK。
他人のフリして我がフリ直せww
他人のフリして我がフリ直せww
647デフォルトの名無しさん
2021/10/12(火) 02:33:26.85ID:1W2DSIiH >>633
初級者ならばこのスレで言及されている内部実装の話は知らずとも使えるので無視してもよい
それよりもmutableとimmutableの意味となぜ区別が必要かを理解したほうがいい
あと参照の意味も理解していないようだからそこもまず基本だからおさえるべき
それら基本を理解すればVecの中身が書き換わるならばmut指定が必要とわかるはず
Rustは簡素に理解しやすく出来ているのに他言語のポインタ周辺の概念を無駄に持ち出してきて難しく考えて失敗する人たちが一部いる
初級者ならばこのスレで言及されている内部実装の話は知らずとも使えるので無視してもよい
それよりもmutableとimmutableの意味となぜ区別が必要かを理解したほうがいい
あと参照の意味も理解していないようだからそこもまず基本だからおさえるべき
それら基本を理解すればVecの中身が書き換わるならばmut指定が必要とわかるはず
Rustは簡素に理解しやすく出来ているのに他言語のポインタ周辺の概念を無駄に持ち出してきて難しく考えて失敗する人たちが一部いる
648デフォルトの名無しさん
2021/10/12(火) 07:19:09.45ID:SacTrMIO これが基本を理解してないと指摘されたやつのレスw
649デフォルトの名無しさん
2021/10/12(火) 08:17:13.13ID:FR/wdn5M Rusterは他人を同一人物と思い込む素性の悪い病人しか居ないな
650633
2021/10/12(火) 08:42:15.75ID:5WgWwJH0 初心者丸出しの質問で、なんでこうなった・・・・・
651デフォルトの名無しさん
2021/10/12(火) 10:28:07.94ID:XIKPR8ou652デフォルトの名無しさん
2021/10/12(火) 10:28:20.90ID:h0zcLGc7 このスレにはアンチRustのC++爺さんと
間違った知識を上から目線でレスするRust初心者が各1名住み着いてるから
質問者は回答内容を自分で精査しないとダメだよ
特に後者はタチが悪いので注意して
間違った知識を上から目線でレスするRust初心者が各1名住み着いてるから
質問者は回答内容を自分で精査しないとダメだよ
特に後者はタチが悪いので注意して
653デフォルトの名無しさん
2021/10/12(火) 10:37:06.05ID:BYAG38Ke Rustに近々追加される機能で熱いものなにかありますか?
654デフォルトの名無しさん
2021/10/12(火) 10:43:27.65ID:Br1er+Qs Rustに関する質問はteratailで
655デフォルトの名無しさん
2021/10/12(火) 10:55:07.59ID:aJ9lzwpY 現時点でRustなんかどうでもいい
10年後に普及してたら一般プログラマーも使う程度
10年後に普及してたら一般プログラマーも使う程度
656デフォルトの名無しさん
2021/10/12(火) 11:09:47.63ID:Br1er+Qs657デフォルトの名無しさん
2021/10/12(火) 11:23:31.59ID:lRrdrCP9 >>650
mutの必要有無は他言語では一般的じゃないRustのルールに関連してるんだけど
それが少し難しいので回答する側にもそのルールを理解してない人がそれなりにいるということ
基本的にコンパイラが教えてくれるので深く理解してなくても使う分にはそこまで問題にはならない
mutの必要有無は他言語では一般的じゃないRustのルールに関連してるんだけど
それが少し難しいので回答する側にもそのルールを理解してない人がそれなりにいるということ
基本的にコンパイラが教えてくれるので深く理解してなくても使う分にはそこまで問題にはならない
658デフォルトの名無しさん
2021/10/12(火) 12:59:59.43ID:dsnSo1To Rustを知るということは、弱点も知ることにつながる
659デフォルトの名無しさん
2021/10/12(火) 13:01:46.79ID:k+FFNiZ5 vlangもmutがあるが散々否定される、曰く「理論に沿ったコンピューター工学を元にしてない」だとか
「トランスコンパイラでしょ」とか、NoGCが過大広告でLobsterというのは分かるがリークするでしょとか
「トランスコンパイラでしょ」とか、NoGCが過大広告でLobsterというのは分かるがリークするでしょとか
660デフォルトの名無しさん
2021/10/12(火) 13:21:05.00ID:WmCYyvpu async/awaitの追加で一旦大きな機能追加目標は終わって、以降は処理系の効率化にリソースを割いていく、みたいな話を読んだ気がする
661デフォルトの名無しさん
2021/10/12(火) 13:54:32.71ID:fJneTy5r 結局他の言語でのメモリモデルも理解してないとrustはまともに使えんよ。
そこを誤魔化すやつはクソだわ。
そこを誤魔化すやつはクソだわ。
662デフォルトの名無しさん
2021/10/12(火) 14:51:47.32ID:2YI6ZITw >>633
Rustは書き換え競合を避けるために、書き換え可能な可変参照(for writer)と、書き換えられない参照(for reader)の区別をして、
書き換えられない参照は同時に複数を持てる(multiple readers)けど、可変参照は同時に一つだけしか許さない(single writer)とすることで、競合を避けている。
Rustではmutかどうかもその観点からなので、変数が別のVecになるだけでなく、同じVecのまま配列内容や長さの変化しても、内容長さ同じだが領域拡大で場所移動でも、書き換わりとしてmutが必要。
だから、Vecのメソッドでmutを要求してるのはそれらの結果論にすぎないし、Vecの内部構造がこうなってるからという説明は不要で筋違い。
>>661
それは違うな。
むしろ頭を一旦ゼロにする柔軟な人ほど理解が早い。
他言語での様々なモデル(メモリモデルやクラスモデルや…)をベースに難しく考える人ほど混乱して理解が遅い。
Rustは書き換え競合を避けるために、書き換え可能な可変参照(for writer)と、書き換えられない参照(for reader)の区別をして、
書き換えられない参照は同時に複数を持てる(multiple readers)けど、可変参照は同時に一つだけしか許さない(single writer)とすることで、競合を避けている。
Rustではmutかどうかもその観点からなので、変数が別のVecになるだけでなく、同じVecのまま配列内容や長さの変化しても、内容長さ同じだが領域拡大で場所移動でも、書き換わりとしてmutが必要。
だから、Vecのメソッドでmutを要求してるのはそれらの結果論にすぎないし、Vecの内部構造がこうなってるからという説明は不要で筋違い。
>>661
それは違うな。
むしろ頭を一旦ゼロにする柔軟な人ほど理解が早い。
他言語での様々なモデル(メモリモデルやクラスモデルや…)をベースに難しく考える人ほど混乱して理解が遅い。
663デフォルトの名無しさん
2021/10/12(火) 14:59:49.12ID:fJneTy5r >むしろ頭を一旦ゼロにする柔軟な人ほど理解が早い。
>他言語での様々なモデル(メモリモデルやクラスモデルや…)をベースに難しく考える人ほど混乱して理解が遅い。
これを本気で考えてるならバカとしか言いようがない。
C、もしくはアセンブラをバインディングした時に確実にぶっ壊れるコードになるわ。
>他言語での様々なモデル(メモリモデルやクラスモデルや…)をベースに難しく考える人ほど混乱して理解が遅い。
これを本気で考えてるならバカとしか言いようがない。
C、もしくはアセンブラをバインディングした時に確実にぶっ壊れるコードになるわ。
664デフォルトの名無しさん
2021/10/12(火) 15:34:41.08ID:2YI6ZITw >>663
それはABIやFFIの話であってRustの話ではない。
Rustで完結するシステムでは一切考慮する必要ない。
他言語ライブラリなど利用の際も、適切な仲介モジュールがあれば、利用側で考慮する必要はない。
各言語との連携部分では、それぞれその言語の知識が不可欠なのは当たり前。
だが、それはRustの話ではなく、Rustにおいてはその知識は必要ない。
それはABIやFFIの話であってRustの話ではない。
Rustで完結するシステムでは一切考慮する必要ない。
他言語ライブラリなど利用の際も、適切な仲介モジュールがあれば、利用側で考慮する必要はない。
各言語との連携部分では、それぞれその言語の知識が不可欠なのは当たり前。
だが、それはRustの話ではなく、Rustにおいてはその知識は必要ない。
665デフォルトの名無しさん
2021/10/12(火) 16:09:45.89ID:Br1er+Qs メモリモデルって並行プログラミングやらないならあんまり関係なくない???
666デフォルトの名無しさん
2021/10/12(火) 16:12:51.35ID:BYAG38Ke アトミック操作のOrderingの話なんかはC++の定義に丸投げしてるから他の言語の知識が必要というのは一応正しい
667デフォルトの名無しさん
2021/10/12(火) 16:27:05.41ID:2YI6ZITw668デフォルトの名無しさん
2021/10/12(火) 18:24:19.63ID:natODgzZ >>662
「Vecの内部構造がこうなってるからという説明は不要で筋違い」うーん、それこそ趣旨が違うよ。
vec[0] = 2などとして内容長さ同じの場合の理解では、1つの可変参照と、複数の参照を持つ事を
知っているのは必要だが通常では長さや容量が拡張されるpushやinsertは内部構造により説明される。
mutatorであるpushを呼ばない限りはmutは必要なければ、「mutをつけたベクター型」では無くて
配列という質問になるのでは?
「Vecの内部構造がこうなってるからという説明は不要で筋違い」うーん、それこそ趣旨が違うよ。
vec[0] = 2などとして内容長さ同じの場合の理解では、1つの可変参照と、複数の参照を持つ事を
知っているのは必要だが通常では長さや容量が拡張されるpushやinsertは内部構造により説明される。
mutatorであるpushを呼ばない限りはmutは必要なければ、「mutをつけたベクター型」では無くて
配列という質問になるのでは?
669デフォルトの名無しさん
2021/10/12(火) 19:12:36.47ID:2YI6ZITw >>668
公開(pub)されていないstruct Vecの内部構造や非公開のRawVecなどを持ち出してくる人たちがいるから、
「Vecの内部構造がこうなってるからという説明は不要で筋違い」と書いた。
そこは長さや容量を持っている等の概念の理解だけで十分であるし、実際に公表されている情報もそこまで。
公開(pub)されていないstruct Vecの内部構造や非公開のRawVecなどを持ち出してくる人たちがいるから、
「Vecの内部構造がこうなってるからという説明は不要で筋違い」と書いた。
そこは長さや容量を持っている等の概念の理解だけで十分であるし、実際に公表されている情報もそこまで。
670デフォルトの名無しさん
2021/10/12(火) 19:33:58.77ID:natODgzZ >>667
C++の知識を「あまり」必要としないのは確かだがC20/C22などの仕様を「参考」にしているのは明らか。
というかLLVMから見てClangっぽく見えるように頑張っていると公式が言っている
C++の知識を「あまり」必要としないのは確かだがC20/C22などの仕様を「参考」にしているのは明らか。
というかLLVMから見てClangっぽく見えるように頑張っていると公式が言っている
671デフォルトの名無しさん
2021/10/12(火) 19:37:41.99ID:natODgzZ672デフォルトの名無しさん
2021/10/12(火) 21:00:30.83ID:fJneTy5r673デフォルトの名無しさん
2021/10/12(火) 22:00:42.97ID:lRrdrCP9674デフォルトの名無しさん
2021/10/12(火) 22:09:23.38ID:+W0FsG+B >>672
Rustでプログラムを書くに当たってRustを構成する様々な低レベルのレイヤーのうちどこまで書き手は意識すべきと考えますか?
さすがにCPUを構成するシリコンひとつひとつの振る舞いを意識することは出来ないので、
これより先は気にしなくて良いという境界は存在すると思うのですが、それはどのあたりにあるとお考えでしょうか
Rustでプログラムを書くに当たってRustを構成する様々な低レベルのレイヤーのうちどこまで書き手は意識すべきと考えますか?
さすがにCPUを構成するシリコンひとつひとつの振る舞いを意識することは出来ないので、
これより先は気にしなくて良いという境界は存在すると思うのですが、それはどのあたりにあるとお考えでしょうか
675デフォルトの名無しさん
2021/10/12(火) 22:18:28.12ID:1W2DSIiH >>672
no_stdでさらにシステムコール(あるいは相当)はasmでレジスタ渡しで呼び出しに至るまでRust完全単独で既存OS(など)利用もあるしOS作成ならOS側もRust単独
no_stdでさらにシステムコール(あるいは相当)はasmでレジスタ渡しで呼び出しに至るまでRust完全単独で既存OS(など)利用もあるしOS作成ならOS側もRust単独
676デフォルトの名無しさん
2021/10/12(火) 23:07:50.81ID:XIKPR8ou >>664
>Rustで完結するシステムでは一切考慮する必要ない。
それって議論の価値ある? だって現実的じゃないじゃん
研究者のための言語だっていうなら、それもありだけど
ここにいる人間は実用を求めてるわけでしょ。多分……
>Rustで完結するシステムでは一切考慮する必要ない。
それって議論の価値ある? だって現実的じゃないじゃん
研究者のための言語だっていうなら、それもありだけど
ここにいる人間は実用を求めてるわけでしょ。多分……
677デフォルトの名無しさん
2021/10/12(火) 23:22:14.99ID:ElEzb70r すまんが何を言っているかさっぱり分からない
自分が書いてるのは9割方Rustで完結したプロジェクトだけど、みんなFFIばっかり書いてるのか?
自分が書いてるのは9割方Rustで完結したプロジェクトだけど、みんなFFIばっかり書いてるのか?
678デフォルトの名無しさん
2021/10/12(火) 23:52:39.59ID:XIKPR8ou Win32APIとリンクしたり、そういうプログラムは書かないってことね
679デフォルトの名無しさん
2021/10/12(火) 23:56:08.22ID:ElEzb70r Win32API使いたいんなら単にwindows-rsクレート使えば良いだけで
その先のC ABIがどうなってるかとか気にする必要はないと思うが
その先のC ABIがどうなってるかとか気にする必要はないと思うが
680デフォルトの名無しさん
2021/10/12(火) 23:57:43.15ID:ElEzb70r ああでもwindows-rs自体は割とunsafe あるから気にしないとダメかな
681デフォルトの名無しさん
2021/10/13(水) 00:00:43.80ID:PhFIUWEp いや、そもそもwindows-rsクレート使おうが
C理解してないと使えないよ
だってwindows-rsの型定義は「今のところ」まともじゃないもん
ポインタは何でもかんでもDWORDだし
C理解してないと使えないよ
だってwindows-rsの型定義は「今のところ」まともじゃないもん
ポインタは何でもかんでもDWORDだし
682デフォルトの名無しさん
2021/10/13(水) 00:05:34.07ID:1HIX7TKw 確かに例が悪かった。windows-rsに関してはunsafe がある以上呼び出し先のCの知識は必須だね
言いたいのは自分でunsafeを書かない限り、Rustだけで完結するってこと
そりゃ分野によってはまだライブラリ不足で完結しにくいのもあるだろうけど、多くの分野で完結すると思うがなぁ
言いたいのは自分でunsafeを書かない限り、Rustだけで完結するってこと
そりゃ分野によってはまだライブラリ不足で完結しにくいのもあるだろうけど、多くの分野で完結すると思うがなぁ
683デフォルトの名無しさん
2021/10/13(水) 00:37:10.90ID:bi9uBzGZ で、そういうメモリをほとんど気にしないソフトはrustで書く必要がないものなんだよね。
ファッションでやってることがバレちゃったね。
ファッションでやってることがバレちゃったね。
684デフォルトの名無しさん
2021/10/13(水) 00:38:57.86ID:fXfbCLiK Rust以外のプログラミング言語を考えれば理解しやすい
C言語を全く知らなくても使えるようにその言語だけで書かれたAPIで何でも利用できる
Rustも同様でC言語を全く知らなくても使えるようにRustだけで書かれたAPIで何でも利用できるようにすることができるし実際にほとんどの分野ではそうなっている
その上でRustの場合は効率面から元のAPI向き出しで例えばCStr使ったりするなどC言語でのAPIのまま提供するモジュールも存在するというだけにすぎなくてそこはあくまでもFFI領域
したがって「他の言語と同様にRustもC言語を全く知らなくても使える」で正解
C言語を全く知らなくても使えるようにその言語だけで書かれたAPIで何でも利用できる
Rustも同様でC言語を全く知らなくても使えるようにRustだけで書かれたAPIで何でも利用できるようにすることができるし実際にほとんどの分野ではそうなっている
その上でRustの場合は効率面から元のAPI向き出しで例えばCStr使ったりするなどC言語でのAPIのまま提供するモジュールも存在するというだけにすぎなくてそこはあくまでもFFI領域
したがって「他の言語と同様にRustもC言語を全く知らなくても使える」で正解
685デフォルトの名無しさん
2021/10/13(水) 01:08:46.05ID:4amWetfo686デフォルトの名無しさん
2021/10/13(水) 01:16:25.82ID:fXfbCLiK >>683
例えばstd::fsやstd::netなどは本来ならCのABIでやりとりするものだが
そんなこといっさい気にする必要なくRustの型で渡してRustの型で返ってくるようにRustの標準ライブラリが作られている
そこにCの知識は全く必要としない
例えばstd::fsやstd::netなどは本来ならCのABIでやりとりするものだが
そんなこといっさい気にする必要なくRustの型で渡してRustの型で返ってくるようにRustの標準ライブラリが作られている
そこにCの知識は全く必要としない
687デフォルトの名無しさん
2021/10/13(水) 07:24:31.94ID:WqU30Pep たくさん書くのは自信がなさの表れ
そんな必死になるような話じゃないだろうに
そんな必死になるような話じゃないだろうに
688デフォルトの名無しさん
2021/10/13(水) 09:00:38.12ID:W/9iWpHx Cを理解してないとRustは使えない、と
ウソをつく人がいるからだろう
ウソをつく人がいるからだろう
689デフォルトの名無しさん
2021/10/13(水) 09:25:52.29ID:bi9uBzGZ そう思い込んでりゃいいんでない?
近くにいなけりゃ放置するよ。近くにいればボコボコにするけど。
近くにいなけりゃ放置するよ。近くにいればボコボコにするけど。
690デフォルトの名無しさん
2021/10/13(水) 09:41:01.46ID:+i9fv0nZ691デフォルトの名無しさん
2021/10/13(水) 10:15:02.35ID:hOkEY9I6 >>688
そういうやつの相手をムキになってやってるうちは自分も同じレベルだって気付けよな
そういうやつの相手をムキになってやってるうちは自分も同じレベルだって気付けよな
692デフォルトの名無しさん
2021/10/13(水) 10:36:12.77ID:gkjY8I9d693デフォルトの名無しさん
2021/10/13(水) 14:45:58.97ID:qAYNHtUZ >>690
シリコン原子一粒一粒の意味
シリコン原子一粒一粒の意味
694デフォルトの名無しさん
2021/10/14(木) 18:50:15.29ID:1TrBYNn/ コンピュータアーキテクチャの基礎知識(メモリモデル、アクセスオーダ、スレッディング等)やOSのシステムコール、APIの知識の事を "C言語の知識" と呼ぶ人が居るのね。
まあどうでもいいけど。
まあどうでもいいけど。
695デフォルトの名無しさん
2021/10/14(木) 19:43:21.65ID:JvADELGn システムコールにしても最終的にはレジスタに積んでsyscall命令もしくは割り込みするだけだからCでもRustでもasmと共存するだけか
C言語の知識は要らないな
C言語の知識は要らないな
696デフォルトの名無しさん
2021/10/14(木) 20:55:23.77ID:1TrBYNn/ まあシステムコールやAPIは C や CPP のヘッダ形式で定義/提供されてるという事を言いたいなら判らんでもないが、
そこまでコアな言語仕様知識は要らないねえ。
そこまでコアな言語仕様知識は要らないねえ。
697デフォルトの名無しさん
2021/10/14(木) 21:55:10.80ID:GbD2vike rustは書けるけどCが書けない人いる?
そういう人がいないとCがいるかいらないかわからない
自分はCの知識が役に立ったと思う
そういう人がいないとCがいるかいらないかわからない
自分はCの知識が役に立ったと思う
698デフォルトの名無しさん
2021/10/14(木) 22:21:20.24ID:dWpPrl+Q RustでWebバックエンド書いてる人になら普通にいるんじゃない?
Web系ならこれまでのキャリアで全くCに触れなくてもおかしくないし
Web系ならこれまでのキャリアで全くCに触れなくてもおかしくないし
699デフォルトの名無しさん
2021/10/15(金) 10:55:12.45ID:GXWQCf9x 昔からRust for Rubyistsとかあるしスクリプト系言語から流れて来る人もそれなりにいるかと
700デフォルトの名無しさん
2021/10/15(金) 12:44:17.46ID:P5mUityt スマートポインタやシェアードポインタ、所有権なんかは、C++0xあたりで導入された考えだから
どの程度の範囲をC言語と言っているのかによる。要らない派が多く「見える」が、知識があって
理解をを妨げるという考えは全否定する。「あって困るものではない」
どの程度の範囲をC言語と言っているのかによる。要らない派が多く「見える」が、知識があって
理解をを妨げるという考えは全否定する。「あって困るものではない」
701デフォルトの名無しさん
2021/10/15(金) 14:00:41.51ID:8deGlJY8702デフォルトの名無しさん
2021/10/15(金) 14:27:53.37ID:lZWoC8Xx >>701
OSなんて書いたこともないくせに語るなド素人
OSなんて書いたこともないくせに語るなド素人
703デフォルトの名無しさん
2021/10/15(金) 15:04:44.50ID:8deGlJY8 >>702
ソースコード読むことすらしてないバカは黙ってて。
ソースコード読むことすらしてないバカは黙ってて。
704デフォルトの名無しさん
2021/10/15(金) 15:15:35.47ID:rb+Oscx7 なんか低レベルな話で盛り上がってるな
705デフォルトの名無しさん
2021/10/15(金) 15:16:50.75ID:5/Pqp5xe そんなことよりシステムコールの呼び出しにCの知識は必要ないっていうコメント対して>>701のレスが噛み合ってないんだが、何を言いたかったのか解説してくれないか
706デフォルトの名無しさん
2021/10/15(金) 15:20:05.89ID:8deGlJY8 なるほど、レジスタからメモリ書き込みの同期タイミングなどが必要とかそこまで具体的に言わないと理解できないレベルなのか。
すげー馬鹿しかいないのなら仕方ないな。
すげー馬鹿しかいないのなら仕方ないな。
707デフォルトの名無しさん
2021/10/15(金) 15:33:44.29ID:5/Pqp5xe システムコールの呼び出しとはまったく関係ないな
708デフォルトの名無しさん
2021/10/15(金) 15:40:54.74ID:lZWoC8Xx OS書いたことも無いのに恥ずかしい奴
709デフォルトの名無しさん
2021/10/15(金) 15:45:02.58ID:lZWoC8Xx710デフォルトの名無しさん
2021/10/15(金) 16:38:42.56ID:XGfxQXO+ >>701
Rustはインラインasmできるので好きなレジスタと好きな変数(メモリ)の行き来演算できるしRustだけでOSも書ける
Rustはインラインasmできるので好きなレジスタと好きな変数(メモリ)の行き来演算できるしRustだけでOSも書ける
711デフォルトの名無しさん
2021/10/15(金) 17:41:49.92ID:W8XYkXKH >>710
どうせunsafeなんだろ
どうせunsafeなんだろ
712デフォルトの名無しさん
2021/10/15(金) 18:11:50.56ID:rb+Oscx7 寒色は人権すらないからな
713デフォルトの名無しさん
2021/10/15(金) 18:54:33.37ID:0qD/Pqit714デフォルトの名無しさん
2021/10/15(金) 18:55:28.40ID:IFdb5cTy Rust? 人気らしいね、でもオイラやらないよ
Cは嫌いだし、その後釜狙いの言語はどうせ肌に合わないさ
大半の人には必要ない言語だよね、だからオイラGoをやるよ
Cは嫌いだし、その後釜狙いの言語はどうせ肌に合わないさ
大半の人には必要ない言語だよね、だからオイラGoをやるよ
715デフォルトの名無しさん
2021/10/15(金) 18:58:20.72ID:WKIFTMdH GoのほうがよっぽどCの後釜感あるがな
GCのあるCという感じ
GCのあるCという感じ
716デフォルトの名無しさん
2021/10/15(金) 19:22:21.57ID:PoOS8yLC717デフォルトの名無しさん
2021/10/15(金) 19:27:43.08ID:vEXHgFWD rustの強みである静的メモリ安全性っていうのが活かせてないやんって意味で言ったんやけど
cやc++と同じ状況ならむしろrustよりcやc++使うよね?
cやc++と同じ状況ならむしろrustよりcやc++使うよね?
718デフォルトの名無しさん
2021/10/15(金) 19:36:00.75ID:sYZbhEbz 量の概念がないやつが定期的に現れるな
コード全域がunaafeなのと局所的なのは全然違うでしょ
コード全域がunaafeなのと局所的なのは全然違うでしょ
719デフォルトの名無しさん
2021/10/15(金) 19:46:42.29ID:PoOS8yLC720デフォルトの名無しさん
2021/10/15(金) 19:48:51.64ID:eqKsqNtm それならC++も同じでは?
721デフォルトの名無しさん
2021/10/15(金) 19:49:28.65ID:OmwX7nxr >>719
unsafeなのにメモリ安全性どうやって保証してるの?
unsafeなのにメモリ安全性どうやって保証してるの?
722デフォルトの名無しさん
2021/10/15(金) 19:52:54.07ID:eqKsqNtm C++の場合は、vector自身がメモリーの所有権を持ってるので安全性が保障されるんだけど。
723デフォルトの名無しさん
2021/10/15(金) 20:08:04.69ID:PoOS8yLC >>721
え?何を言ってるの?
Vecに限らずRustの各型を含めた標準ライブラリの内部はもちろんunsafeだらけだけど
論理的に安全な操作のみ、かつ、内部に閉じ込められていて外部に影響を及ぼさないもののみ
だからそれら型を含めた標準ライブラリを我々は安全に使うことができる
そしてそららを用いた我々のプログラムはコンパイラが通ればメモリ安全性を保証される
え?何を言ってるの?
Vecに限らずRustの各型を含めた標準ライブラリの内部はもちろんunsafeだらけだけど
論理的に安全な操作のみ、かつ、内部に閉じ込められていて外部に影響を及ぼさないもののみ
だからそれら型を含めた標準ライブラリを我々は安全に使うことができる
そしてそららを用いた我々のプログラムはコンパイラが通ればメモリ安全性を保証される
724デフォルトの名無しさん
2021/10/15(金) 20:14:36.90ID:eqKsqNtm >>723
じゃあC++と変わりませんね。
じゃあC++と変わりませんね。
725デフォルトの名無しさん
2021/10/15(金) 20:15:19.52ID:I/84Z1Ml >>723
だからアスペか?
論理的に安全な操作のみ、かつ、内部に閉じ込められていて外部に影響を及ぼさないってことをどうやって保証してるのか聞いてんだけど?
国会の答弁みたいな返答やめろよ
というか外部にメモリ及ぼさないはメモリ安全性が保たれるの必要条件じゃないんだけど
だからアスペか?
論理的に安全な操作のみ、かつ、内部に閉じ込められていて外部に影響を及ぼさないってことをどうやって保証してるのか聞いてんだけど?
国会の答弁みたいな返答やめろよ
というか外部にメモリ及ぼさないはメモリ安全性が保たれるの必要条件じゃないんだけど
726デフォルトの名無しさん
2021/10/15(金) 20:15:56.65ID:I/84Z1Ml 外部にメモリ及ぼさないじゃなくて外部に影響及ぼさないだった
727デフォルトの名無しさん
2021/10/15(金) 20:21:27.95ID:PoOS8yLC728デフォルトの名無しさん
2021/10/15(金) 20:33:33.14ID:WHarWmnu729デフォルトの名無しさん
2021/10/15(金) 20:36:47.57ID:jQ7TSjOD Cしか知らない人ってプログラミング言語の仕様とコンピュータのアーキテクチャが区別できないってマ?
型理論も知らないってマ?
型理論も知らないってマ?
730デフォルトの名無しさん
2021/10/15(金) 20:40:52.58ID:PoOS8yLC731デフォルトの名無しさん
2021/10/15(金) 20:50:24.31ID:LC/Ahxji >>730
>unsafeを誤解しているようだけど
>CやC++と同じ状況すなわちその部分の>メモリ安全性は自己管理となるだけ
って自分で言ってるよね?自分の過去の発言と言ってること矛盾してない?
rustのunsafeはメモリ安全性を保証することを諦めてるって言いたかったようだけど今は言ってること無茶苦茶じゃない?
>unsafeを誤解しているようだけど
>CやC++と同じ状況すなわちその部分の>メモリ安全性は自己管理となるだけ
って自分で言ってるよね?自分の過去の発言と言ってること矛盾してない?
rustのunsafeはメモリ安全性を保証することを諦めてるって言いたかったようだけど今は言ってること無茶苦茶じゃない?
732デフォルトの名無しさん
2021/10/15(金) 20:51:16.86ID:U2SV1SiG >>722
これが一般的なC++erの認識だとしたら恐ろしいな
これが一般的なC++erの認識だとしたら恐ろしいな
733デフォルトの名無しさん
2021/10/15(金) 20:58:34.88ID:NxDOUPls unsafeなコードが周りを滅茶滅茶にしない保証は無いよ
734デフォルトの名無しさん
2021/10/15(金) 21:01:02.97ID:NxDOUPls unsafeを使った場合の安全性の保証を機械的にやりたければ↓みたいなので契約プログラミングする手はあるね
https://crates.io/crates/contracts
https://crates.io/crates/contracts
735デフォルトの名無しさん
2021/10/15(金) 21:10:23.11ID:PoOS8yLC >>731
もちろんRustの標準ライブラリの実装内部には多数の細かい小さなunsafeがあってその部分はコンパイラによるメモリ安全性保証の範囲外
それそれの内部ローカルのunsafe使用が論理的にメモリ安全であるか否かの保証はコンパイラではなく人間が行ないunsafeはそのためにある
その上でRustコンパイラはプログラム全体のメモリ安全性を保証する
もちろんRustの標準ライブラリの実装内部には多数の細かい小さなunsafeがあってその部分はコンパイラによるメモリ安全性保証の範囲外
それそれの内部ローカルのunsafe使用が論理的にメモリ安全であるか否かの保証はコンパイラではなく人間が行ないunsafeはそのためにある
その上でRustコンパイラはプログラム全体のメモリ安全性を保証する
736デフォルトの名無しさん
2021/10/15(金) 21:17:10.00ID:Ue2FksZS >>735
人間がどうやって行うの?
人間がどうやって行うの?
737デフォルトの名無しさん
2021/10/15(金) 21:31:51.20ID:XGfxQXO+ 話は簡単だ
C/C++はプログラム全てがRustのunsafe状態
つまりC/C++はプログラム全てを人間がメモリ安全であると保証しなければならないが人間なので複雑化するとミスも生じる
GAFAM各社はメモリ安全に関するバグが全く減らずセキュリティ脆弱性の多くがこの問題に起因することに気付いた
そこでコンパイラがメモリ安全であると保証するRustを採用して少しずつC/C++から移行させていってる段階
C/C++はプログラム全てがRustのunsafe状態
つまりC/C++はプログラム全てを人間がメモリ安全であると保証しなければならないが人間なので複雑化するとミスも生じる
GAFAM各社はメモリ安全に関するバグが全く減らずセキュリティ脆弱性の多くがこの問題に起因することに気付いた
そこでコンパイラがメモリ安全であると保証するRustを採用して少しずつC/C++から移行させていってる段階
738デフォルトの名無しさん
2021/10/15(金) 21:34:04.93ID:OlLYCHFC unsafe blockはマーが全力で頑張ります!ゾーンだからな
アルゴリズムにおいてあるアルゴリズムが正当であると判定するアルゴリズムは存在しないんだからラストコンパライでも完全なセーフティは保証は出来ないけどな
ただ完全ではないものの他の注意すべき所をランコンに任せてunsafe部にヒューマンリソース限定出来るのはc++を遥かに優れた点よね(´・ω・`)
アルゴリズムにおいてあるアルゴリズムが正当であると判定するアルゴリズムは存在しないんだからラストコンパライでも完全なセーフティは保証は出来ないけどな
ただ完全ではないものの他の注意すべき所をランコンに任せてunsafe部にヒューマンリソース限定出来るのはc++を遥かに優れた点よね(´・ω・`)
739デフォルトの名無しさん
2021/10/15(金) 21:39:33.56ID:NxDOUPls 布教しようとしなくたっていいんだよ
めんどくせえから
めんどくせえから
740デフォルトの名無しさん
2021/10/15(金) 21:42:55.26ID:eqKsqNtm >>737
GAFAがその体たらくとは信じがたいけど、resource管理は所有権ベースでほぼ解決するし、逆に所有権以外で解決することは出来ないと思う。
GAFAがその体たらくとは信じがたいけど、resource管理は所有権ベースでほぼ解決するし、逆に所有権以外で解決することは出来ないと思う。
741デフォルトの名無しさん
2021/10/15(金) 21:45:54.09ID:kEafjbCd >>738
チューリングマシンの停止性問題のこと言ってるんだろうけど違うよ
あるアルゴリズムじゃなくて任意のね
「あるプログラムが正当であると判定するプログラムは存在しない」じゃなくて「任意のプログラムを正当であると判定するプログラムは存在しない」が正しい
これが5chクオリティか
チューリングマシンの停止性問題のこと言ってるんだろうけど違うよ
あるアルゴリズムじゃなくて任意のね
「あるプログラムが正当であると判定するプログラムは存在しない」じゃなくて「任意のプログラムを正当であると判定するプログラムは存在しない」が正しい
これが5chクオリティか
742デフォルトの名無しさん
2021/10/15(金) 21:58:02.76ID:rb+Oscx7 Rustコンパイラによるメモリ安全性の保証は信頼してても、unsafe使ってる標準ライブラリを信頼しない話おもしろいね。
実際に問題なく動いてるんだから仕様を信頼すればいいのに。
実際に問題なく動いてるんだから仕様を信頼すればいいのに。
743デフォルトの名無しさん
2021/10/15(金) 22:06:00.13ID:PoOS8yLC744デフォルトの名無しさん
2021/10/15(金) 22:07:41.72ID:OlLYCHFC >>741
うーんまぁ日本語で論理学考える事なんてあんましないから間違えてるのかもしれんが
あるアルゴリズム、ある整数等々で俺はある集合(=アルゴリズム全体で構成される集合)の元の任意性を表してんたんだけどな(´・ω・`)
うーんまぁ日本語で論理学考える事なんてあんましないから間違えてるのかもしれんが
あるアルゴリズム、ある整数等々で俺はある集合(=アルゴリズム全体で構成される集合)の元の任意性を表してんたんだけどな(´・ω・`)
745デフォルトの名無しさん
2021/10/15(金) 22:11:36.31ID:wjdlJ99Z746デフォルトの名無しさん
2021/10/15(金) 22:18:09.07ID:JTaIEN+o747デフォルトの名無しさん
2021/10/15(金) 22:39:44.83ID:XGfxQXO+ >>740
C/C++に限界を感じたGAFAMたち大手IT企業がRustに結集
特定の言語がIT業界を挙げて支持されるのは初めて
プログラミング言語「Rust」のための「Rust Foundation」設立 -- AWS(Amazon)、Microsoft、Google、Mozilla、Huaweiが創設
https://japan.zdnet.com/article/35166267/
Facebookが「Rust Foundation」に参加
https://japan.zdnet.com/article/35170192/
C/C++に限界を感じたGAFAMたち大手IT企業がRustに結集
特定の言語がIT業界を挙げて支持されるのは初めて
プログラミング言語「Rust」のための「Rust Foundation」設立 -- AWS(Amazon)、Microsoft、Google、Mozilla、Huaweiが創設
https://japan.zdnet.com/article/35166267/
Facebookが「Rust Foundation」に参加
https://japan.zdnet.com/article/35170192/
748デフォルトの名無しさん
2021/10/16(土) 00:08:25.70ID:dPfgeqZY >>717
それどこの0か100しか無い世界?
それどこの0か100しか無い世界?
749デフォルトの名無しさん
2021/10/16(土) 00:34:25.94ID:bSvFIUA3 C++はこれで鼻から悪魔出るから
vector<int> hoge {0};
int& fuga = hoge[0];
for (size_t i = 0; i < 5; ++i) {
hoge.push_back(i);
}
cout << fuga;
}
nsafeがどうたらぬ気にしてRustはこういうのが防げるってだけでもそれなりの価値はある
ちなみにunsafeブロックは本当に慎重に作らないと、unsafeの外部をちょっといじっただけで鼻から悪魔が出たりする
https://doc.rust-jp.rs/rust-nomicon-ja/working-with-unsafe.html
unsafeブロック外のidx < arr.len()をidx <= arr.len()にしただけで死ぬ
vector<int> hoge {0};
int& fuga = hoge[0];
for (size_t i = 0; i < 5; ++i) {
hoge.push_back(i);
}
cout << fuga;
}
nsafeがどうたらぬ気にしてRustはこういうのが防げるってだけでもそれなりの価値はある
ちなみにunsafeブロックは本当に慎重に作らないと、unsafeの外部をちょっといじっただけで鼻から悪魔が出たりする
https://doc.rust-jp.rs/rust-nomicon-ja/working-with-unsafe.html
unsafeブロック外のidx < arr.len()をidx <= arr.len()にしただけで死ぬ
750デフォルトの名無しさん
2021/10/16(土) 03:36:57.11ID:I/G6evYm unsafeなコードが1行でもあったらRustで書く意味ないと主張する人が定期的に現れるのはなぜなのか
751デフォルトの名無しさん
2021/10/16(土) 03:54:24.52ID:0owCAudu >>750
C++が劣ることを認めたくない人が「unsafeがあるならC++と同じだからRustの存在意義はない。」という間違った主張をしてるみたい
C++が劣ることを認めたくない人が「unsafeがあるならC++と同じだからRustの存在意義はない。」という間違った主張をしてるみたい
752デフォルトの名無しさん
2021/10/16(土) 04:04:47.91ID:4kIP2zxZ C++との対決は別の専用スレがあるのでそっち使ってくださいね
753デフォルトの名無しさん
2021/10/16(土) 04:11:16.75ID:0owCAudu >>752
同感
C++な人はここでやらずに
向こうの専用スレでやってほしい
C++ vs Rust
https://mevius.5ch.net/test/read.cgi/tech/1619219089/
同感
C++な人はここでやらずに
向こうの専用スレでやってほしい
C++ vs Rust
https://mevius.5ch.net/test/read.cgi/tech/1619219089/
754いつもの光景
2021/10/16(土) 07:19:55.59ID:VQLpYdr0 Vec型の質問に高卒が答える
↓
当然の如く高卒がバカにされる
↓
高卒発狂
↓
パソコンがどうの、C++がどうの、いつもの大先生問答に発展
↓
当然の如く高卒がバカにされる
↓
高卒発狂
↓
パソコンがどうの、C++がどうの、いつもの大先生問答に発展
755デフォルトの名無しさん
2021/10/16(土) 09:07:15.06ID:GnSu5gfs756デフォルトの名無しさん
2021/10/16(土) 09:21:09.42ID:wH7tzS3T >>755
fugaがhogeのメモリ参照を取った後にhoge.push_back()でデータを追加している。
データ追加ではhogeの内部で確保していたメモリ領域が足りなくなると
新しいアドレスに確保しなおす(元の領域は開放する)ので、
fugaが指しているアドレスはアクセスしてはいけない領域になってる。(ダングリングポインタ)
その状態でcoutでfugaを使ってるから。
fugaがhogeのメモリ参照を取った後にhoge.push_back()でデータを追加している。
データ追加ではhogeの内部で確保していたメモリ領域が足りなくなると
新しいアドレスに確保しなおす(元の領域は開放する)ので、
fugaが指しているアドレスはアクセスしてはいけない領域になってる。(ダングリングポインタ)
その状態でcoutでfugaを使ってるから。
757デフォルトの名無しさん
2021/10/16(土) 09:48:04.61ID:GnSu5gfs758デフォルトの名無しさん
2021/10/16(土) 10:29:54.02ID:N8k1BZc2 unsafeなtraitとそうでない通常のtraitってどう違うんでしょうか
implにunsafeって書かないといけない点以外で
implにunsafeって書かないといけない点以外で
759デフォルトの名無しさん
2021/10/16(土) 12:13:05.40ID:MVC0A82Z バカは実際にバグが起きるかどうかを考えてなくて
バグを誰かのせいにできるかどうかしか考えてないんだろ。
だからこんなしょーもないものが持て囃されるってわけだ。
バグを誰かのせいにできるかどうかしか考えてないんだろ。
だからこんなしょーもないものが持て囃されるってわけだ。
760デフォルトの名無しさん
2021/10/16(土) 13:08:52.57ID:xy6guhnI 東アジア圏は原因の究明と再発防止より責任の追及と処罰を優先する文化だからな
気をつければ問題ないみたいな精神論が平気で唱えられるのも同様
システム工学先進国のアメリカあたりと比べたらかなり後れている
気をつければ問題ないみたいな精神論が平気で唱えられるのも同様
システム工学先進国のアメリカあたりと比べたらかなり後れている
761デフォルトの名無しさん
2021/10/16(土) 20:42:26.55ID:jYqji68p それは東アジア人の性質ってか東朝鮮の性質だろ(´・ω・`)
762デフォルトの名無しさん
2021/10/17(日) 12:48:28.83ID:5UKSiAtl CargoでC/C++のコードをビルドするときにヘッダファイル等の依存関係って何処まで面倒を見てくれるんだろ?
自分で全部記述しないとダメなのか、自動的に追跡してくれるのか・・・
ググってもCのコードも一緒にビルドできます以上の情報が見つからん
自分で全部記述しないとダメなのか、自動的に追跡してくれるのか・・・
ググってもCのコードも一緒にビルドできます以上の情報が見つからん
763デフォルトの名無しさん
2021/10/18(月) 10:43:24.73ID:oPyph5kC 面倒見るわけねーじゃん。
ヘッダーファイル依存をまともに解決しようと思うと、ビルド速度に影響がモロに出る。
解決するには暗黙のキャッシュ使うことになって問題が起きやすくなる。
ヘッダーファイル依存をまともに解決しようと思うと、ビルド速度に影響がモロに出る。
解決するには暗黙のキャッシュ使うことになって問題が起きやすくなる。
764デフォルトの名無しさん
2021/10/18(月) 11:14:38.10ID:jL9+j5XP >>762
一番基本的なやり方だとcc crate使うことになると思うけど
このやり方だとヘッダやライブラリは自分で指定する必要ある
使ったことないけどpkg_config crateとか使えば多少は楽になるのかもしれない
C/C++コードが別プロジェクトからの流用ならそのプロジェクトのビルドツールに乗っかるのが楽かも
例えば cmake や autocfg/autotools といった crate はあるみたい
一番基本的なやり方だとcc crate使うことになると思うけど
このやり方だとヘッダやライブラリは自分で指定する必要ある
使ったことないけどpkg_config crateとか使えば多少は楽になるのかもしれない
C/C++コードが別プロジェクトからの流用ならそのプロジェクトのビルドツールに乗っかるのが楽かも
例えば cmake や autocfg/autotools といった crate はあるみたい
765デフォルトの名無しさん
2021/10/18(月) 12:25:26.72ID:cow76Y8p >>749
vectorじゃなくて、listを使うと大丈夫。
C言語は、もともと、linked list が代名詞の様な言語。
それを引き継いだC++もstd::listこそが主役。
ところが、stroustrupがvectorを推奨するから混乱してる。
vectorじゃなくて、listを使うと大丈夫。
C言語は、もともと、linked list が代名詞の様な言語。
それを引き継いだC++もstd::listこそが主役。
ところが、stroustrupがvectorを推奨するから混乱してる。
766デフォルトの名無しさん
2021/10/18(月) 12:39:56.60ID:jL9+j5XP767デフォルトの名無しさん
2021/10/18(月) 15:20:57.34ID:gU1bKDav768デフォルトの名無しさん
2021/10/18(月) 15:29:58.26ID:+iNX7XVA listそんな使うことないやろ。挿入と削除が早いだけやんけ。何が言いたかったんだか。
769デフォルトの名無しさん
2021/10/18(月) 21:23:43.42ID:292fwFlx 確かにlistはあまり使った記憶がないなー
キャッシュのミスヒットを考えると、
vectorでリロケートした方が速い場合もあるし
キャッシュのミスヒットを考えると、
vectorでリロケートした方が速い場合もあるし
770デフォルトの名無しさん
2021/10/18(月) 23:37:04.31ID:Qq+Ry0m8 listは敵キャラの弾幕なんかの座標管理なんかに使える
771デフォルトの名無しさん
2021/10/19(火) 12:19:23.96ID:5XPa2/LH ほぼcだよねこれ。
https://github.com/Rust-for-Linux/linux
https://github.com/Rust-for-Linux/linux
772デフォルトの名無しさん
2021/10/19(火) 12:22:25.90ID:GgDBkr4o (Cで書かれてるLinuxカーネルのフォークなんだから当たり前やろ)
773デフォルトの名無しさん
2021/10/19(火) 15:27:28.34ID:0LtRxxZs そもそも全部書き直すならLinuxを冠する意味が・・・
774デフォルトの名無しさん
2021/10/19(火) 16:06:41.74ID:9axoCOPN 何で?
(全部書き直すなど誰も言ってないけど理由を聞いてみたい)
(全部書き直すなど誰も言ってないけど理由を聞いてみたい)
775デフォルトの名無しさん
2021/10/19(火) 16:12:52.85ID:473S9WY0 うん、それ、RustでLinuxを作り直してるんじゃなくて、元々のLinuxをベースにして、新しい機能をRustで開発しようとしているプロジェクトでしょ
776デフォルトの名無しさん
2021/10/19(火) 18:28:24.83ID:lJqU9SJa 嘘つき
777デフォルトの名無しさん
2021/10/19(火) 18:57:21.27ID:C9DkQou5 日本語不自由どころか
頭が不自由だと拝察します
頭が不自由だと拝察します
778デフォルトの名無しさん
2021/10/19(火) 18:58:18.97ID:bh+xrreW panicは無事無くなったんかな。
779デフォルトの名無しさん
2021/10/19(火) 19:07:22.39ID:0VPrblkh 彡 ⌒ ミ
(´・ω・`) 頭が不自由という言葉が引っかかったので飛んできました
(´・ω・`) 頭が不自由という言葉が引っかかったので飛んできました
780デフォルトの名無しさん
2021/10/19(火) 19:29:57.38ID:k3wLx80J 彡 ⌒ ミ
(´・ω・`) 飛ぶとかカッパの風上にも置けんな、泳げや
(´・ω・`) 飛ぶとかカッパの風上にも置けんな、泳げや
781デフォルトの名無しさん
2021/10/19(火) 20:33:01.03ID:q+n6NKoj >>778
アロケーターのpanicのことなら7月に出たパッチでなくなったみたい
https://lore.kernel.org/lkml/20210704202756.29107-1-ojeda@kernel.org/
アロケーターのpanicのことなら7月に出たパッチでなくなったみたい
https://lore.kernel.org/lkml/20210704202756.29107-1-ojeda@kernel.org/
782デフォルトの名無しさん
2021/10/19(火) 20:49:57.64ID:XSR/7M6W C++erはほんとゴシップ談義が好きやな
Rustスレにまでそのカルチャー持ち込まんで欲しいわ
Rustスレにまでそのカルチャー持ち込まんで欲しいわ
783デフォルトの名無しさん
2021/10/19(火) 21:31:52.96ID:3gMaYVXy ペチパーと大差ないからな
784デフォルトの名無しさん
2021/10/20(水) 10:48:38.28ID:kKtRU0ug ターゲットも開発者も丸かぶりだからしゃあない
785デフォルトの名無しさん
2021/10/20(水) 13:23:40.75ID:nZj/SCQk で、非同期ライブラリはどれが標準になるのよ?
786デフォルトの名無しさん
2021/10/20(水) 13:24:10.28ID:nZj/SCQk で、非同期ライブラリはどれが標準になるのよ?
787デフォルトの名無しさん
2021/10/20(水) 13:29:36.31ID:4F9a+p6K tokio
788デフォルトの名無しさん
2021/10/20(水) 16:05:21.56ID:Ojn1Tksn std
789デフォルトの名無しさん
2021/10/20(水) 18:46:14.43ID:2vbfBLJv どっちでもいいけど、インターフェースは統一して欲しいな。
今のところtokioか優勢みたいね。
今のところtokioか優勢みたいね。
790デフォルトの名無しさん
2021/10/20(水) 21:12:16.85ID:rAmGIrdk std::sync::mpsc ってなんで send がノンブロッキングなんだろうなぁ。
791デフォルトの名無しさん
2021/10/20(水) 23:01:04.88ID:Px+syONf ブロッキングなSenderがほしいならchannel_sync使うんだべさ
792デフォルトの名無しさん
2021/10/20(水) 23:32:51.88ID:4F9a+p6K ブロッキングとかノンブロッキングとか何度か解説読んだ気がするけど意味がわからないわ
793デフォルトの名無しさん
2021/10/21(木) 00:05:01.15ID:5bux1k1I 迷惑な香具師だな
794デフォルトの名無しさん
2021/10/21(木) 02:48:53.14ID:rcBT1TlJ おまいら mut のことを何て呼んでる?
俺は心の中でムットと呼んでいる
俺は心の中でムットと呼んでいる
795デフォルトの名無しさん
2021/10/21(木) 02:53:24.97ID:4380fmPV ミュータブルの略なので……
796デフォルトの名無しさん
2021/10/21(木) 03:47:37.11ID:mWga6xPa インテジャーはイント
キャラクターはチャー
なんだから、ムットでも何でも好きに呼べばよろし
ちなみに俺は心の中でムトゥと踊る^H^H呼んでる
キャラクターはチャー
なんだから、ムットでも何でも好きに呼べばよろし
ちなみに俺は心の中でムトゥと踊る^H^H呼んでる
797デフォルトの名無しさん
2021/10/21(木) 08:50:47.46ID:rE4toNa0 マッだろjk
798デフォルトの名無しさん
2021/10/21(木) 08:54:53.70ID:NOaHdDiV マットな
799デフォルトの名無しさん
2021/10/21(木) 11:02:50.76ID:s+STdMnX cv::Mat は?
800デフォルトの名無しさん
2021/10/21(木) 13:03:22.69ID:rHBxJh+b >>799
メアット
メアット
801デフォルトの名無しさん
2021/10/21(木) 13:17:43.38ID:rE4toNa0 メッ
802デフォルトの名無しさん
2021/10/21(木) 15:58:29.41ID:X5IbXF0A そんなくだらない疑問より誰か>>758に答えてくれませんでしょうか
803デフォルトの名無しさん
2021/10/21(木) 16:23:52.35ID:iSzsEmw9804デフォルトの名無しさん
2021/10/21(木) 16:35:52.56ID:wNducfW7 うんこすれっど
805デフォルトの名無しさん
2021/10/21(木) 19:56:22.82ID:wPmlSLSw806デフォルトの名無しさん
2021/10/23(土) 00:54:23.67ID:pgS4Ah89 Rust 1.56.0 リリース!
https://tech-blog.optim.co.jp/entry/2021/10/22/080000
https://tech-blog.optim.co.jp/entry/2021/10/22/080000
807デフォルトの名無しさん
2021/10/23(土) 01:45:44.26ID:BVy1/we8 let x = f64::cos(3.14);
みたいなのをf64::を省略して書きたいのですがどうすればよいですか?
use f64::cos; みたいなことはダメなようです
みたいなのをf64::を省略して書きたいのですがどうすればよいですか?
use f64::cos; みたいなことはダメなようです
808デフォルトの名無しさん
2021/10/23(土) 12:44:59.32ID:rv17aNSC 1回はf64と言わないと伝わらないので
let p = 3.14_f64;
let x = p.cos();
let p = 3.14_f64;
let x = p.cos();
809デフォルトの名無しさん
2021/10/23(土) 14:40:08.49ID:BVy1/we8 すみません、p.cos()の記法がなんかイヤでcos(p)みたいな記法をしたいってことでした
810デフォルトの名無しさん
2021/10/23(土) 18:48:04.65ID:/3ucisXu use f64
でだめなら無理じゃね
でだめなら無理じゃね
811デフォルトの名無しさん
2021/10/23(土) 18:52:41.89ID:qtW8jcI5 modなら確かにuseで省略できるけど
Box::newのBox::を省略したいみたいな話だしなあ
Box::newのBox::を省略したいみたいな話だしなあ
812デフォルトの名無しさん
2021/10/23(土) 18:55:33.73ID:qhVW7VS5 fn cos(x: f64) -> f64 {
f64::cos(x)
}
cos(3.14)
素直にp.cos()のほうがいいとは思う
f64::cos(x)
}
cos(3.14)
素直にp.cos()のほうがいいとは思う
813デフォルトの名無しさん
2021/10/23(土) 18:55:43.78ID:rVbtEKl1 let cos = f64::cos;
ならいける
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=3c7b96b61723e46d132c9e0f2d46911b
ならいける
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=3c7b96b61723e46d132c9e0f2d46911b
814デフォルトの名無しさん
2021/10/23(土) 19:43:20.47ID:2qA+vCFq fn main() {
println!("{}", cos(&32));
println!("{}", cos(&4.5))
}
trait GetDouble {
fn get_double(&self) -> f64;
}
fn cos(num: &dyn GetDouble) -> f64 {
f64::cos(num.get_double())
}
impl GetDouble for f64 {
fn get_double(&self) -> f64 {
*self
}
}
impl GetDouble for i32 {
fn get_double(&self) -> f64 {
f64::from(*self)
}
}
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=cb0e5606622069ca33b0ef0971fa94b4
これでいこう
println!("{}", cos(&32));
println!("{}", cos(&4.5))
}
trait GetDouble {
fn get_double(&self) -> f64;
}
fn cos(num: &dyn GetDouble) -> f64 {
f64::cos(num.get_double())
}
impl GetDouble for f64 {
fn get_double(&self) -> f64 {
*self
}
}
impl GetDouble for i32 {
fn get_double(&self) -> f64 {
f64::from(*self)
}
}
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=cb0e5606622069ca33b0ef0971fa94b4
これでいこう
815デフォルトの名無しさん
2021/10/23(土) 20:42:27.27ID:qhVW7VS5 ジェネリックにしたいならIntoでいいんじゃないかな
fn cos(x: impl Into<f64>) -> f64 {
f64::cos(x.into())
}
fn cos(x: impl Into<f64>) -> f64 {
f64::cos(x.into())
}
816デフォルトの名無しさん
2021/10/23(土) 20:49:05.66ID:+aPgOjd/ ジェネリックにしたいなら戻り値も引数に合わせたいのでは
num_traits::Float::cos など使うべき
https://docs.rs/num-traits/0.2.14/num_traits/float/trait.Float.html#tymethod.cos
num_traits::Float::cos など使うべき
https://docs.rs/num-traits/0.2.14/num_traits/float/trait.Float.html#tymethod.cos
817デフォルトの名無しさん
2021/10/24(日) 14:23:12.50ID:eQqSgpa/ 文法でrustとc++/cが似ているって言うやつは何をもって似ていると言っているだろう
ムーブセマンティクスがデフォだし、classはない、for文はイテレータだし、変数と関数の宣言の違いがはっきりしているし
何よりも型は前置じゃないし
ムーブセマンティクスがデフォだし、classはない、for文はイテレータだし、変数と関数の宣言の違いがはっきりしているし
何よりも型は前置じゃないし
818デフォルトの名無しさん
2021/10/24(日) 14:52:08.66ID:spG6Bthy C++とスクリプト言語ぐらいしか知らないんじゃないの?
819デフォルトの名無しさん
2021/10/24(日) 14:55:21.00ID:lUSERxty820デフォルトの名無しさん
2021/10/24(日) 14:56:01.04ID:lUSERxty C/C++というよりC familyに似せたと言っていたからちょっとニュアンスは違ってくるか
821デフォルトの名無しさん
2021/10/24(日) 15:13:22.96ID:eQqSgpa/ >>819
ソースをくれ
公式で構文を似せたとか言っていないと思うが
C++: references, RAII, smart pointers, move semantics, monomorphization, memory model
https://doc.rust-lang.org/reference/influences.html
ソースをくれ
公式で構文を似せたとか言っていないと思うが
C++: references, RAII, smart pointers, move semantics, monomorphization, memory model
https://doc.rust-lang.org/reference/influences.html
822デフォルトの名無しさん
2021/10/24(日) 15:37:41.12ID:IF6Ria+p 型名がintならc++ぽいというのはなんか違うんだよね
->とか<<<とか気持ち悪いことをし始めたらc++感が出てくる
->とか<<<とか気持ち悪いことをし始めたらc++感が出てくる
823デフォルトの名無しさん
2021/10/24(日) 15:38:30.82ID:lUSERxty >>821
http://web.archive.org/web/20150401014855/http://doc.rust-lang.org/nightly/intro.html
> you may find the syntax easier if you've used a "curly brace" programming language before, like C or JavaScript
確かに似せたとまでは言ってなかった
generics の angle bracket についてはコアメンバーが言及してるしC++の影響受けてると言って良いと思う
https://old.reddit.com/r/rust/comments/6l9mpe/minor_rant_i_wish_rust_had_gone_with_square/
http://web.archive.org/web/20150401014855/http://doc.rust-lang.org/nightly/intro.html
> you may find the syntax easier if you've used a "curly brace" programming language before, like C or JavaScript
確かに似せたとまでは言ってなかった
generics の angle bracket についてはコアメンバーが言及してるしC++の影響受けてると言って良いと思う
https://old.reddit.com/r/rust/comments/6l9mpe/minor_rant_i_wish_rust_had_gone_with_square/
824デフォルトの名無しさん
2021/10/24(日) 15:44:23.48ID:zP2CpnNP C++ iostream の << 演算子をパクらなかったのは、やっぱりあれが失敗作だからだよね
825デフォルトの名無しさん
2021/10/24(日) 15:46:45.70ID:IF6Ria+p826デフォルトの名無しさん
2021/10/24(日) 16:28:47.34ID:snvhdKAH よくある質問
RustはLLVMの上に構築されており、LLVMから見てClangっぽく見えるように頑張っているので、LLVMの
性能が向上したらRustの性能向上にもつながります。
https://prev.rust-lang.org/ja-JP/faq.html
RustはLLVMの上に構築されており、LLVMから見てClangっぽく見えるように頑張っているので、LLVMの
性能が向上したらRustの性能向上にもつながります。
https://prev.rust-lang.org/ja-JP/faq.html
827デフォルトの名無しさん
2021/10/24(日) 16:53:50.00ID:RHSebvs6 見た目はC++に似ているかも知れないけどML系列の方が近いんじゃない?
コンパイラがうるさいところとか「コンパイルが通れば大体動く」という感触はHaskellに近い
Vecに限定したくないなあとか関数に分けると型表記が面倒だなあとかはHaskellには無かったけど
コンパイラがうるさいところとか「コンパイルが通れば大体動く」という感触はHaskellに近い
Vecに限定したくないなあとか関数に分けると型表記が面倒だなあとかはHaskellには無かったけど
828デフォルトの名無しさん
2021/10/24(日) 17:08:25.09ID:6Jy8RsQO move semanticsとかcall by ref(not call by val in terms of ptr)とかは他のスクリプトではないの多いしな(rakuぐらいじゃね?)
糞みたいに面倒なbig fiveとか書いて来てるc++ちゃんと理解してる連中はrustの基本部分の理解はかなり早そう
記法は全然似てないてかerror handlerの部分とか全くの別物になってるしな
比較的若いgoとかktとかの方が書いててなんとなく似てる様な気もする(´・ω・`)
糞みたいに面倒なbig fiveとか書いて来てるc++ちゃんと理解してる連中はrustの基本部分の理解はかなり早そう
記法は全然似てないてかerror handlerの部分とか全くの別物になってるしな
比較的若いgoとかktとかの方が書いててなんとなく似てる様な気もする(´・ω・`)
829デフォルトの名無しさん
2021/10/24(日) 17:32:03.31ID:spG6Bthy もう長いことC++書いてないけど、考えれば考えるほどC++つらいわ。昔の自分はよく書いてたな
830デフォルトの名無しさん
2021/10/24(日) 17:59:25.66ID:tj18qr6S 本当はMLが好きな人がMozillaでC++書かされるのに疲れた結果生まれた言語なのでMLやC++の要素を併せ持つのは必然
831デフォルトの名無しさん
2021/10/24(日) 20:02:44.06ID:WKsYUqIz >>828
GoやKotlinに似てたらc系列ぐらいの雑さでしょ
GoやKotlinに似てたらc系列ぐらいの雑さでしょ
832デフォルトの名無しさん
2021/10/24(日) 21:17:24.37ID:8hWi5KuQ ChromeよりMozillaの方が性能良いことが、Rustを使うべきである証明になってるのでは?
833デフォルトの名無しさん
2021/10/24(日) 22:01:13.83ID:zrg/m0jp 流石に乱暴すぎる
834デフォルトの名無しさん
2021/10/24(日) 22:21:07.85ID:HVo+cqVA Chrome も Rust 使おうみたいな話なかったっけ
835デフォルトの名無しさん
2021/10/24(日) 22:21:39.42ID:spG6Bthy セルフホストされるまではOCamlで書かれてたので、Chromeより性能の良いMozillaを作ったRustを最初に実装したOCamlを使うべき証明になってるのでは?
836デフォルトの名無しさん
2021/10/24(日) 22:28:24.77ID:P21IrDZK chromeユーザーだけどfirefoxの方が性能いいってマジなんか?
837デフォルトの名無しさん
2021/10/24(日) 22:49:18.90ID:IF6Ria+p https://amethyst.rs/posts/amethyst--starting-fresh
アメジストが死んだ... エンダァァァァァァァァァァァァァイヤァァァァァァ
rustのゲームエンジンはbevy一強になるのか
アメジストが死んだ... エンダァァァァァァァァァァァァァイヤァァァァァァ
rustのゲームエンジンはbevy一強になるのか
838デフォルトの名無しさん
2021/10/24(日) 23:27:29.19ID:q0uVfP5C GUIのツールキットはよ(`・ω・´ )
839デフォルトの名無しさん
2021/10/24(日) 23:30:13.19ID:zP2CpnNP ちゃんとリリースまでたどり着いたrustのゲームってあるの?
840デフォルトの名無しさん
2021/10/24(日) 23:47:38.31ID:IF6Ria+p841デフォルトの名無しさん
2021/10/24(日) 23:55:17.08ID:J36a/Om9842デフォルトの名無しさん
2021/10/25(月) 00:09:38.02ID:dMwiicPm >>841
shellのリダイレクトに似てると思ったからだろ
shellのリダイレクトに似てると思ったからだろ
843デフォルトの名無しさん
2021/10/25(月) 00:21:35.96ID:dRHq7DJG >>841
当時の C++ には可変長引数を現代的な型システムの枠組みで扱う方法がなかった。
(C++11 からは variadic template がある。 これも今となっては現代的と言えるかどうか……。)
新しいオブジェクトを追加したときにオーバーロードが可能である必要など
の諸々の事情が積み重なって演算子オーバーロードの仕組みを使うのが妥当という結論になり、
オーバーロード可能な演算子の中で比較的それらしく見えるのが << だったという経緯。
記法だけなら printf で不満は出なかっただろうけど、
printf (というか C の可変長引数の仕組み) は型システム的な保護が全然できないぶっ壊れなので
それを是とすることも出来なかった。 (廃止もしなかったけど。)
良くはないが他にどうにも出来なかったんだよ。
当時の C++ には可変長引数を現代的な型システムの枠組みで扱う方法がなかった。
(C++11 からは variadic template がある。 これも今となっては現代的と言えるかどうか……。)
新しいオブジェクトを追加したときにオーバーロードが可能である必要など
の諸々の事情が積み重なって演算子オーバーロードの仕組みを使うのが妥当という結論になり、
オーバーロード可能な演算子の中で比較的それらしく見えるのが << だったという経緯。
記法だけなら printf で不満は出なかっただろうけど、
printf (というか C の可変長引数の仕組み) は型システム的な保護が全然できないぶっ壊れなので
それを是とすることも出来なかった。 (廃止もしなかったけど。)
良くはないが他にどうにも出来なかったんだよ。
844デフォルトの名無しさん
2021/10/25(月) 00:30:55.79ID:dRHq7DJG 歴史が長くなるとしょうもない事情の積み重ねでグダグダになるのもよくあること。
Rust もいずれはそうなる。 そしてそのときは新しい何かで置き換えられるんだよ。
でも Rust の場合は Edition という区切りで新しい Rust 自身で置き換えつつ
過去の Rust とも共存することを最初から意図したデザインにしているので
比較的長く維持されるんじゃないかな。
Rust もいずれはそうなる。 そしてそのときは新しい何かで置き換えられるんだよ。
でも Rust の場合は Edition という区切りで新しい Rust 自身で置き換えつつ
過去の Rust とも共存することを最初から意図したデザインにしているので
比較的長く維持されるんじゃないかな。
845デフォルトの名無しさん
2021/10/25(月) 10:06:46.78ID:vPVmdF1Z 実際、型安全であるiostreamよりprintfのがよっぽどマシって議論はある。
しょーもない技術要素よりも視認性のがよっぽど大事だったりするわけで。
しょーもない技術要素よりも視認性のがよっぽど大事だったりするわけで。
846デフォルトの名無しさん
2021/10/25(月) 11:11:20.41ID:DCgj0YIV >>840
iced日本語入力できなくない?
iced日本語入力できなくない?
847デフォルトの名無しさん
2021/10/25(月) 11:14:28.05ID:vmRZrQEp >>827
>「コンパイルが通れば大体動く」という感触はHaskellに近い
C/C++でも「コンパイルが通れば大体動く」けど
Haskellはコンパイル時にアルゴリズムミスまでチェックしてくれるのか?
>「コンパイルが通れば大体動く」という感触はHaskellに近い
C/C++でも「コンパイルが通れば大体動く」けど
Haskellはコンパイル時にアルゴリズムミスまでチェックしてくれるのか?
848デフォルトの名無しさん
2021/10/25(月) 11:32:11.39ID:dMwiicPm 単にHaskellはC/C++よりも型安全性の度合いが強いってこと言いたいんだろ
849デフォルトの名無しさん
2021/10/25(月) 11:51:09.02ID:fl6GjyRy >>846
Font読み込めば出来るっぽいよ
Font読み込めば出来るっぽいよ
850デフォルトの名無しさん
2021/10/25(月) 12:13:25.40ID:Zg5tRANc >>847
アスペルガーか?
アスペルガーか?
851デフォルトの名無しさん
2021/10/25(月) 15:20:38.75ID:YZjFvrvy Rustでゲームエンジン作ったら億万長者になれるのかな
852デフォルトの名無しさん
2021/10/25(月) 17:18:01.27ID:uPCS+ug6 UnityやUnreal Engine並のを作れるならできるんじゃね
さもなきゃプロプライエタリなエンジンなんてきょうび流行らん
さもなきゃプロプライエタリなエンジンなんてきょうび流行らん
853デフォルトの名無しさん
2021/10/25(月) 17:29:16.50ID:SuqdiOg2 Rustの方が圧倒的に高速なら儲かるんじゃね?
知らんけど
知らんけど
854デフォルトの名無しさん
2021/10/25(月) 17:42:54.30ID:dQPM/Zr0 C++に勝てると思ってるの?
855デフォルトの名無しさん
2021/10/25(月) 18:33:26.15ID:WHGdQ2cY フラッピーバードでも億稼げるんだからいけるいける
856デフォルトの名無しさん
2021/10/25(月) 18:38:23.54ID:SAo0WBxS もうインディー2Dゲームぐらいはリリースされてるのかと思ったけど
まだなのか
まだなのか
857デフォルトの名無しさん
2021/10/25(月) 19:12:07.52ID:rY5vWaGm >>851
億万の金とリソースをかけなきゃ使い物になるエンジンなんて作れないんじゃないの?
まあ、そこまでいかなくともユーザーのいる既存のツールで開発止まっているもの(MMDとか)のクローン作ればワンチャンあるかもね。
億万の金とリソースをかけなきゃ使い物になるエンジンなんて作れないんじゃないの?
まあ、そこまでいかなくともユーザーのいる既存のツールで開発止まっているもの(MMDとか)のクローン作ればワンチャンあるかもね。
858デフォルトの名無しさん
2021/10/25(月) 20:03:31.88ID:cubP7NbG ゲームエンジンでボトルネックとなるような重い処理ってなんなの
描画関連が重いならGPU側処理がメインでCPUで動くプログラムは何で書いても良いのでは
描画関連が重いならGPU側処理がメインでCPUで動くプログラムは何で書いても良いのでは
859デフォルトの名無しさん
2021/10/25(月) 20:21:36.23ID:tU+lYK+H 行列計算とメモリー帯域、PS5とPCを比べれば一目瞭然。PC4-25600でさえメモリー帯域が25GB/sで
デュアルチャネルで50GB/s、PS5は帯域幅218GB/s、
つまり描画が重いのではなく、CPUやGPUで行列計算した結果をメモリーへ格納したり再び取り出したりが重い。
描画だけなら4K再生できるVRAMの速度だけで終わる話
デュアルチャネルで50GB/s、PS5は帯域幅218GB/s、
つまり描画が重いのではなく、CPUやGPUで行列計算した結果をメモリーへ格納したり再び取り出したりが重い。
描画だけなら4K再生できるVRAMの速度だけで終わる話
860デフォルトの名無しさん
2021/10/25(月) 20:24:03.79ID:RLuxZR0I >>851
儲かるかは知らんがbevy engineの作者はお賽銭で40万/月貰っているぞ
儲かるかは知らんがbevy engineの作者はお賽銭で40万/月貰っているぞ
861デフォルトの名無しさん
2021/10/25(月) 22:52:02.92ID:JVD00Zwu ゲーム1本も出てないってそれなんかデカイ問題あるんじゃないの。
使ってみたら、あれこれ全然意味ないわ的な。
使ってみたら、あれこれ全然意味ないわ的な。
862デフォルトの名無しさん
2021/10/25(月) 23:04:10.31ID:WHGdQ2cY そらまあUnityとかみたいなガチゲームエンジンとかと比べたら意味ないんじゃね
863デフォルトの名無しさん
2021/10/26(火) 00:13:42.72ID:T+NfAItu ゲームとか組み込みと並んで過去の資産が積み上がっているところだろう
現状グラフィックAPIなどのバックエンドは全部C/C++だぞ
一朝一夕の話ではないが、取り組み続ける必要がある
とりあえずコールオブデューティのTreyarchは触っているぽい
現状グラフィックAPIなどのバックエンドは全部C/C++だぞ
一朝一夕の話ではないが、取り組み続ける必要がある
とりあえずコールオブデューティのTreyarchは触っているぽい
864デフォルトの名無しさん
2021/10/26(火) 00:19:35.84ID:T+NfAItu インディ→ue4かunity
大手→ゲームの開発スパン3-4年+ゲームエンジン開発期間
今から積極的取り組んでも公表できる成果ができるは8-10年じゃない
そういえば任天堂もrust人材を募集してたよ
大手→ゲームの開発スパン3-4年+ゲームエンジン開発期間
今から積極的取り組んでも公表できる成果ができるは8-10年じゃない
そういえば任天堂もrust人材を募集してたよ
865デフォルトの名無しさん
2021/10/26(火) 09:14:11.61ID:1uavI5d4 カスタムアロケータ回りがしょぼいからガチのゲームエンジン用としては現状まだきついのでは
866デフォルトの名無しさん
2021/10/26(火) 09:43:34.49ID:AMOvMfiW たしかにコンシューマゲーム会社なんかがRust採用を進めていく、ってのはなんかありそうだね
プロダクトのプロトタイプ作成とかめっちゃあると思うんだけど、そういうのとかで、どんどん試してみて欲しい
彼らがRustコミュニティに貢献してくれるのか、っていうとなんか怪しい気はするけど
プロダクトのプロトタイプ作成とかめっちゃあると思うんだけど、そういうのとかで、どんどん試してみて欲しい
彼らがRustコミュニティに貢献してくれるのか、っていうとなんか怪しい気はするけど
867デフォルトの名無しさん
2021/10/26(火) 11:03:35.61ID:ftLfN9xo 最近はマイコンもセキュリティ機能が重要視されているけど
処理系は相変わらずC/C++でRustを推進みたいな流れにはなっていない矛盾
処理系は相変わらずC/C++でRustを推進みたいな流れにはなっていない矛盾
868デフォルトの名無しさん
2021/10/26(火) 11:18:59.50ID:BJDScnmh そもそも組み込みで使えるrustコンパイラがないからな
869デフォルトの名無しさん
2021/10/26(火) 12:47:26.53ID:hwHjfkE+ 限定的ながらCortex-M用のバックエンドがあるじゃん
870デフォルトの名無しさん
2021/10/26(火) 13:14:38.26ID:I5hwU/3x 俺のH8はどうなるんや
871デフォルトの名無しさん
2021/10/26(火) 14:24:23.79ID:ZxZWHA9I LLVMバックエンドがあるならなんとかできるのでは
ないなら知らん
ないなら知らん
872デフォルトの名無しさん
2021/10/26(火) 15:31:08.95ID:bUwN0t0N >>870
RL78に乗り換えてどうぞ。LLVMバックエンドもあるよ
RL78に乗り換えてどうぞ。LLVMバックエンドもあるよ
873デフォルトの名無しさん
2021/10/26(火) 15:43:31.64ID:BNqSw8pO 僕はRX-78-2からRX-78NT-1に乗り換えたよ
みんなもそうしなよ
みんなもそうしなよ
874デフォルトの名無しさん
2021/10/26(火) 15:50:06.56ID:BJDScnmh 嘘だと言ってよバーニィ
875デフォルトの名無しさん
2021/10/26(火) 15:54:33.07ID:BJDScnmh 真面目な話Green Hillsが対応したら組み込みでも大分状況変わると思うんだが
なんか内部では研究してるみたいだし
なんか内部では研究してるみたいだし
876デフォルトの名無しさん
2021/10/26(火) 16:50:59.50ID:BwJyZYHo ルネサスは近年arm32bitとしてraファミリ出してる。h8とかsuperhな人は今すぐ乗り換えろ
877デフォルトの名無しさん
2021/10/26(火) 17:52:31.12ID:9Njhbr90878デフォルトの名無しさん
2021/10/26(火) 20:33:41.25ID:T+NfAItu >>865
基本カスタムアロケータは自作では?
基本カスタムアロケータは自作では?
879デフォルトの名無しさん
2021/10/26(火) 21:43:49.66ID:BJDScnmh アロケータ自作は大げさじゃないか
heaplessクレートでどうにかなるんじゃないかな
オレは使ったことないけど
heaplessクレートでどうにかなるんじゃないかな
オレは使ったことないけど
880デフォルトの名無しさん
2021/10/26(火) 21:51:14.59ID:PDIGoDZx Unityでいけるくらいならデフォルトのアロケータで十分では?
jemallocとかに切り替えてもいいけど、どちらにしても自作するほどかね
jemallocとかに切り替えてもいいけど、どちらにしても自作するほどかね
881デフォルトの名無しさん
2021/10/26(火) 21:59:07.68ID:zVG+0sad うんこ
882デフォルトの名無しさん
2021/10/26(火) 22:58:46.15ID:Fg4TonRG Unity使うなら内部のGCはBoehm GCなんだからGC_MALLOC使ったほうが良いのでは?
オレはRc<T>使いながらBoehmが使えるのか知らんけど
オレはRc<T>使いながらBoehmが使えるのか知らんけど
883デフォルトの名無しさん
2021/10/27(水) 00:00:42.78ID:6YxZEOiV 別にゲームにカスタムアロケータが必須なんてことはないと思うが
UnityみたいにGCありの言語で書く場合にGCのスパイクが許容できないから
独自のメモリプールとかを書かざるを得ないのでは
それともC++でもアロケータ自作してるのか?
UnityみたいにGCありの言語で書く場合にGCのスパイクが許容できないから
独自のメモリプールとかを書かざるを得ないのでは
それともC++でもアロケータ自作してるのか?
884デフォルトの名無しさん
2021/10/27(水) 00:23:45.53ID:c5Twcn5s UnityってBoehm GCなんだ?
それで十分動くんならRustにもGCあってもよかったんじゃない?
それで十分動くんならRustにもGCあってもよかったんじゃない?
885デフォルトの名無しさん
2021/10/27(水) 00:29:03.79ID:QIbcJ+ZF ならGo使えば良くない?
886デフォルトの名無しさん
2021/10/27(水) 00:46:21.16ID:l1Jw+QgM goはboehmじゃなく2017年ごろまでtcmallocで今は派生(随分、中身が違う)してるはず
887デフォルトの名無しさん
2021/10/27(水) 07:18:35.73ID:4kTRaQF8 Boehmてストップザ・ワールドは起こらんの?
888デフォルトの名無しさん
2021/10/27(水) 08:48:37.83ID:NxiqMK2Z Boehmってカタカナ的には何て読むの?
889デフォルトの名無しさん
2021/10/27(水) 09:08:54.86ID:CWN4UblG ボエヒムじゃないの?
890デフォルトの名無しさん
2021/10/27(水) 10:46:43.20ID:OgmKOgHT ベームかボームだろ、ボエヒムとかワロタw
891デフォルトの名無しさん
2021/10/27(水) 11:14:08.33ID:7BguKBbd ドラクエの呪文みたいだな
892デフォルトの名無しさん
2021/10/27(水) 11:35:17.90ID:Ru0zcXw7 ドイツ語のoeは日本語ではエって転写される
893デフォルトの名無しさん
2021/10/27(水) 12:01:22.63ID:dNMmh9m9 Phoenix
894デフォルトの名無しさん
2021/10/27(水) 12:11:52.89ID:AHUxp5wd 412 名前: 以下、名無しにかわりましてVIPがお送りします 投稿日: 2013/01/19(土) 21:03:25.42 ID:a2pD/tlo0
FランのFはフェニックスのFや!
例えこんなところで落ちぶれても不死鳥のごとく上流階級に返り咲くんや!!
414 名前: 以下、名無しにかわりましてVIPがお送りします 投稿日: 2013/01/19(土) 21:04:02.87 ID:dT9mn0sK0
>>412
フェニックスは「phoenix」
FランのFはフェニックスのFや!
例えこんなところで落ちぶれても不死鳥のごとく上流階級に返り咲くんや!!
414 名前: 以下、名無しにかわりましてVIPがお送りします 投稿日: 2013/01/19(土) 21:04:02.87 ID:dT9mn0sK0
>>412
フェニックスは「phoenix」
895デフォルトの名無しさん
2021/10/27(水) 14:01:22.92ID:t2iD5tO8 cafe la boheme
896デフォルトの名無しさん
2021/10/28(木) 12:12:05.45ID:hM84Yf/1 >>887
スレチだが、Boehmなので本来はSTWだけなのでUnityにGCラグが発生していたことは有名ですが、2018/12頃に
インクリメンタルGCが出来て改善された。
https://blog.unity.com/technology/feature-preview-incremental-garbage-collection
またUnityでゲームなどを作るときに良くやるのがGCを動かさないこと(=オブジェクトを破棄しない)で
オブジェクトプールを使用して1度作ったオブジェクトをプールして置き破棄させない方法など、Unityにある
文字列比較などを使用しないなど細かい事をやる。本末転倒といえばその通り
スレチだが、Boehmなので本来はSTWだけなのでUnityにGCラグが発生していたことは有名ですが、2018/12頃に
インクリメンタルGCが出来て改善された。
https://blog.unity.com/technology/feature-preview-incremental-garbage-collection
またUnityでゲームなどを作るときに良くやるのがGCを動かさないこと(=オブジェクトを破棄しない)で
オブジェクトプールを使用して1度作ったオブジェクトをプールして置き破棄させない方法など、Unityにある
文字列比較などを使用しないなど細かい事をやる。本末転倒といえばその通り
897デフォルトの名無しさん
2021/10/29(金) 02:30:41.55ID:dwfT6x3M 典型的なバッドノウハウだな
とはいえ日本でUnityが一番つかわれているであろう現場のモバイルゲーム開発は
昔はケータイJavaのゲーム開発やってた場合が多いのでその辺のGCバッドノウハウに慣れちゃってるという
Boehmはボエーンて読んでるわ
とはいえ日本でUnityが一番つかわれているであろう現場のモバイルゲーム開発は
昔はケータイJavaのゲーム開発やってた場合が多いのでその辺のGCバッドノウハウに慣れちゃってるという
Boehmはボエーンて読んでるわ
898デフォルトの名無しさん
2021/10/29(金) 02:58:27.64ID:j8WlttkF oe はドイツ語の o の代替綴りとしてあてられることが多い。
つまり boehm の本来の綴りは bohm ってことね。
o はオの口の音でエという感じなので音としては中途半端で、カタカナに当てはめにくい。
ドイツ語の発音通りをあえてカタカナにするならボェーンに聞こえるんだけど、
bohm という人名は通例ではベームと表記してるね。
つまり boehm の本来の綴りは bohm ってことね。
o はオの口の音でエという感じなので音としては中途半端で、カタカナに当てはめにくい。
ドイツ語の発音通りをあえてカタカナにするならボェーンに聞こえるんだけど、
bohm という人名は通例ではベームと表記してるね。
899デフォルトの名無しさん
2021/10/29(金) 02:58:48.47ID:j8WlttkF あれ? 2ch に投稿したらウムラウトが消えてる……。
900デフォルトの名無しさん
2021/10/29(金) 03:36:42.46ID:Ws4Kkx5X appleをアップルと記載するような文化やからね。カタカナにしてしまったら本来の発音との差異なんて気にしたらキリがない
901デフォルトの名無しさん
2021/10/29(金) 04:15:21.99ID:feAEAXNj 名女優のオードリー・ヘップバーンと
ローマ字表記のヘボン式で有名なヘボン氏が実は同じ綴り同じ発音の同じ姓みたいなもんか
ローマ字表記のヘボン式で有名なヘボン氏が実は同じ綴り同じ発音の同じ姓みたいなもんか
902デフォルトの名無しさん
2021/10/29(金) 05:16:40.74ID:eAaOJvH1 ドイチュ語と描いてない >>898 は失格
903デフォルトの名無しさん
2021/10/29(金) 21:33:27.38ID://DLIqvB まじかあ、これが可能だったのかあ
let v = vec![1, 2, 3];
println!("{}", v[if true { 1 } else { 2 }]);
let v = vec![1, 2, 3];
println!("{}", v[if true { 1 } else { 2 }]);
904デフォルトの名無しさん
2021/10/29(金) 23:53:13.86ID:3N24c0Lq905デフォルトの名無しさん
2021/10/30(土) 00:22:25.21ID:9U1YWI6I 音韻と音声は異なる。 ある言語で同じ音だと認められる音が音韻で、
たとえば日本語だとシンブンシという言葉に表れる二個のンは実際には違う音
なのに同じ音として処理している。
(だからヘボン式ローマ字では書き分けるルールになっている。)
音韻として同じでも音声として幅はあり、そして音韻は言語に依存するもんだから、
外国語の音を転写してくるとどう頑張ったって辻褄の合わない部分は出てくる。
たとえば日本語だとシンブンシという言葉に表れる二個のンは実際には違う音
なのに同じ音として処理している。
(だからヘボン式ローマ字では書き分けるルールになっている。)
音韻として同じでも音声として幅はあり、そして音韻は言語に依存するもんだから、
外国語の音を転写してくるとどう頑張ったって辻褄の合わない部分は出てくる。
906デフォルトの名無しさん
2021/10/30(土) 01:29:07.34ID:fDTZDMBU >>901
唐鳳は上手いよな
唐鳳は上手いよな
907デフォルトの名無しさん
2021/10/30(土) 02:41:12.91ID:z8LGC696 いつの間にか[T; N]にIntoIteratorがimplされてるな
しかも興味深いことにVec等と異なり消費されないようだ
借用ルール的にはどういう扱い?
しかも興味深いことにVec等と異なり消費されないようだ
借用ルール的にはどういう扱い?
908デフォルトの名無しさん
2021/10/30(土) 08:30:57.45ID:zPV0av3I イテレータが理解できないやつ定期的に湧くな
909デフォルトの名無しさん
2021/10/30(土) 09:56:39.69ID:gRDEN/XN 常駐
910デフォルトの名無しさん
2021/10/30(土) 11:34:48.67ID:cxTfS1zf >>902
ドイちェン
ドイちェン
911デフォルトの名無しさん
2021/10/30(土) 20:52:05.52ID:/cDwb9ic >>907
Rust 1.53.0で配列にIntoIteratorが実装された
あと識別子に日本語も使えるようになった
配列は要素がCopyを実装しているかどうかで所有権の扱いが変わる
#[derive(Debug,Clone,Copy)]
struct 構造体 {
値: isize,
}
fn main() {
let 配列 = [構造体{値:1}, 構造体{値:2}, 構造体{値:3}];
for 変数 in 配列 {
println!("{:?}", 変数);
}
println!("{:?}", 配列[0]);
}
例えばこれはコンパイルが通って動くけど
構造体のderiveのCopyを外すと
配列の所有権はfor in内部のinto_iter()で移動してしまいコンパイルが通らなくなる
Rust 1.53.0で配列にIntoIteratorが実装された
あと識別子に日本語も使えるようになった
配列は要素がCopyを実装しているかどうかで所有権の扱いが変わる
#[derive(Debug,Clone,Copy)]
struct 構造体 {
値: isize,
}
fn main() {
let 配列 = [構造体{値:1}, 構造体{値:2}, 構造体{値:3}];
for 変数 in 配列 {
println!("{:?}", 変数);
}
println!("{:?}", 配列[0]);
}
例えばこれはコンパイルが通って動くけど
構造体のderiveのCopyを外すと
配列の所有権はfor in内部のinto_iter()で移動してしまいコンパイルが通らなくなる
912デフォルトの名無しさん
2021/10/30(土) 21:00:13.45ID:zJlZfWf6 >>911
ぶっちゃけ日本語の識別子わかりやすいって思ってしまった
ぶっちゃけ日本語の識別子わかりやすいって思ってしまった
913デフォルトの名無しさん
2021/10/30(土) 22:32:29.50ID:EbhCJ5wH 日本語識別子わかりやすいんだけど入力に手間がかかるのがつらい
914デフォルトの名無しさん
2021/10/30(土) 23:29:17.10ID:s2ubgEFJ let v0 = vec![1, 2, 3];
let mut v1 = v0;
v1.push(120);
let mut v0 = vec![1, 2, 3];
let v1 = &mut v0;
v1.push(120);
所有権関連で試してみてるんだけど、この二つの違いってなんなん?
いまいちよくわからん
上のはmutでないvecをlet mutの変数に入れるとpushできてまうし
下のはlet mutでない変数なのに&mutでいれるとpushできてまう
let mut v1 = v0;
v1.push(120);
let mut v0 = vec![1, 2, 3];
let v1 = &mut v0;
v1.push(120);
所有権関連で試してみてるんだけど、この二つの違いってなんなん?
いまいちよくわからん
上のはmutでないvecをlet mutの変数に入れるとpushできてまうし
下のはlet mutでない変数なのに&mutでいれるとpushできてまう
915デフォルトの名無しさん
2021/10/30(土) 23:56:55.99ID:cJtJXOgj916デフォルトの名無しさん
2021/10/31(日) 00:40:09.42ID:ndmOeSWD >>914
それぞれpushした後にv0とv1がどうなってるか確認してみるとわかる
それぞれpushした後にv0とv1がどうなってるか確認してみるとわかる
917デフォルトの名無しさん
2021/10/31(日) 01:41:05.72ID:e5ZzvOAs うんこ荒らすな!
918デフォルトの名無しさん
2021/10/31(日) 02:16:55.91ID:HeT/GYnp すまんがVSCode + Rust-Analyzerで勉強中なんだけどさ
数ヶ月前は変数の型が表示されていたのに、今じゃ全然表示されなくなっちゃったんだけど・・・・どうすればいいんだぜ?
数ヶ月前は変数の型が表示されていたのに、今じゃ全然表示されなくなっちゃったんだけど・・・・どうすればいいんだぜ?
919デフォルトの名無しさん
2021/10/31(日) 03:00:17.77ID:9uKpC+QX int * constみたいなもん
参照先のアドレスは変更不可だけどそのアドレスが指してるvectorは&mutだから変更可能
参照先のアドレスは変更不可だけどそのアドレスが指してるvectorは&mutだから変更可能
920デフォルトの名無しさん
2021/10/31(日) 03:02:55.52ID:nF8ypkXG >>914
他の言語での余計な知識を捨て去ってゼロから考えるとわかりやすかったよ
今回の件で関係するルールは単純でこれだけかな?
【所有権】
・所有権を持てるのは一人だけ
・使う(=代入や関数引数も含まれる)と所有権は移動する
・ただしCopyトレイト実装型は使う時にCopyされるので所有権は移動しない
【所有権を持つ可変と非可変】
・その変数の中身を書き換える予定があるなら変数を可変(mut)に宣言しておく
・他の変数に代入しなおせば可変か非可変か変更可能(つまりその変数を使う時の制限ヒント)
【参照(=貸出=借用)】
・所有権が移動されたくなければ参照で貸し出す
・可変参照(&mut)の貸し出しは1人のみに参照独占で元も可変変数であること
・非可変参照(&)の貸し出しは同時に何人でも可能
・まとめるとsingle writer or multi readers
所有権を明確にするのはメモリ自動解放のため
可変を明確にするのは並行(concurrent)/並列(parallel)での競合回避のため
他の言語での余計な知識を捨て去ってゼロから考えるとわかりやすかったよ
今回の件で関係するルールは単純でこれだけかな?
【所有権】
・所有権を持てるのは一人だけ
・使う(=代入や関数引数も含まれる)と所有権は移動する
・ただしCopyトレイト実装型は使う時にCopyされるので所有権は移動しない
【所有権を持つ可変と非可変】
・その変数の中身を書き換える予定があるなら変数を可変(mut)に宣言しておく
・他の変数に代入しなおせば可変か非可変か変更可能(つまりその変数を使う時の制限ヒント)
【参照(=貸出=借用)】
・所有権が移動されたくなければ参照で貸し出す
・可変参照(&mut)の貸し出しは1人のみに参照独占で元も可変変数であること
・非可変参照(&)の貸し出しは同時に何人でも可能
・まとめるとsingle writer or multi readers
所有権を明確にするのはメモリ自動解放のため
可変を明確にするのは並行(concurrent)/並列(parallel)での競合回避のため
921デフォルトの名無しさん
2021/10/31(日) 07:46:34.10ID:dD8mFzoB922デフォルトの名無しさん
2021/10/31(日) 09:44:05.10ID:726CqcoT 所有権を伸ばして発音すると昇龍拳みたいに聞こえる
出掛かりが無敵なところも似てる
出掛かりが無敵なところも似てる
923デフォルトの名無しさん
2021/10/31(日) 09:51:39.37ID:5rE8GYET ヒカヘンサンショウ
924デフォルトの名無しさん
2021/10/31(日) 13:37:02.02ID:r7nTmIjE 丁寧で優しい920を弄りたくないけど、これを読める人は914のような質問はしないね
925デフォルトの名無しさん
2021/10/31(日) 13:58:11.88ID:yTUS2Zye 以下の関数をジェネリックにする方法ありますか?
fn is_one_two_three<A: AsRef<[isize]>>(a: A) {
assert_eq!(&[1, 2, 3], a.as_ref());
}
fn main() {
let a = [1, 2, 3];
is_one_two_three(a);
let a = vec![1, 2, 3];
is_one_two_three(a);
}
配列もVecも受け取る関数でこれはコンパイルも通り動いているのですが
isizeと型が決め打ちのところをジェネリックにTとしたいです
どうするとよいでしょうか?
fn is_one_two_three<A: AsRef<[isize]>>(a: A) {
assert_eq!(&[1, 2, 3], a.as_ref());
}
fn main() {
let a = [1, 2, 3];
is_one_two_three(a);
let a = vec![1, 2, 3];
is_one_two_three(a);
}
配列もVecも受け取る関数でこれはコンパイルも通り動いているのですが
isizeと型が決め打ちのところをジェネリックにTとしたいです
どうするとよいでしょうか?
926デフォルトの名無しさん
2021/10/31(日) 14:34:45.61ID:ZiqPaZpd >>925
数値型を一般化する trait を使うのが普通かな。
自分で定義しても良いが num_traits::FromPrimitive を使うならこんな感じ
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=1fbd536dd6c9ea76beb20a666b085190
数値型を一般化する trait を使うのが普通かな。
自分で定義しても良いが num_traits::FromPrimitive を使うならこんな感じ
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=1fbd536dd6c9ea76beb20a666b085190
927デフォルトの名無しさん
2021/10/31(日) 16:04:00.70ID:2p54m3kz >>914
気持ちの上では他の言語と対応付けるのではなく Rust のルールで理解すべきという点で >>920 に
同意ではあるんだが、そうは言っても知っていると引っ張られるのも仕方のない話で、
入門初期では多少はしょうがないとも思う。
あえて C++ で同等のものに置き換えるとするとこんな感じかな。
#include <vector>
int main(void) {
{
const std::vector<int> v0 = {1, 2, 3};
std::vector<int> v1 = v0;
v1.push_back(120);
}
{
std::vector<int> v0 = {1, 2, 3};
std::vector<int>* const v1 = &v0;
v1->push_back(120);
}
}
この場合は所有権の概念はあまり関係なくて
メソッド呼出しの演算子が参照を自動で調整してしまうのも混乱の原因になってる気がする。
mut が何にかかっているのか見えにくい。
気持ちの上では他の言語と対応付けるのではなく Rust のルールで理解すべきという点で >>920 に
同意ではあるんだが、そうは言っても知っていると引っ張られるのも仕方のない話で、
入門初期では多少はしょうがないとも思う。
あえて C++ で同等のものに置き換えるとするとこんな感じかな。
#include <vector>
int main(void) {
{
const std::vector<int> v0 = {1, 2, 3};
std::vector<int> v1 = v0;
v1.push_back(120);
}
{
std::vector<int> v0 = {1, 2, 3};
std::vector<int>* const v1 = &v0;
v1->push_back(120);
}
}
この場合は所有権の概念はあまり関係なくて
メソッド呼出しの演算子が参照を自動で調整してしまうのも混乱の原因になってる気がする。
mut が何にかかっているのか見えにくい。
928デフォルトの名無しさん
2021/10/31(日) 16:25:11.82ID:KIvWC7vb929デフォルトの名無しさん
2021/10/31(日) 16:52:46.17ID:2p54m3kz930デフォルトの名無しさん
2021/10/31(日) 17:14:21.91ID:WrAvX4Kw C++で考えるのは弊害しかないじゃん
何がしょうがないだよ
何がしょうがないだよ
931デフォルトの名無しさん
2021/10/31(日) 17:47:23.34ID:dE1SXutD 弊害しかないは言いすぎ
この場合mutをどこに付けると何が可変になるかの話だから
C++でconstをどこに付けると何が不変になるのかを例に出すのは自然なたとえだと思いますよ
この場合mutをどこに付けると何が可変になるかの話だから
C++でconstをどこに付けると何が不変になるのかを例に出すのは自然なたとえだと思いますよ
932デフォルトの名無しさん
2021/10/31(日) 21:58:15.04ID:4rIS02S1 let mut vec0 = vec![vec![0, 2, 3]; 3];
for mut i in vec0.iter_mut() {
i.push(9);
}
for mut i in &mut vec0 {
i.push(9);
}
この二つのループの意味は同じ?
こういう二つの書き方があるのでちょっとわかりにくい気がする
for mut i in vec0.iter_mut() {
i.push(9);
}
for mut i in &mut vec0 {
i.push(9);
}
この二つのループの意味は同じ?
こういう二つの書き方があるのでちょっとわかりにくい気がする
933デフォルトの名無しさん
2021/10/31(日) 22:14:30.87ID:4rIS02S1 へー、これが通るんだ
ちょっと笑った
let vec0 = vec![0, 2, 3];
let mut vec0 = vec0;
vec0.push(99);
ちょっと笑った
let vec0 = vec![0, 2, 3];
let mut vec0 = vec0;
vec0.push(99);
934デフォルトの名無しさん
2021/10/31(日) 22:21:16.21ID:xmsO/hLH >>933
シャドーイングだから当たり前でしょ
シャドーイングだから当たり前でしょ
935デフォルトの名無しさん
2021/10/31(日) 22:22:32.67ID:fTPwCWVK シャドーイングOKな言語でもlintが禁止してきてイラっとする
936デフォルトの名無しさん
2021/10/31(日) 22:31:01.48ID:4rIS02S1937デフォルトの名無しさん
2021/10/31(日) 22:44:51.38ID:2W4wB6er クソみたいな名前が増えないようにだよ
938デフォルトの名無しさん
2021/10/31(日) 22:57:25.82ID:Ou5/KoYl >>924
「関係するルールは単純でこれだけ」と言って関係ないものも含めて8個もルールを羅列するやつが丁寧で優しいわけがないよ
「関係するルールは単純でこれだけ」と言って関係ないものも含めて8個もルールを羅列するやつが丁寧で優しいわけがないよ
939デフォルトの名無しさん
2021/10/31(日) 23:04:28.74ID:4rIS02S1 >>937
変数名の再利用と状態変更はちがくね?
そもそも変更しないと宣言して変数をシャドーイングして変更可能にするのも疑問だけど、
まあそれは仕様だとして、それが変数名の再利用とは無関係じゃんね 再利用しない前提なんだから
変数名の再利用と状態変更はちがくね?
そもそも変更しないと宣言して変数をシャドーイングして変更可能にするのも疑問だけど、
まあそれは仕様だとして、それが変数名の再利用とは無関係じゃんね 再利用しない前提なんだから
940デフォルトの名無しさん
2021/10/31(日) 23:09:50.30ID:59hJVDPo もはや何言ってるかわからないレベル
941デフォルトの名無しさん
2021/11/01(月) 00:28:06.90ID:lB3Z2euD942デフォルトの名無しさん
2021/11/01(月) 00:30:02.23ID:cNNz1tH7 >>932
mut i ってmut必要だっけ
mut i ってmut必要だっけ
943デフォルトの名無しさん
2021/11/01(月) 01:16:30.92ID:FrHt6Y1+ >>932
> for mut i in vec0.iter_mut() {
> for mut i in &mut vec0 {
どちらもiは&mutになるので同じfor文になる
そしてlet mut i = &mut ... と書いている時と同じく左側のmutは不要(warning)
> for mut i in vec0.iter_mut() {
> for mut i in &mut vec0 {
どちらもiは&mutになるので同じfor文になる
そしてlet mut i = &mut ... と書いている時と同じく左側のmutは不要(warning)
944デフォルトの名無しさん
2021/11/01(月) 01:31:09.18ID:FrHt6Y1+ >>925
配列もVecも受け取る関数ならば
as_ref()でスライスに揃える方法だけでなく
配列もVecもそのままの型で使う方法もあり
どちらもa[i]の形はIndexトレイトで使えるので例えば
fn get_second_item<A: std::ops::Index<usize, Output=T>, T: Copy>(a: A) -> T {
a[1]
}
fn main() {
let a = [1.1, 2.2, 3.3];
assert_eq!(2.2, get_second_item(a));
let a = vec!["a", "b", "c"];
assert_eq!("b", get_second_item(a));
}
と配列/Vec側も中身のf64/&str側もジェネリックに書ける
配列もVecも受け取る関数ならば
as_ref()でスライスに揃える方法だけでなく
配列もVecもそのままの型で使う方法もあり
どちらもa[i]の形はIndexトレイトで使えるので例えば
fn get_second_item<A: std::ops::Index<usize, Output=T>, T: Copy>(a: A) -> T {
a[1]
}
fn main() {
let a = [1.1, 2.2, 3.3];
assert_eq!(2.2, get_second_item(a));
let a = vec!["a", "b", "c"];
assert_eq!("b", get_second_item(a));
}
と配列/Vec側も中身のf64/&str側もジェネリックに書ける
945デフォルトの名無しさん
2021/11/01(月) 08:15:24.70ID:Qg2QcgLf 背後にある考え方を説明せずにルールだけ教えても理解できないよ。
まあ、ルールに一貫したコンセプトがないんだったら「こういうものだ」と押し付けるしかないけど。
まあ、ルールに一貫したコンセプトがないんだったら「こういうものだ」と押し付けるしかないけど。
946デフォルトの名無しさん
2021/11/01(月) 23:13:41.76ID:PKaNA1In 可変の場合は面倒でもmutが必要ってしたほうがわかりやすいような気がするなあ
947デフォルトの名無しさん
2021/11/01(月) 23:57:09.03ID:HKf+kmzN let mut p = &mut q; の左辺mutを書くとwarningが出る理由は、pはmutではなく、あくまでも&mutであるためだろう。
つまり、そこに左辺mutを書いてしまう人はきちんと理解していないという意味ではなかろうか。
つまり、そこに左辺mutを書いてしまう人はきちんと理解していないという意味ではなかろうか。
948デフォルトの名無しさん
2021/11/02(火) 07:53:30.47ID:eth2zNwx let mut ~~はそこで定義される変数が可変(再代入可能)になるもので、
&mut ~~はそこで作成される参照が可変になる、という理解なんだけど、
どうもしっくり来てない。引数の宣言で&mutとつけるとどうなるの、とかすぐ出てこない。
&mut ~~はそこで作成される参照が可変になる、という理解なんだけど、
どうもしっくり来てない。引数の宣言で&mutとつけるとどうなるの、とかすぐ出てこない。
949デフォルトの名無しさん
2021/11/02(火) 08:18:58.33ID:gnq/E+lb let mutのmutはコード生成には不要だけど&mutのmutは必要だと言う話を聞いた
950デフォルトの名無しさん
2021/11/02(火) 09:44:55.98ID:px0qcy1y 950
951デフォルトの名無しさん
2021/11/02(火) 11:55:17.95ID:22+2FiF4 let mutのmutはbindingがmutableかどうか
&mutは型が&mut Tなのかどうか
Cのconst pointerとpointer to constと同じ
Rustはデフォルトimmutableなのでmutableにしたい場合にのみmutで修飾
普通使わないけどパターンマッチと組み合わせると
let &mut mut x = &mut y;
みたいな書き方もありうる
&mutは型が&mut Tなのかどうか
Cのconst pointerとpointer to constと同じ
Rustはデフォルトimmutableなのでmutableにしたい場合にのみmutで修飾
普通使わないけどパターンマッチと組み合わせると
let &mut mut x = &mut y;
みたいな書き方もありうる
952デフォルトの名無しさん
2021/11/03(水) 12:07:17.82ID:gDAMFAnt mutが必要ってより、for mutにfor let mutにならないことが不思議
953デフォルトの名無しさん
2021/11/03(水) 17:34:54.99ID:eoGGfQG1 それは単にforの文法がlet不要なように設計されたってだけでは
954デフォルトの名無しさん
2021/11/03(水) 18:34:42.48ID:+koatzK+ let パターン = ...
for パターン in iter
match パターン ...
fn hoge(パターン: TypeName, ...)
ってことやぞ
for パターン in iter
match パターン ...
fn hoge(パターン: TypeName, ...)
ってことやぞ
955デフォルトの名無しさん
2021/11/03(水) 19:26:40.94ID:6uw3PT+q Rustにはif let Some(3) = v {}とか、 while let Some(i) = a {}とかあり。letは不変のキーワードじゃなく
右辺に対するパターンマッチ展開で、for letがないのは、forはfor..inしかなく、Cのようなfor ;条件;の文が
存在しないためという考えらしいです。。。
右辺に対するパターンマッチ展開で、for letがないのは、forはfor..inしかなく、Cのようなfor ;条件;の文が
存在しないためという考えらしいです。。。
956デフォルトの名無しさん
2021/11/04(木) 06:57:56.88ID:9Ddr56R/ forで変数の初期化が要るみたいな発想になる時点でC由来の処理系に洗脳されているんじゃぁ・・・
957デフォルトの名無しさん
2021/11/04(木) 13:00:03.95ID:UnTZr4yd for p in v { … } は
v.into_iter().for_each(|p| …) と同じ機能たけど
長いメソッドチェーンな時など敢えてforでなくfor_each使ったりも
v.into_iter().for_each(|p| …) と同じ機能たけど
長いメソッドチェーンな時など敢えてforでなくfor_each使ったりも
958デフォルトの名無しさん
2021/11/04(木) 20:16:49.18ID:UnTZr4yd ただしfor文は値を返せないのが弱点かな
イテレータならfor_eachの代わりにfoldしたりfindしたりあるいはmapやfilterなど色々処理して最後にcollectしたりと値を返せる
イテレータならfor_eachの代わりにfoldしたりfindしたりあるいはmapやfilterなど色々処理して最後にcollectしたりと値を返せる
959デフォルトの名無しさん
2021/11/04(木) 20:24:42.58ID:faLe9vBn960デフォルトの名無しさん
2021/11/04(木) 21:17:21.49ID:MjRPJM3Z >>959
for式やwhile式がOptionを返してループ0回ならNoneで済む話ではないのでしょうか?
for式やwhile式がOptionを返してループ0回ならNoneで済む話ではないのでしょうか?
961デフォルトの名無しさん
2021/11/04(木) 21:26:55.06ID:sNasn9tC forで値を返したいとか言ってるやつまだいたのかw
962デフォルトの名無しさん
2021/11/04(木) 23:50:24.53ID:faLe9vBn >>960
ループ内は実行されないからNoneも返せないってことよ
loopは明示的に自分でbreakするから許容
let test: = if true { 1 };
たとえば、これでtestにNoneが入るとかおかしいことになるってわかるっしょ?
それと同じこと。
ループ内は実行されないからNoneも返せないってことよ
loopは明示的に自分でbreakするから許容
let test: = if true { 1 };
たとえば、これでtestにNoneが入るとかおかしいことになるってわかるっしょ?
それと同じこと。
963デフォルトの名無しさん
2021/11/04(木) 23:51:56.14ID:Cqbrs2k1 実際問題としてHITUYOU
964デフォルトの名無しさん
2021/11/04(木) 23:52:15.61ID:Cqbrs2k1 ごめん誤爆した。
実際問題として必要な場面がないだろ。
実際問題として必要な場面がないだろ。
965デフォルトの名無しさん
2021/11/05(金) 08:00:41.30ID:Q0weZe1J forの話なら、これって今はどっちで書くのが一般的?ルールとして基本はHOFで書くのを
やっぱり強制したいのだけど
https://doc.rust-lang.org/stable/rust-by-example/fn/hof.html
やっぱり強制したいのだけど
https://doc.rust-lang.org/stable/rust-by-example/fn/hof.html
966デフォルトの名無しさん
2021/11/05(金) 13:18:20.54ID:/SSooQm2 rust現場で使ってる人は何系のシステム作ってるん?
967デフォルトの名無しさん
2021/11/05(金) 14:22:06.73ID:pAK9gvBl 現場で使ってる人なんていません
968デフォルトの名無しさん
2021/11/05(金) 14:42:52.35ID:Z0sGs5cT 求人検索をしてみても、Rust使ってるとこなんて指で数えられるぐらいしかなさそうかな
969デフォルトの名無しさん
2021/11/05(金) 15:22:01.85ID:4VZvWnUi とりあえずいつもの貼っておく
https://www.rust-lang.org/production
https://www.rust-lang.org/production
970デフォルトの名無しさん
2021/11/05(金) 15:29:07.01ID:ShfctMVX 試験的にGoからRustに切り替え中だよ。両方ともバックエンドとフロントエンドまでやってるのでそのまま移植出来て簡単…じゃなかった
インフラはサクッと終わったけど、フロントは素のWasmで実装するもGoより遥かに複雑で難解なRustでやる意味は?的な事になって
vDOM系フレームワークで実装するも、Non-vDOM系のが殆どの場面で速い事が分かったのでやり直し中
で、本番環境で運用できるのか?となると最初の印象に反して「出来る」と思うね。
動かし始めて不具合が出た時に、何処がヤバいのか分からない怖さがない。
過去の資産と経験則は捨ててRustのお作法に従うようにするのが大切、下手にアレを使いたいので使い回すとかやると余計苦労する。
インフラはサクッと終わったけど、フロントは素のWasmで実装するもGoより遥かに複雑で難解なRustでやる意味は?的な事になって
vDOM系フレームワークで実装するも、Non-vDOM系のが殆どの場面で速い事が分かったのでやり直し中
で、本番環境で運用できるのか?となると最初の印象に反して「出来る」と思うね。
動かし始めて不具合が出た時に、何処がヤバいのか分からない怖さがない。
過去の資産と経験則は捨ててRustのお作法に従うようにするのが大切、下手にアレを使いたいので使い回すとかやると余計苦労する。
971デフォルトの名無しさん
2021/11/05(金) 19:10:07.53ID:0gW7V402 >>970
もしよろしければオススメのRustフレームワークを教えてください
もしよろしければオススメのRustフレームワークを教えてください
972デフォルトの名無しさん
2021/11/05(金) 20:26:36.98ID:RvCa6Qvn ちんちんぶらぶらRustすぱーと
973デフォルトの名無しさん
2021/11/05(金) 20:33:04.86ID:JniLXeAQ うちではバイトの女子大生も使ってるが
Rustを使うような企業はネット求人になんか頼らんだろうね、今のところ
Rustを使うような企業はネット求人になんか頼らんだろうね、今のところ
974デフォルトの名無しさん
2021/11/05(金) 21:52:24.97ID:ShfctMVX >>971
Dominator
Dominator
975デフォルトの名無しさん
2021/11/05(金) 23:26:41.71ID:DvmJ6O3T Dominatorってこれか
https://github.com/Pauan/rust-dominator
virtual DOM使わずゼロコストでリアクティブか
ベンチマーク見るとVue/React/Angularなどは非常に遅いんだな
https://rawgit.com/krausest/js-framework-benchmark/master/webdriver-ts-results/table.html
Vanilla JSで頑張るのでなければRustでDominatorを使った方が良さそうってことか
ウェブフロントエンドまでRustの時代が来るとは驚き
https://github.com/Pauan/rust-dominator
virtual DOM使わずゼロコストでリアクティブか
ベンチマーク見るとVue/React/Angularなどは非常に遅いんだな
https://rawgit.com/krausest/js-framework-benchmark/master/webdriver-ts-results/table.html
Vanilla JSで頑張るのでなければRustでDominatorを使った方が良さそうってことか
ウェブフロントエンドまでRustの時代が来るとは驚き
976デフォルトの名無しさん
2021/11/05(金) 23:41:27.00ID:7Nx3lyuG おもしろそうだけど、メンテが辛くなりそう。仕事でそんなん大丈夫かしら?
977デフォルトの名無しさん
2021/11/06(土) 01:14:13.09ID:8rFQ20lW ダメに決まってんじゃん。。無理やり使おうとしてるのが丸わかりだわ。
978デフォルトの名無しさん
2021/11/06(土) 01:50:27.76ID:BsA8c5Gl >>975
少くともその表に載ってるsolidってのは非vDOM系のJSフレームワークだけど…
その表ではDominatorとどっちが速いですか?
そしてそれはなぜですか?
それを勘案しても、
Vanilla JSで頑張るのでなければRustでDominatorを使った方が良さそうってなりますか?
少くともその表に載ってるsolidってのは非vDOM系のJSフレームワークだけど…
その表ではDominatorとどっちが速いですか?
そしてそれはなぜですか?
それを勘案しても、
Vanilla JSで頑張るのでなければRustでDominatorを使った方が良さそうってなりますか?
979デフォルトの名無しさん
2021/11/06(土) 01:55:12.94ID:eYFGObaB フロントエンドのwasmでrustを使う意味が分からん、assemblyscriptなんかでts変換したほうがよっぽど
人材確保も容易で速度も出そうだけど、まあ全部1つの言語に統一したいという欲望は分かるが
人材確保も容易で速度も出そうだけど、まあ全部1つの言語に統一したいという欲望は分かるが
980デフォルトの名無しさん
2021/11/06(土) 08:58:19.69ID:8rFQ20lW その種の願望はいつだって失敗してるのに何回でもこだわるバカが出てくる。
ビジュアルプログラミングとかノーコード並みに愚かだわ。
ビジュアルプログラミングとかノーコード並みに愚かだわ。
981デフォルトの名無しさん
2021/11/06(土) 09:42:55.78ID:DjcFpt23 夢は終わらねえ!
982デフォルトの名無しさん
2021/11/06(土) 10:40:16.97ID:YOvBnwY8 htmlマクロが微妙だよな。yewもしかり
マクロの仕様理解して書かないといけないからwebpackみたいなコンパイラー挟んでreact,vueみたいなhtmlベースでかけたら普及進むと思う
マクロの仕様理解して書かないといけないからwebpackみたいなコンパイラー挟んでreact,vueみたいなhtmlベースでかけたら普及進むと思う
983デフォルトの名無しさん
2021/11/06(土) 10:43:29.52ID:gG2xt4rU フロントエンドはElmで書いた方がいいと思う
Elmの設計をパクったRust用フレームワークよりElmそのもので書いた方がいい
Elmの設計をパクったRust用フレームワークよりElmそのもので書いた方がいい
984デフォルトの名無しさん
2021/11/06(土) 11:32:19.13ID:dvoeGWeX985デフォルトの名無しさん
2021/11/06(土) 12:19:33.04ID:v/Totsm8 >>979
AssemblyScriptはメモリ管理GC問題があるし文法が単にTSの限定サブセットに過ぎないため色々と辛すぎる
そのためWebAssemblyでの使用言語調査結果もこんな状況でRustが圧勝
https://blog.scottlogic.com/ceberhardt/assets/state-of-wasm/desired-language.png
>>978
Wasm⇔JSのオーバーヘッドがあるので処理が少なくほとんどDOM操作になる時だけはJSのみで書いたほうが速い (当たり前)
そのためほぼDOM操作のそのベンチマークではRustフレームワークがわずか数%遅くなっているが現実には処理内容次第ですぐに逆転する
>>983
Elmは型クラス(Rustではtrait)がなく例えば抽象的なイテレータも持てず色々と辛い
このスレはRustにアンチな人がRustを貶めようと常駐して頑張ってるようだけど
Rustを用いるのがベストな方法な場合が非常に多いよ
AssemblyScriptはメモリ管理GC問題があるし文法が単にTSの限定サブセットに過ぎないため色々と辛すぎる
そのためWebAssemblyでの使用言語調査結果もこんな状況でRustが圧勝
https://blog.scottlogic.com/ceberhardt/assets/state-of-wasm/desired-language.png
>>978
Wasm⇔JSのオーバーヘッドがあるので処理が少なくほとんどDOM操作になる時だけはJSのみで書いたほうが速い (当たり前)
そのためほぼDOM操作のそのベンチマークではRustフレームワークがわずか数%遅くなっているが現実には処理内容次第ですぐに逆転する
>>983
Elmは型クラス(Rustではtrait)がなく例えば抽象的なイテレータも持てず色々と辛い
このスレはRustにアンチな人がRustを貶めようと常駐して頑張ってるようだけど
Rustを用いるのがベストな方法な場合が非常に多いよ
986デフォルトの名無しさん
2021/11/06(土) 16:27:09.97ID:Y613N0Im もはや人類の発展はRustにかかっていると言ってもいい
987デフォルトの名無しさん
2021/11/06(土) 16:30:35.71ID:3ClRyBcI Rustのお陰でハゲが治りました!
988デフォルトの名無しさん
2021/11/06(土) 16:45:26.77ID:EdJhZAmA C++ドロップアウターの掃き溜まり
989デフォルトの名無しさん
2021/11/06(土) 16:57:33.02ID:5yvdtcf3 similar word exists: `掃き溜め`
similar word exists: `吹き溜まり`
similar word exists: `吹き溜まり`
990デフォルトの名無しさん
2021/11/06(土) 21:24:09.65ID:8rFQ20lW rustがベストな時が多いとかよくそういうデマを平気で流せるよね。。
991デフォルトの名無しさん
2021/11/06(土) 21:39:59.60ID:1qW/ULGd シャドーイングがよくわかりません。
変数名によって中身が一意に決まらなくなることによって、安全性も下がるし並列性?も確保できなくなる気がするのですが、変数が全mutableな言語より安全性マシだしRustは関数型言語じゃないから並列性そこまで重要視してないし書き味のが大事だぜってことですか?
変数名によって中身が一意に決まらなくなることによって、安全性も下がるし並列性?も確保できなくなる気がするのですが、変数が全mutableな言語より安全性マシだしRustは関数型言語じゃないから並列性そこまで重要視してないし書き味のが大事だぜってことですか?
992デフォルトの名無しさん
2021/11/06(土) 21:47:09.97ID:PDDtrjdC 安全性も下がるし並列性?も確保できなくなる気がするのは気のせいではないでしょうか
993デフォルトの名無しさん
2021/11/06(土) 22:22:33.53ID:9KDcj+aF >>991
プログラミング初心者には難しいかもしれないけど
一般的にプログラミング言語ではスコープという概念があってスコープが異なれば同じ変数名でも全く別のものとして認識され格納場所は異なるし型が異なってもよい
その中でもブロックスコープは多くのプログラミング言語で採用されていてブロックが始まると新たなスコープが出来て同じ変数名でも全く別のものとして扱われる
今回のシャドーイングスコープも同様でシャドーイングの時点から新たなスコープが始まるため同じ変数名でも全く別の変数として扱われる
だから安全性は全く下がらないし並行でも並列でもシャドーイングで問題が生じることはない
むしろシャドーイングの利用で利便性が高まっていることがプログラミング経験を重ねると理解できる
プログラミング初心者には難しいかもしれないけど
一般的にプログラミング言語ではスコープという概念があってスコープが異なれば同じ変数名でも全く別のものとして認識され格納場所は異なるし型が異なってもよい
その中でもブロックスコープは多くのプログラミング言語で採用されていてブロックが始まると新たなスコープが出来て同じ変数名でも全く別のものとして扱われる
今回のシャドーイングスコープも同様でシャドーイングの時点から新たなスコープが始まるため同じ変数名でも全く別の変数として扱われる
だから安全性は全く下がらないし並行でも並列でもシャドーイングで問題が生じることはない
むしろシャドーイングの利用で利便性が高まっていることがプログラミング経験を重ねると理解できる
994デフォルトの名無しさん
2021/11/06(土) 22:44:27.14ID:EdP5MzkQ ダイナミックスコープはいらない子だった・・・?
995はちみつ餃子 ◆8X2XSCHEME
2021/11/06(土) 23:40:03.82ID:tiSLGdpm ダイナミックスコープがデフォルトの言語なんて Emacs Lisp くらいしか見たことないわ。
996991
2021/11/07(日) 06:37:58.76ID:It35Zcf7 意図したシャドーイングならともかく、間違って同じ変数名つけたコード片突っ込んでしまった系だと他言語にあるらしい2重宣言エラーないの怖くないですか?
新たなスコープが生まれるので並列性に問題ないことはなんとなく理解できました
新たなスコープが生まれるので並列性に問題ないことはなんとなく理解できました
997デフォルトの名無しさん
2021/11/07(日) 07:11:27.61ID:F+zOFISG D言語の再来。
998デフォルトの名無しさん
2021/11/07(日) 07:13:38.67ID:pJhT3MIE 次スレは?
>>980が1時間待っても立てなかったら俺がやる
>>980が1時間待っても立てなかったら俺がやる
999デフォルトの名無しさん
2021/11/07(日) 08:48:10.79ID:N5JIOUKU 質問いいですか
1000デフォルトの名無しさん
2021/11/07(日) 10:09:41.36ID:k2ts2WHd くたばれ
10011001
Over 1000Thread このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 74日 11時間 14分 14秒
新しいスレッドを立ててください。
life time: 74日 11時間 14分 14秒
10021002
Over 1000Thread 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。
ニュース
- 首相官邸前で「戦争あおるな」 台湾有事巡る答弁に抗議 [蚤の市★]
- 高市首相告白「『なめられない服』を選ぶことに数時間を費やしました」「外交交渉でマウント取れる服、買わなくてはいかんかもなぁ」 [ぐれ★]
- 【高市リスク】立民・小西洋之参院議員「高市総理がとんでもない安全保障オンチで外交オンチ」 [ぐれ★]
- 『DOWNTOWN+』会員数50万人突破で見えてきた 松本人志の“月収4ケタ万円”驚愕収入 [阿弥陀ヶ峰★]
- 【赤坂ライブハウス刺傷】逃走していた自衛官の男(43)を殺人未遂の疑いで逮捕 警視庁 被害女性とは知人関係 [Ailuropoda melanoleuca★]
- 【芸能】永遠の童顔′ウ「光GENJI」53歳になった山本淳一の近影に「若いな?」「元気パワーもらえるよっ」 [湛然★]
- 安倍晋三「日本よ、世界の真ん中で咲き誇れ」高市早苗「日本外交を咲き誇らせてまいります」 [696684471]
- 日本人「憲法9条があれば侵略されないって叫んでた売国左翼のゴミどもは今どんな気分?😂wwwwww」 [441660812]
- 婚活女子(43)「アラフォーのおっさんが『同世代の女はおばさんに見える。10歳くらい歳の離れた女性がいい』と言っててドン引きしてる… [257926174]
- 女死ね
- 【悲報】東京都民さん、20過ぎてるのに自転車に乗っててて大炎上wwwwwwwwwwww女「いい歳した男で自転車に乗るのは知的障がい者だけだよ? [483447288]
- 【悲報】細田守最新作、超絶爆死しそう
