公式
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/
※C++との比較は専用スレへ
C++ vs Rust
https://mevius.5ch.net/test/read.cgi/tech/1619219089/
前スレ
Rust part10
https://mevius.5ch.net/test/read.cgi/tech/1617367084/
探検
Rust part11
レス数が1000を超えています。これ以上書き込みはできません。
2021/06/17(木) 00:24:12.56ID:NvYoNP9C
2デフォルトの名無しさん
2021/06/19(土) 01:15:49.18ID:3FFA7ImF >>1 おつ
3デフォルトの名無しさん
2021/06/19(土) 01:20:06.41ID:VXoz87sA >>1
乙
乙
4デフォルトの名無しさん
2021/06/19(土) 02:14:18.53ID:tZhqlEYm 勉強中でいまいちよくわかってないんだけどさ
よくRsutでメモリの扱いが安全になるとか言われてるけど、これって解放忘れを防いでくれるだけであって、オーバーフローを防いでくれるものではないわけ?
それとも登場する全ての型がオーバーフローしないような仕組み(スタックプロテクター以上の何か)があるの?
よくRsutでメモリの扱いが安全になるとか言われてるけど、これって解放忘れを防いでくれるだけであって、オーバーフローを防いでくれるものではないわけ?
それとも登場する全ての型がオーバーフローしないような仕組み(スタックプロテクター以上の何か)があるの?
2021/06/19(土) 03:26:44.04ID:5peZoltk
>>4
型のオーバーフローっていうのは算術オーバーフロー(桁あふれ)のことかな?
であればここを読むといいと思う
https://doc.rust-lang.org/book/ch03-02-data-types.html#integer-overflow
型のオーバーフローっていうのは算術オーバーフロー(桁あふれ)のことかな?
であればここを読むといいと思う
https://doc.rust-lang.org/book/ch03-02-data-types.html#integer-overflow
6はちみつ餃子 ◆8X2XSCHEME
2021/06/19(土) 04:22:00.60ID:/f53/cxR スタックプロテクターの話題を出すってことは
バッファオーバーフロー (バッファオーバーラン) のことじゃないかな。
配列は大きさの情報を持っているし、
配列の一部の範囲を受け渡すときはポインタでなくスライスで扱うのが Rust の基本的な設計になってる。
ポインタと違ってスライスは範囲の情報を持っているのでチェック可能で、チェックする仕様になってるよ。
溢れたら panic する。
(もちろん unsafe な操作をしたらいくらでも危険な操作は出来る。)
絶対に溢れないことがコンパイル時に見抜ける場合であれば
チェックしないように最適化したりすることもあるし、
チェックする場合でも現代的な CPU ではほぼ確実に分岐予測が成功するから
処理速度が遅くなる分は十分に小さいとかいう話があったはず。
バッファオーバーフロー (バッファオーバーラン) のことじゃないかな。
配列は大きさの情報を持っているし、
配列の一部の範囲を受け渡すときはポインタでなくスライスで扱うのが Rust の基本的な設計になってる。
ポインタと違ってスライスは範囲の情報を持っているのでチェック可能で、チェックする仕様になってるよ。
溢れたら panic する。
(もちろん unsafe な操作をしたらいくらでも危険な操作は出来る。)
絶対に溢れないことがコンパイル時に見抜ける場合であれば
チェックしないように最適化したりすることもあるし、
チェックする場合でも現代的な CPU ではほぼ確実に分岐予測が成功するから
処理速度が遅くなる分は十分に小さいとかいう話があったはず。
2021/06/19(土) 09:47:40.12ID:5peZoltk
バッファオーバーフローのことなのか
Safe Rustでは基本的に発生しないが仕組みというより
unsafeなコードを書く人が要求された安全性を保証するという約束の上に成り立ってる
Rustの要求するメモリ安全性を保証するためには
unsafeなコードでポインタをdereferenceする前にout-of-boundsかどうかのチェックが必要
Safe Rustでは基本的に発生しないが仕組みというより
unsafeなコードを書く人が要求された安全性を保証するという約束の上に成り立ってる
Rustの要求するメモリ安全性を保証するためには
unsafeなコードでポインタをdereferenceする前にout-of-boundsかどうかのチェックが必要
2021/06/19(土) 14:15:48.54ID:lGsmv2n4
境界チェックなんて他の言語でもあるし、別にそこがRustの特別な強みではないんだよな
それよりは、
> これって解放忘れを防いでくれるだけであって
だけじゃなくて、use-after-freeとか、
思わぬ箇所でオブジェクトが変更されることによるデータ競合とか、
をコンパイル時にチェックできるのが強い
詳細はThe Book 4章に
https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html
日本語版はこっち
https://doc.rust-jp.rs/book-ja/ch04-02-references-and-borrowing.html
それよりは、
> これって解放忘れを防いでくれるだけであって
だけじゃなくて、use-after-freeとか、
思わぬ箇所でオブジェクトが変更されることによるデータ競合とか、
をコンパイル時にチェックできるのが強い
詳細はThe Book 4章に
https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html
日本語版はこっち
https://doc.rust-jp.rs/book-ja/ch04-02-references-and-borrowing.html
2021/06/19(土) 15:41:11.20ID:7Y2aa0wT
解放忘れ(メモリーリーク)はRustは
保証してないのでは?
保証してないのでは?
2021/06/19(土) 16:32:09.25ID:+A5T+Cz1
Rc/Arc以外でメモリリークって起こるの?
2021/06/19(土) 16:52:09.35ID:5/JSw/kX
Box::leakして返された参照を捨てるとメモリリーク起こせる
2021/06/20(日) 02:45:16.68ID:O2AvtKTb
最近勉強始めたんだが、正直ムズイ
特にwinapiのポインタ引数が(構造体のポインタではなく)DWORDで定義されてたりするので、
キャストするのが超絶面倒臭い
microsoftはcrate修正してほしい
まあ、rustというよりwinapiの問題なんだが……
特にwinapiのポインタ引数が(構造体のポインタではなく)DWORDで定義されてたりするので、
キャストするのが超絶面倒臭い
microsoftはcrate修正してほしい
まあ、rustというよりwinapiの問題なんだが……
13はちみつ餃子 ◆8X2XSCHEME
2021/06/20(日) 02:57:43.41ID:h62I7Iw3 わかる。
DWORD とポインタをカジュアルに同一視する API はまだマシなほうで、
Rust は文字列をスライスで扱うから単純にポインタに変換してもヌル終端されてないのがクソめんどい。
文字列を渡すとかすごく普通にあることなんで、それがこんなに面倒くさいの勘弁して欲しい。
DWORD とポインタをカジュアルに同一視する API はまだマシなほうで、
Rust は文字列をスライスで扱うから単純にポインタに変換してもヌル終端されてないのがクソめんどい。
文字列を渡すとかすごく普通にあることなんで、それがこんなに面倒くさいの勘弁して欲しい。
14デフォルトの名無しさん
2021/06/20(日) 06:34:35.27ID:9R7FlmLP 普通に書いててwinapiとか使う機会ないと思うけどOS機能を直接触る必要のあるライブラリでも書いてるのかな?
2021/06/20(日) 15:00:11.94ID:ZAMdhkls
OS層に近いAPI全く使わないならrustやc++とかデメリットの方が多いような。
16デフォルトの名無しさん
2021/06/20(日) 16:38:08.85ID:K2CzG+CP 俺も最近Rust勉強してるんだけど、GC無しでのメモリ管理が最高に気持ちいい
何もかもRustで書きたくなる
何もかもRustで書きたくなる
2021/06/20(日) 17:33:03.51ID:D+WmuL2+
ワイは基本moveってところが気に入ってる
参照をもって回るんじゃなくて
実態をmoveで渡してmoveで返されるとき清々しいのを感じる
参照をもって回るんじゃなくて
実態をmoveで渡してmoveで返されるとき清々しいのを感じる
2021/06/20(日) 17:51:48.27ID:BAitg4NO
システムコールや低レベルなライブラリをいい感じに安全にラップしてくれるcrateが提供されてるのはrustの良いところ
2021/06/20(日) 19:32:30.59ID:5UZIMOEC
moveって最適化ビルドだと消えたりしてるのかな?
2021/06/20(日) 21:04:33.39ID:BAitg4NO
moveが消えるとは?
moveがコンパイルされた結果のmemcpyなどが消えることはある
moveがコンパイルされた結果のmemcpyなどが消えることはある
2021/06/20(日) 22:37:40.54ID:X7PAuK/l
>>13
Rustのスライスは、ほぼPascal文字列だから、Cよりも古くから作法や
概念は存在している。
しかし、なぜCがPascal文字列ではなく0終端文字列にしたのかには
理由があって、文字列の途中(部分文字列)を扱わない場合においては効率が良いから。
0終端文字列の欠点は、部分文字列を扱おうとするととたんに面倒なことになること。
ただ、strcmpみたいなものを書いたり、字句解析を書いたりするときには、効率は良い。
字句解析では決定性オートマトンの理論がグラフ的(状態遷移図的)になっており、
Cの0終端文字列とはとても相性が良い。
そして、コンパイラの実行時間の大部分は、実測してみると、意外にも字句解析が占めている。
字句解析は単純ではあるが、量が多いので1クロックの差がものをいう世界である。
ただ、Pascal文字列(スライス)が字句解析でも有利に働く場面はあるにはあるが。
どちらの方式が一方的に優れているとはいえない。
Rustのスライスは、ほぼPascal文字列だから、Cよりも古くから作法や
概念は存在している。
しかし、なぜCがPascal文字列ではなく0終端文字列にしたのかには
理由があって、文字列の途中(部分文字列)を扱わない場合においては効率が良いから。
0終端文字列の欠点は、部分文字列を扱おうとするととたんに面倒なことになること。
ただ、strcmpみたいなものを書いたり、字句解析を書いたりするときには、効率は良い。
字句解析では決定性オートマトンの理論がグラフ的(状態遷移図的)になっており、
Cの0終端文字列とはとても相性が良い。
そして、コンパイラの実行時間の大部分は、実測してみると、意外にも字句解析が占めている。
字句解析は単純ではあるが、量が多いので1クロックの差がものをいう世界である。
ただ、Pascal文字列(スライス)が字句解析でも有利に働く場面はあるにはあるが。
どちらの方式が一方的に優れているとはいえない。
2021/06/20(日) 22:45:58.47ID:X7PAuK/l
>>21
すまん。今調べたら、Pascal文字列は、配列の先頭に文字数が
入っている特殊な形式で、スライスとはまた違うものだった。
今まで誤解していたわ。
Pascal文字列はダメだわ、全く意味無し。
ただ、俺が言いたかったのは、Rustのスライス方式も古くから概念自体は存在し、
Win32APIでもGetTextExtentPoint32()なんかが、ポインタと、その後に続く
文字数の両方を指定する方式を取っている。
このやり方は、文字列の中に 0x00 を埋め込まなくても部分文字列を扱えて
便利は便利。もしこれを部分文字列の場所を少しずつ変えていくようなの場合に、
0終端文字列でやろうとすると、効率が悪くなる。
ただ、いつでもスライスの方が0終端文字列より効率が良いという訳ではない。
それが>>21で言いたかったこと。決定性や非決定性オートマトンの考え方で字句解析を
する際には、Cの0終端文字列はスライスより効率が良い。
すまん。今調べたら、Pascal文字列は、配列の先頭に文字数が
入っている特殊な形式で、スライスとはまた違うものだった。
今まで誤解していたわ。
Pascal文字列はダメだわ、全く意味無し。
ただ、俺が言いたかったのは、Rustのスライス方式も古くから概念自体は存在し、
Win32APIでもGetTextExtentPoint32()なんかが、ポインタと、その後に続く
文字数の両方を指定する方式を取っている。
このやり方は、文字列の中に 0x00 を埋め込まなくても部分文字列を扱えて
便利は便利。もしこれを部分文字列の場所を少しずつ変えていくようなの場合に、
0終端文字列でやろうとすると、効率が悪くなる。
ただ、いつでもスライスの方が0終端文字列より効率が良いという訳ではない。
それが>>21で言いたかったこと。決定性や非決定性オートマトンの考え方で字句解析を
する際には、Cの0終端文字列はスライスより効率が良い。
2021/06/20(日) 22:54:46.58ID:D+WmuL2+
読む価値無い文章をダラダラ書いちゃうのって
なんらかの障害なんやろな
なんらかの障害なんやろな
2021/06/21(月) 00:08:08.49ID:85An+spJ
>>22
そのせいでPascal文字列は長さ255文字までに制限されてたのよな。
そのせいでPascal文字列は長さ255文字までに制限されてたのよな。
2021/06/21(月) 00:46:14.79ID:PP3lMGGZ
結論は、Rustがそんなにすばらしい言語とは到底思えないということだ。
2021/06/21(月) 02:03:12.76ID:wnQSc3ge
ええんやで
27デフォルトの名無しさん
2021/06/21(月) 03:36:25.54ID:JQDu6zSa >>25 まぁ用途によるやろ
発展途上なところもあるし、そもそもRustが向いてないような用途もある
発展途上なところもあるし、そもそもRustが向いてないような用途もある
28デフォルトの名無しさん
2021/06/21(月) 07:39:35.72ID:3uERIKtL >>13
様々な文字列処理をしたことがある人になら自明ですが
文字列を扱う場合は¥0終端よりもスライスのほうが圧倒的に有利です
例えば何段か深いディレクトリの絶対パスが与えられた時に各ディレクトリのリストを返す(つまりsprit)時
¥0終端方式だと元の文字列を書き換え破壊しない限りコピーが発生してしまいます
スライス方式だと書き換えもコピーも発生しません
これは正規表現によるパターンマッチングでも同じで¥0終端方式だと結果である部分文字列をコピーしなければ返せません
またHTMLやJSONなどの様々な構造データの解析結果でもそうです
JSON文字列を解析して内部構造化表現にする時もスライス方式ならば文字列のコピーが発生せずに済むわけです
様々な文字列処理をしたことがある人になら自明ですが
文字列を扱う場合は¥0終端よりもスライスのほうが圧倒的に有利です
例えば何段か深いディレクトリの絶対パスが与えられた時に各ディレクトリのリストを返す(つまりsprit)時
¥0終端方式だと元の文字列を書き換え破壊しない限りコピーが発生してしまいます
スライス方式だと書き換えもコピーも発生しません
これは正規表現によるパターンマッチングでも同じで¥0終端方式だと結果である部分文字列をコピーしなければ返せません
またHTMLやJSONなどの様々な構造データの解析結果でもそうです
JSON文字列を解析して内部構造化表現にする時もスライス方式ならば文字列のコピーが発生せずに済むわけです
2021/06/21(月) 08:53:58.31ID:xiUkcw19
2021/06/21(月) 09:07:04.10ID:WbPJLyAM
そういやRustの std::ffi::OsString って¥0終端なんだっけ?
2021/06/21(月) 09:43:03.40ID:ILFJsIgR
32デフォルトの名無しさん
2021/06/21(月) 11:29:12.30ID:+vRECSeH >>29 FFIのことを考えつつスライスの恩恵(境界チェックなど)も受けるなら今のRustの文字列に最後に\0を入れるようにしたらいいと思ったけどなんでしないんやろ
\0分の1バイトぐらい今のPCじゃ問題にならないはず
\0分の1バイトぐらい今のPCじゃ問題にならないはず
2021/06/21(月) 11:49:33.30ID:hH2X9nxJ
>>32
従来の &str (部分文字列) とnul終端文字列を区別しないといけないけど
型で区別しようとすると結局今のCStr/CStringと同じになるのでは
文字列は部分文字列含め全部Stringみたいにヒープアロケーションするなら良いけどさすがに効率が悪すぎる
従来の &str (部分文字列) とnul終端文字列を区別しないといけないけど
型で区別しようとすると結局今のCStr/CStringと同じになるのでは
文字列は部分文字列含め全部Stringみたいにヒープアロケーションするなら良いけどさすがに効率が悪すぎる
2021/06/21(月) 12:03:56.90ID:vy1X2bYf
これps5は60fpsでます??
2021/06/21(月) 12:11:12.63ID:743v8uRC
Rust違いです
ってかゲームのほうのRustって個別スレ無いんだね
ってかゲームのほうのRustって個別スレ無いんだね
2021/06/21(月) 12:12:05.66ID:oYpDc35T
FFIが必要な箇所で
let cstr = std::ffi::CString::new(str);
すれば済む話だからね
Win32APIだと\0終端の2バイト文字も渡したりするからCStringでも使い勝手悪そう
let wcstr: Vec<u16> = std::ffi::CString::new(str).to_str().unwrap().encode_utf16().collect();
で動くかな(試してない)
こっちは自分で'\0'足す方が簡単かもしれない
let cstr = std::ffi::CString::new(str);
すれば済む話だからね
Win32APIだと\0終端の2バイト文字も渡したりするからCStringでも使い勝手悪そう
let wcstr: Vec<u16> = std::ffi::CString::new(str).to_str().unwrap().encode_utf16().collect();
で動くかな(試してない)
こっちは自分で'\0'足す方が簡単かもしれない
2021/06/21(月) 12:43:27.64ID:UE5kS0Iw
2021/06/21(月) 12:53:52.20ID:UE5kS0Iw
何度も言うが、全面的にスライスが良いならC言語でも0終端文字列をやめに
してしまえばいいのだが、そういう訳ではない。
>>28 に挙がっているようなケースで、自分も同じような気持ちになったことは有るが、
一方で 0終端文字列の方が効率が良い例も少なからず存在しているので全面的に
スライス方式に変えてしまうのは難しい。
一番単純な例を書けば、英大文字の部分だけを読み飛ばす場合、
(1) ptrが0終端文字列を挿している場合:
while ( *ptr >= 'A' && *ptr <= 'Z' ) ptr++;
(2) (ptr, len)でスライス文字列を表現している場合 :
int cnt = 0;
while ( cnt < len && *ptr >= 'A' && *ptr <= 'Z' ) {ptr++; cnt++;}
後者だと、cnt < len と cnt++; の部分が追加されて効率が落ちる。
してしまえばいいのだが、そういう訳ではない。
>>28 に挙がっているようなケースで、自分も同じような気持ちになったことは有るが、
一方で 0終端文字列の方が効率が良い例も少なからず存在しているので全面的に
スライス方式に変えてしまうのは難しい。
一番単純な例を書けば、英大文字の部分だけを読み飛ばす場合、
(1) ptrが0終端文字列を挿している場合:
while ( *ptr >= 'A' && *ptr <= 'Z' ) ptr++;
(2) (ptr, len)でスライス文字列を表現している場合 :
int cnt = 0;
while ( cnt < len && *ptr >= 'A' && *ptr <= 'Z' ) {ptr++; cnt++;}
後者だと、cnt < len と cnt++; の部分が追加されて効率が落ちる。
2021/06/21(月) 13:02:34.21ID:WbPJLyAM
Linuxカーネル開発における「Rust」採用の動き、グーグルとISRGがさらなる後押し
https://japan.zdnet.com/article/35172646/
> Googleは、ウェブサーバーソフトウェアの「Apache HTTP Server」向けのモジュールをRustによるモジュールで置き換えるというISRGのプロジェクトも支援している。
https://japan.zdnet.com/article/35172646/
> Googleは、ウェブサーバーソフトウェアの「Apache HTTP Server」向けのモジュールをRustによるモジュールで置き換えるというISRGのプロジェクトも支援している。
2021/06/21(月) 13:11:18.52ID:+4cAknZI
windows apiを使ってメッセージダイアログボックスを表示するサンプルが載ってるサイト教えてください
2021/06/21(月) 13:25:05.28ID:hH2X9nxJ
>>38
今のcpuとコンパイラの最適化で両者にどれくらいの性能差があるか示したベンチマークなどある?
rustでも文字列末尾に0を差し込めば同じことはできるので、本当に速くなるなら最適化の手法として採用しても良いかもしれない
今のcpuとコンパイラの最適化で両者にどれくらいの性能差があるか示したベンチマークなどある?
rustでも文字列末尾に0を差し込めば同じことはできるので、本当に速くなるなら最適化の手法として採用しても良いかもしれない
2021/06/21(月) 13:41:31.99ID:G7rEBmCP
2021/06/21(月) 13:52:57.02ID:xiUkcw19
>>40
use winapi::um::winuser::*;
fn main() {
let str: Vec<u16> = "Hello, world!".encode_utf16().chain(Some(0)).collect();
unsafe{
MessageBoxW(std::ptr::null_mut(), str.as_ptr() , str.as_ptr(), MB_OK);
}
}
use winapi::um::winuser::*;
fn main() {
let str: Vec<u16> = "Hello, world!".encode_utf16().chain(Some(0)).collect();
unsafe{
MessageBoxW(std::ptr::null_mut(), str.as_ptr() , str.as_ptr(), MB_OK);
}
}
2021/06/21(月) 14:00:39.66ID:yyeRDQfZ
設計判断ってのは常にトードオフの選択だからな
ヌル終端にすることで得られるものと失うものを天秤にかける必要がある
得られるものしか見ないやつは設計からは手を引け
ヌル終端にすることで得られるものと失うものを天秤にかける必要がある
得られるものしか見ないやつは設計からは手を引け
2021/06/21(月) 14:01:15.31ID:yyeRDQfZ
トレードオフね
あー恥ずかし
あー恥ずかし
2021/06/21(月) 14:13:19.21ID:t12YpwM9
ああトードオフは重要だよな
2021/06/21(月) 14:31:05.42ID:ILFJsIgR
48デフォルトの名無しさん
2021/06/21(月) 14:45:15.77ID:6c6Y8dXA Rustってなんでprintlnの後にビックリマークあるの?
2021/06/21(月) 14:51:45.48ID:G7rEBmCP
2021/06/21(月) 14:58:01.41ID:oYpDc35T
2021/06/21(月) 15:29:27.47ID:+4cAknZI
>>43
先輩ありがとうございます!
先輩ありがとうございます!
2021/06/21(月) 15:40:08.22ID:WbPJLyAM
そういや、可変長引数を直接書けないからRustはクソって言う人はまだ見た事ないな
あんまり使わないからかな?
あんまり使わないからかな?
2021/06/21(月) 16:23:01.35ID:hH2X9nxJ
2021/06/21(月) 16:29:47.09ID:hH2X9nxJ
>>52
Cで可変長引数使いたくなるのってprintf系関数以外なんかある?
Cで可変長引数使いたくなるのってprintf系関数以外なんかある?
55デフォルトの名無しさん
2021/06/21(月) 16:52:01.19ID:xiUkcw192021/06/21(月) 17:01:59.90ID:UE5kS0Iw
2021/06/21(月) 17:23:50.71ID:a6mPBEl9
2021/06/21(月) 17:32:00.25ID:xiUkcw19
議論するのそこ?
むしろセキュリティ(バッファオーバーランの危険性)とパフォーマンスを秤にかけて
rustはセキュリティの方を採用したってだけじゃない?
パスカル文字列なんて昔からあったわけだし
むしろセキュリティ(バッファオーバーランの危険性)とパフォーマンスを秤にかけて
rustはセキュリティの方を採用したってだけじゃない?
パスカル文字列なんて昔からあったわけだし
59はちみつ餃子 ◆8X2XSCHEME
2021/06/21(月) 17:54:38.56ID:5bV+3LP72021/06/21(月) 18:00:00.24ID:W8eb/Sbg
2021/06/21(月) 18:49:34.95ID:xiUkcw19
2021/06/21(月) 19:12:19.82ID:Qd3Oxzyr
2021/06/21(月) 21:14:54.92ID:MXwcp+e6
winapiクレートを使うことってもうなくね?
Microsoft公式のwindiwsクレートの方がよっぽど使いやすいよ
Microsoft公式のwindiwsクレートの方がよっぽど使いやすいよ
64デフォルトの名無しさん
2021/06/21(月) 21:47:08.31ID:L+7FW+LR >>38
>(1) ptrが0終端文字列を挿している場合:
>while ( *ptr >= 'A' && *ptr <= 'Z' ) ptr++;
その場合でも、まず与えられたデータが0終端しているかどうかを確認する必要がありますよね。
データがどこから来るのかは、
ネット上の通信相手か
ディスク上のファイルか
メモリ上の他言語等APIかになりますが、
いずれも盲目的に信頼せずに処理する必要があります。
そして小さいデータならばどんな処理方法でも誤差になるのでしょうが、
大きなデータの場合は>>28のように元はJSONとかHTMLのように構造をもっており、
その解析結果である各一部分が対象文字列になります。
すると0終端させた方がわずかに速く扱える可能性があるからといって、元の大きなデータから毎回コピーして0終端文字列を作る場合と、
コピーをせずにスライスのまま部分文字列を扱う場合との、比較になるのでははいでしょうか?
>(1) ptrが0終端文字列を挿している場合:
>while ( *ptr >= 'A' && *ptr <= 'Z' ) ptr++;
その場合でも、まず与えられたデータが0終端しているかどうかを確認する必要がありますよね。
データがどこから来るのかは、
ネット上の通信相手か
ディスク上のファイルか
メモリ上の他言語等APIかになりますが、
いずれも盲目的に信頼せずに処理する必要があります。
そして小さいデータならばどんな処理方法でも誤差になるのでしょうが、
大きなデータの場合は>>28のように元はJSONとかHTMLのように構造をもっており、
その解析結果である各一部分が対象文字列になります。
すると0終端させた方がわずかに速く扱える可能性があるからといって、元の大きなデータから毎回コピーして0終端文字列を作る場合と、
コピーをせずにスライスのまま部分文字列を扱う場合との、比較になるのでははいでしょうか?
2021/06/21(月) 22:00:11.19ID:xiUkcw19
2021/06/21(月) 22:22:17.51ID:oYpDc35T
2021/06/21(月) 22:57:58.01ID:xiUkcw19
>>66
なるほど、理解した
なるほど、理解した
2021/06/21(月) 22:58:56.43ID:ILFJsIgR
その比較は部分文字列をコピーするかスライスで表現するかの違いであって
0終端文字列のメリット・デメリットとは少し違うんじゃない?
0終端でも同じようにスライスを(ptr, len)で作ればコピーは不要
0終端文字列のメリット・デメリットとは少し違うんじゃない?
0終端でも同じようにスライスを(ptr, len)で作ればコピーは不要
2021/06/21(月) 23:46:42.70ID:oYpDc35T
>>68
> 0終端でも同じようにスライスを(ptr, len)で作ればコピーは不要
それをやってしまうとその部分文字列に対して0終端のメリットが効かなくなるわけで
コピーしないとメリットを得られないというのがデメリットになってる
> 0終端でも同じようにスライスを(ptr, len)で作ればコピーは不要
それをやってしまうとその部分文字列に対して0終端のメリットが効かなくなるわけで
コピーしないとメリットを得られないというのがデメリットになってる
70デフォルトの名無しさん
2021/06/22(火) 02:10:06.59ID:JEO56Dr7 つまり部分文字列を扱う場合は、コピーが発生する0終端方式が不利になりますね。
具体的にファイルパスからディレクトリ部分を得るとか、URLからホスト名を得るとか、元データを破壊したくない時は0終端方式だとコピーするしかないです。
つまり一貫してRustのように始点&長さ方式の方が、有利かつメモリ安全ではないでしょうか?
さらに文字列比較の場合も長さ方式よりも0終端方式が不利です。
これはCのmemcmpとstrcmpの比較に還元されますが、
memcmpは64bit比較やSIMD利用ができるからです。
具体的にファイルパスからディレクトリ部分を得るとか、URLからホスト名を得るとか、元データを破壊したくない時は0終端方式だとコピーするしかないです。
つまり一貫してRustのように始点&長さ方式の方が、有利かつメモリ安全ではないでしょうか?
さらに文字列比較の場合も長さ方式よりも0終端方式が不利です。
これはCのmemcmpとstrcmpの比較に還元されますが、
memcmpは64bit比較やSIMD利用ができるからです。
71デフォルトの名無しさん
2021/06/22(火) 02:44:25.97ID:fStlaCDg &strって3つの意味があると思うんだよね
1: 文字列リテラル
2: Stringの参照
3: 部分文字列
文字列リテラルとStringは終端にNULLを付けるようにして(今まで通りlenやcapは残す)、部分文字列は部分文字列を意味する別の型を作ればいいと思った
こうすることでRust側ではlenやcapを使い、C側ではNULL終端を利用できるという状態になる(Stringや&strをRustで使ってもCで使ってもゼロコスト)
もしNULL終端ではない部分文字列をCで使いたければStringに変換すれば使えるようになる(これはコストがかかるけどCの文字列も同じ問題を抱えてるので問題なし)
1: 文字列リテラル
2: Stringの参照
3: 部分文字列
文字列リテラルとStringは終端にNULLを付けるようにして(今まで通りlenやcapは残す)、部分文字列は部分文字列を意味する別の型を作ればいいと思った
こうすることでRust側ではlenやcapを使い、C側ではNULL終端を利用できるという状態になる(Stringや&strをRustで使ってもCで使ってもゼロコスト)
もしNULL終端ではない部分文字列をCで使いたければStringに変換すれば使えるようになる(これはコストがかかるけどCの文字列も同じ問題を抱えてるので問題なし)
2021/06/22(火) 08:19:32.37ID:7Ks2gqqv
>>70
それやるには文字列がimmutableでなければならないから、それによって生じるスペースコストとどっちをとるかって話だな。
それにimmutableな文字列って、部分変更に相当する処理をする場合に逆にコピーが必要になるし。
どっちにしても一概に、コピー不要だからこっちが有利、みたいな話にはならんかと。
それやるには文字列がimmutableでなければならないから、それによって生じるスペースコストとどっちをとるかって話だな。
それにimmutableな文字列って、部分変更に相当する処理をする場合に逆にコピーが必要になるし。
どっちにしても一概に、コピー不要だからこっちが有利、みたいな話にはならんかと。
2021/06/22(火) 12:15:08.38ID:UUxAOJV3
rustで初心者がハマるポイントを初心者が紹介します
・所有権の概念が難しい
・何をするにしても外部ライブラリが必要(乱数生成など)
・ポインタが難しい
・所有権の概念が難しい
・何をするにしても外部ライブラリが必要(乱数生成など)
・ポインタが難しい
2021/06/22(火) 12:16:52.83ID:hfO2UPRV
・検索すると同名のゲームの話ばかり出てくる
2021/06/22(火) 12:26:02.44ID:jOUHjhXv
・static変数の扱いが面倒臭い
76デフォルトの名無しさん
2021/06/22(火) 12:52:20.13ID:P9tLBTwV >>64
>その場合でも、まず与えられたデータが0終端しているかどうかを確認する必要がありますよね。
「0終端文字列」
というのは、必ず0終端されている文字列の事なので確認は不要。
それを明確にするために、C言語では、const char *pszText; のように、
psz という接頭辞をつける流儀がある。
psz = pointer to string ending with zero.
「0で終端している文字列へのポインタ」
という意味。これは、単なる const char *ptr; とは意味が異なる。
char c = 'A';
const char *ptr = &c; // 単なる文字へのポインタ。0終端されていない。
char szText[] = "Hello"; // 0終端文字列。0終端されている。
const char *pszText = szText; // 0終端文字列へのポインタ。0終端されている。
>その場合でも、まず与えられたデータが0終端しているかどうかを確認する必要がありますよね。
「0終端文字列」
というのは、必ず0終端されている文字列の事なので確認は不要。
それを明確にするために、C言語では、const char *pszText; のように、
psz という接頭辞をつける流儀がある。
psz = pointer to string ending with zero.
「0で終端している文字列へのポインタ」
という意味。これは、単なる const char *ptr; とは意味が異なる。
char c = 'A';
const char *ptr = &c; // 単なる文字へのポインタ。0終端されていない。
char szText[] = "Hello"; // 0終端文字列。0終端されている。
const char *pszText = szText; // 0終端文字列へのポインタ。0終端されている。
2021/06/22(火) 13:23:35.92ID:D73AVe+6
>>76
ファイルから読んだデータをpszHogeに格納するときにゼロ終端の要件満たしてるか確認する必要あるよねって話だぞ
ファイルから読んだデータをpszHogeに格納するときにゼロ終端の要件満たしてるか確認する必要あるよねって話だぞ
2021/06/22(火) 13:25:24.28ID:RVuteXyT
>>74がマジで深刻すぎる
ついでに加藤純一っていうゲーム実況者とかとじゅんっていうRust/Scala使いがいるのも紛らわしい
ついでに加藤純一っていうゲーム実況者とかとじゅんっていうRust/Scala使いがいるのも紛らわしい
2021/06/22(火) 13:35:53.88ID:IhZgQU+B
2021/06/22(火) 14:06:03.07ID:P9tLBTwV
2021/06/22(火) 14:15:33.98ID:3bNpX0tT
そこで確認不要とか言ってるからユーザにヌル文字含んだ文字列渡されて死ぬのでは
2021/06/22(火) 14:51:42.58ID:jOUHjhXv
セキュアプログラムは面倒だからなー
数値のオーバーフローチェックとかみんなやらないでしょ?
アップキャストして値に結果を放り込んでチェックした後、
ダウンキャストするとか面倒すぎる
数値のオーバーフローチェックとかみんなやらないでしょ?
アップキャストして値に結果を放り込んでチェックした後、
ダウンキャストするとか面倒すぎる
83デフォルトの名無しさん
2021/06/22(火) 15:18:09.96ID:YfWe7YWP >>73
Cより面倒臭そうω
Cより面倒臭そうω
84デフォルトの名無しさん
2021/06/22(火) 15:19:46.85ID:YfWe7YWP >>76
そこまで出鱈目な話初めて聴いたわ
そこまで出鱈目な話初めて聴いたわ
2021/06/22(火) 15:22:37.78ID:P9tLBTwV
>>81
そういう外部からの入力に対するエラーチェックはするのは当然だが、
0終端文字列でやる場合には、ファイルのバイト数だけ読み込んで、
一番最後に 0 を書き込んでおくとそれ以上まで進むことはない。
途中の 0 に関しては スライス方式でも同じ問題が残る。
途中に 0 が有っても大丈夫な様に作るだけ。
そういう外部からの入力に対するエラーチェックはするのは当然だが、
0終端文字列でやる場合には、ファイルのバイト数だけ読み込んで、
一番最後に 0 を書き込んでおくとそれ以上まで進むことはない。
途中の 0 に関しては スライス方式でも同じ問題が残る。
途中に 0 が有っても大丈夫な様に作るだけ。
2021/06/22(火) 15:24:47.81ID:P9tLBTwV
>>84
ちなみに、リアルワールドでは俺は名プログラマだと評価されているぞ。
ちなみに、リアルワールドでは俺は名プログラマだと評価されているぞ。
2021/06/22(火) 15:27:25.45ID:P9tLBTwV
良いプログラムを作るための基本ポリシー:
・外部データと内部データは明確に分ける。
・外部データを内部データに入れる場合は、エラーチェックを徹底的にする。
・内部データに関しては、原則的には完全に正しいことを前提にしてプログラム
して良い。ただし、プログラムのミスのための念のためのチェックはしても良い。
・外部データと内部データは明確に分ける。
・外部データを内部データに入れる場合は、エラーチェックを徹底的にする。
・内部データに関しては、原則的には完全に正しいことを前提にしてプログラム
して良い。ただし、プログラムのミスのための念のためのチェックはしても良い。
2021/06/22(火) 15:47:48.20ID:cJZ3y9Eg
>>87
3番目のチェックはアサーション(assert)だと思うけどあれはコードを読む人に背景の条件を明示する意味もあるね
逆にアサーション以外の余計なチェックはコードを読む人を混乱させる可能性がある
3番目のチェックはアサーション(assert)だと思うけどあれはコードを読む人に背景の条件を明示する意味もあるね
逆にアサーション以外の余計なチェックはコードを読む人を混乱させる可能性がある
2021/06/22(火) 16:20:58.03ID:N/B8oZfx
ヌル終端はパンチカードが現役だった時代に数バイトケチった名残
互換性のためにサポートしなきゃいけないのは理解できるが
今の時代にヌル終端が優れてるとかそれをデフォルトにしろってのは控えめに言って頭おかしい
互換性のためにサポートしなきゃいけないのは理解できるが
今の時代にヌル終端が優れてるとかそれをデフォルトにしろってのは控えめに言って頭おかしい
90デフォルトの名無しさん
2021/06/22(火) 16:22:09.51ID:jOUHjhXv >>87
外部と内部の定義プリーズ
外部と内部の定義プリーズ
2021/06/22(火) 16:30:14.48ID:P9tLBTwV
>>90
外部でーたとしては、他にも有ると思うが、一例としては、
1. 他人が自由に書けるファイルから読み取ったばかりのデータ。
(アプリケーション内部にリソースデータとして内蔵し、安全性が
テスト済みであるようなファイルは内部データとみなしても良い場合も有る。)
2. 安全対策を徹底したいライブラリの場合は、ライブラリを使う側が関数に
渡してきたテキストデータや引数の値。
ただし、このようなものまで徹底的にチェックするとなれば遅くなるので、
設計思想によっては、NO-CHECK、または、軽いチェックだけで済ましても良い。
3. OSの場合は、同様なものとして、APIを呼び出した側が渡してきたデータ。
これは、安全性チェックは徹底して行う必要がある。
4. データベースソフトなどの場合も、2や3に準ずる。どこまで安全チェックするかは、
使用目的や用途、設計思想による。
外部でーたとしては、他にも有ると思うが、一例としては、
1. 他人が自由に書けるファイルから読み取ったばかりのデータ。
(アプリケーション内部にリソースデータとして内蔵し、安全性が
テスト済みであるようなファイルは内部データとみなしても良い場合も有る。)
2. 安全対策を徹底したいライブラリの場合は、ライブラリを使う側が関数に
渡してきたテキストデータや引数の値。
ただし、このようなものまで徹底的にチェックするとなれば遅くなるので、
設計思想によっては、NO-CHECK、または、軽いチェックだけで済ましても良い。
3. OSの場合は、同様なものとして、APIを呼び出した側が渡してきたデータ。
これは、安全性チェックは徹底して行う必要がある。
4. データベースソフトなどの場合も、2や3に準ずる。どこまで安全チェックするかは、
使用目的や用途、設計思想による。
92デフォルトの名無しさん
2021/06/22(火) 16:34:27.28ID:jOUHjhXv ちょっと緩くないか?
2021/06/22(火) 16:48:00.98ID:FRtvqWA7
信頼境界線の引き方は諸説あるだろ。
2021/06/22(火) 19:06:39.53ID:R8WO8pxt
一般に、アプリの外に置いてあるファイルはチェックした方が良いが、
その中でも、テキストファイルは、信頼置け無い事が多いのでチェックは必要。
アプリの外に置いてあっても、バイナリデータだと人が手書きすることはないため、
設計思想にもよるが、安全チェックはある程度省略しても良いと考える流儀もありえる。
その中でも、テキストファイルは、信頼置け無い事が多いのでチェックは必要。
アプリの外に置いてあっても、バイナリデータだと人が手書きすることはないため、
設計思想にもよるが、安全チェックはある程度省略しても良いと考える流儀もありえる。
2021/06/22(火) 19:33:50.85ID:D73AVe+6
結局アプリケーションがどう使われるか次第でしょ
アプリケーション作成時の前提が利用シーンの増加により後から覆されるなんてことは良くあることだから
性能要件がない限り最初から安全側に倒しておくのが合理的
アプリケーション作成時の前提が利用シーンの増加により後から覆されるなんてことは良くあることだから
性能要件がない限り最初から安全側に倒しておくのが合理的
2021/06/23(水) 11:02:20.62ID:o/eJBU4s
constデフォルトあたりの話ってgoto禁止論みたいになっている気がする
理由を理解していないがとりあえずそうしておけみたいな人を少なからず見かけるような
>>94
パーサーがガバガバで細工したセーブデータで乗っ取られるゲームのことか
理由を理解していないがとりあえずそうしておけみたいな人を少なからず見かけるような
>>94
パーサーがガバガバで細工したセーブデータで乗っ取られるゲームのことか
97デフォルトの名無しさん
2021/06/23(水) 14:27:15.67ID:LIFxwhU8 >>95
MS製のリンカ(link.exe)の入力するlibraryファイル(*.lib)には、
ヘッダ部分にシンボルがアルファベット順にソートされたシンボルテーブル
が入っている。ソートされていることを前提にバイナリサーチが出来るので
シンボルを検索するのが高速になるとされる。バイナリサーチは、ソート
されているデータに対してのみ正しく検索できて、もしソートされていなければ
間違った結果になる。
しかし、link.exeが*.libを入力する時、ちゃんとシンボルテーブルのシンボル
がソートされたかどうかチェックしているかと言うと、定かではない。
だから、もし、サードパーティー製のツールが*.lib を作成した時、
ソートにミスがあったりすると、link.exeはundefined symbolエラーを出すか、
リンクには成功するが、実行段階でアプリが起動できなかったり途中でダウン
してしまうかも知れない。その様な場合、何が原因かは分からないであろうが、
多分、実際、検査はされてない。
MS製のリンカ(link.exe)の入力するlibraryファイル(*.lib)には、
ヘッダ部分にシンボルがアルファベット順にソートされたシンボルテーブル
が入っている。ソートされていることを前提にバイナリサーチが出来るので
シンボルを検索するのが高速になるとされる。バイナリサーチは、ソート
されているデータに対してのみ正しく検索できて、もしソートされていなければ
間違った結果になる。
しかし、link.exeが*.libを入力する時、ちゃんとシンボルテーブルのシンボル
がソートされたかどうかチェックしているかと言うと、定かではない。
だから、もし、サードパーティー製のツールが*.lib を作成した時、
ソートにミスがあったりすると、link.exeはundefined symbolエラーを出すか、
リンクには成功するが、実行段階でアプリが起動できなかったり途中でダウン
してしまうかも知れない。その様な場合、何が原因かは分からないであろうが、
多分、実際、検査はされてない。
2021/06/23(水) 14:30:46.54ID:LIFxwhU8
>>97
実際は、サードパーティー製ツールも、ちゃんと*.libのヘッダのシンボルテーブルの
シンボルはソートしており、その部分にはバグはないので、それがソートされてない
*.libは基本的には存在しない。
ただし、*.libをバイナリエディタで開いて手作業で間違って変更したりすると
ソートされていないものが出来上がる。
それをlink.exeに入力しても、link.exeは、そのことに関してのエラーは出さない
だろう。
実際は、サードパーティー製ツールも、ちゃんと*.libのヘッダのシンボルテーブルの
シンボルはソートしており、その部分にはバグはないので、それがソートされてない
*.libは基本的には存在しない。
ただし、*.libをバイナリエディタで開いて手作業で間違って変更したりすると
ソートされていないものが出来上がる。
それをlink.exeに入力しても、link.exeは、そのことに関してのエラーは出さない
だろう。
99デフォルトの名無しさん
2021/06/23(水) 16:29:36.30ID:6jEPjWCz Rustのスレだよね?
100デフォルトの名無しさん
2021/06/23(水) 17:44:15.71ID:rKa/khCP 小学生が大人に九九暗唱してみせれば微笑ましいが
大人が大人に九九暗唱してみせるなら不気味で滑稽である
大人が大人に九九暗唱してみせるなら不気味で滑稽である
101デフォルトの名無しさん
2021/06/23(水) 18:25:31.65ID:mfn5LAEG 意図通りに動かないバグにつながるという話と
バッファオーバーフローみたいな脆弱性につながるという話は別だよね
バッファオーバーフローみたいな脆弱性につながるという話は別だよね
102デフォルトの名無しさん
2021/06/23(水) 19:58:13.96ID:smIE1EjE 再帰を使って1x1=1から9x9=81までの答えだけを書く場合
どうやって書けますか?
どうやって書けますか?
103デフォルトの名無しさん
2021/06/23(水) 20:12:50.89ID:1lBkKsRv fixコンビネータを使う
104デフォルトの名無しさん
2021/06/23(水) 22:38:48.46ID:GhG+XcCm >>102
題意に沿ってるか分からんけど
fn main() {
f(1, 1);
}
fn f(a: u32, b: u32) {
//println!("{}x{}={}", a, b, a * b);
println!("{}", a * b);
match (a, b) {
(9, 9) => return,
(_, 9) => f(a+1, 1),
(_, _) => f(a, b+1),
}
}
題意に沿ってるか分からんけど
fn main() {
f(1, 1);
}
fn f(a: u32, b: u32) {
//println!("{}x{}={}", a, b, a * b);
println!("{}", a * b);
match (a, b) {
(9, 9) => return,
(_, 9) => f(a+1, 1),
(_, _) => f(a, b+1),
}
}
105デフォルトの名無しさん
2021/06/23(水) 23:13:30.14ID:Cy7wfzk/ 実践的な話をするとRustは末尾再帰最適化が出来ないからなるべく再帰は使わないほうがいいと思う
106デフォルトの名無しさん
2021/06/24(木) 01:50:53.81ID:UNoTdpdl 宿題かなんかだろう。
Rustで宿題を課すなんて教官は変態にもほどがある。
Rustで宿題を課すなんて教官は変態にもほどがある。
107デフォルトの名無しさん
2021/06/24(木) 23:17:10.64ID:zHNnGFYG >>104の例だとtail recursionになっていないから
内部でloop化できる仮言語で書いてもこのように分解するしかなくて
f(1)
fn f(a) {
f2(a, 1)
f(a+1) if a != 9
}
fn f2(a, b) {
print `${a}x${b}=${a*b}`
f2(a, b + 1) if b != 9
}
結局のところ関数分割→個別ループ化→関数統合で二重ループ化まで自動でしてくれる言語は無いから
再帰は使わずに自分でループ化すればいいよね、って結論
つまりアルゴリズムでは再帰で考えても実装はループにしてコメント残しておくのが正解
内部でloop化できる仮言語で書いてもこのように分解するしかなくて
f(1)
fn f(a) {
f2(a, 1)
f(a+1) if a != 9
}
fn f2(a, b) {
print `${a}x${b}=${a*b}`
f2(a, b + 1) if b != 9
}
結局のところ関数分割→個別ループ化→関数統合で二重ループ化まで自動でしてくれる言語は無いから
再帰は使わずに自分でループ化すればいいよね、って結論
つまりアルゴリズムでは再帰で考えても実装はループにしてコメント残しておくのが正解
108はちみつ餃子 ◆8X2XSCHEME
2021/06/25(金) 00:17:11.72ID:/YhIejlL >>107
プログラミング言語 Scheme の仕様だと >>104 のようなパターンは末尾文脈の定義にあてはまるし
末尾呼出し最適化が適用されることが保証されるから、
現代的な言語処理系で最適化できないとは信じられないんだけど、
実際にRust コンパイラに >>104 を与えたときにループに最適化はしないの?
Rust のコンパイラの使い方に不慣れでアセンブリコードの出力のさせかたがよくわからん……。
ほぼそのまま C のコードに書き換えてみたら
GCC ではジャンプに置き換えたコードが生成されるみたいだし……。
(ちなみに GCC では末尾呼出しになっていなくても一部の状況では再帰をループに変形できることがある。)
Clang だとループを全部 unroll しやがった!
プログラミング言語 Scheme の仕様だと >>104 のようなパターンは末尾文脈の定義にあてはまるし
末尾呼出し最適化が適用されることが保証されるから、
現代的な言語処理系で最適化できないとは信じられないんだけど、
実際にRust コンパイラに >>104 を与えたときにループに最適化はしないの?
Rust のコンパイラの使い方に不慣れでアセンブリコードの出力のさせかたがよくわからん……。
ほぼそのまま C のコードに書き換えてみたら
GCC ではジャンプに置き換えたコードが生成されるみたいだし……。
(ちなみに GCC では末尾呼出しになっていなくても一部の状況では再帰をループに変形できることがある。)
Clang だとループを全部 unroll しやがった!
109デフォルトの名無しさん
2021/06/25(金) 11:49:33.37ID:UuPR+dCF c言語だと再帰が末尾呼び出し最適化されるかどうかがオプティマイズレベルで変わるからややこしい。
リリース版だと動くがデバッグ版だとスタックオーバーフローみたいな事になる。
単純な再帰ならループに書き直してもいいけど、相互再帰みたいなのは末尾呼び出し最適化してくれないと困る。
リリース版だと動くがデバッグ版だとスタックオーバーフローみたいな事になる。
単純な再帰ならループに書き直してもいいけど、相互再帰みたいなのは末尾呼び出し最適化してくれないと困る。
110デフォルトの名無しさん
2021/06/25(金) 11:58:36.77ID:CpYoiDkc あの、Rustの勉強のために逆引きサンプルwiki作ろうと思うんですけど
テンプレ殿堂入りを目指して作ってもいいですか?
もちろん広告は入れませんが、レンタルwikiが提供している広告は表示されるかもしれませんが。。。
テンプレ殿堂入りを目指して作ってもいいですか?
もちろん広告は入れませんが、レンタルwikiが提供している広告は表示されるかもしれませんが。。。
112デフォルトの名無しさん
2021/06/25(金) 12:18:21.65ID:CpYoiDkc 先輩ありがとうございます!
受け入れてもらえるようなコンテンツを作ります!
受け入れてもらえるようなコンテンツを作ります!
113デフォルトの名無しさん
2021/06/25(金) 15:26:59.18ID:CCUOu52e 5chに閉じずに本家のコミュニティにも便利と思ってもらえるもの目指した方が良いのでは
114デフォルトの名無しさん
2021/06/26(土) 00:57:24.13ID:QiaGJu0I >>86
ただし石器時代のな
ただし石器時代のな
115デフォルトの名無しさん
2021/06/26(土) 02:18:19.63ID:morUmgAo >>114
ミンチメーカー、ではなくスパゲティメーカーとして恐れられてるかもな
ミンチメーカー、ではなくスパゲティメーカーとして恐れられてるかもな
116デフォルトの名無しさん
2021/06/26(土) 03:08:39.74ID:ljqTs+jf Rustと他の言語との違いについて興味深い観点で盛り上がってるスレ
特に後半
趣味でプログラミングの勉強するとしたら何言語がいい?
https://matsuri.5ch.net/test/read.cgi/morningcoffee/1623527901/
特に後半
趣味でプログラミングの勉強するとしたら何言語がいい?
https://matsuri.5ch.net/test/read.cgi/morningcoffee/1623527901/
117デフォルトの名無しさん
2021/06/26(土) 12:15:14.01ID:jgmCFZtl 斜め読みしかしてないから見逃してるかも知れないけどさんざん言い尽くされた話ばかりだった気が
そもそもRust自体はC++を置き換えることを目的にはしていない
そもそもRust自体はC++を置き換えることを目的にはしていない
118デフォルトの名無しさん
2021/06/26(土) 14:26:52.57ID:UK7NU6RE やたらC++と比較されるのはどっちもbetter Cの側面があるからだろうか
個人的にRustはCとScheme(Lisp)のハーフという印象
SchemeよりMLの方が近いらしいけどMLは使ったことないからよく分からない
手続き型で関数型を疑似表現したり関数型で手続き型を疑似表現する試みがあるけど
Rustはその中間を上手く埋めてる感じ
個人的にRustはCとScheme(Lisp)のハーフという印象
SchemeよりMLの方が近いらしいけどMLは使ったことないからよく分からない
手続き型で関数型を疑似表現したり関数型で手続き型を疑似表現する試みがあるけど
Rustはその中間を上手く埋めてる感じ
119デフォルトの名無しさん
2021/06/26(土) 14:33:02.82ID:S/dGZFG2 > better Cの側面がある
はぁ?
お前がcもc++もrustもニワカなのは分かった
あと五年間は、カキコ無前にROMに徹してみてほしい
はぁ?
お前がcもc++もrustもニワカなのは分かった
あと五年間は、カキコ無前にROMに徹してみてほしい
120デフォルトの名無しさん
2021/06/26(土) 15:07:09.40ID:UK7NU6RE121デフォルトの名無しさん
2021/06/26(土) 15:16:37.21ID:zCIOA2Bt 実際にはRustはbetter D
122デフォルトの名無しさん
2021/06/26(土) 15:47:21.36ID:vR4ZYNRj 急に発狂する奴はどこの掲示板にもいる 気にするな
123デフォルトの名無しさん
2021/06/26(土) 16:24:43.50ID:MKHy+X82 わざわざ自演するようなことかね?
124デフォルトの名無しさん
2021/06/26(土) 16:34:36.83ID:jgmCFZtl mozillaのc++を安全に使う数多の取り組みに疲れ果てた結果出てきた新言語がrustなのでc++と比較されるのは当然
125デフォルトの名無しさん
2021/06/26(土) 18:03:00.84ID:cKS/UcnU この板全域に出没して何でもRubyと比較するガイジみたいなもんだろ
ここにはなぜかいないけど
ここにはなぜかいないけど
126デフォルトの名無しさん
2021/06/26(土) 18:06:17.50ID:uWTCkdSJ127デフォルトの名無しさん
2021/06/26(土) 19:35:22.90ID:pNIxzUaQ 今から新規のプロジェクトをC++かRustで始めるとなったらRustの一択でしょう
つまりRustはbetter C++
つまりRustはbetter C++
128デフォルトの名無しさん
2021/06/26(土) 21:22:24.72ID:yvLLLScj まったく何も資産がない新規であればそうかもしれんが
129デフォルトの名無しさん
2021/06/26(土) 21:36:19.59ID:js6oaYoM130デフォルトの名無しさん
2021/06/26(土) 21:43:00.01ID:pNIxzUaQ つまり過去のしがらみのある案件は時間がかかり遅れるが
いずれも徐々にC++はRustへ置き換えられていく
いずれも徐々にC++はRustへ置き換えられていく
131デフォルトの名無しさん
2021/06/26(土) 21:48:35.28ID:IGj3fs8T 逆に枯れてる分野でしか実装されんわ
132デフォルトの名無しさん
2021/06/26(土) 21:51:34.18ID:uWTCkdSJ emacsとあとなんだっけ? SVGのライブラリ?が
オブジェクトファイル *.o 単位で少しずつCからRustに移植してたな
オブジェクトファイル *.o 単位で少しずつCからRustに移植してたな
133デフォルトの名無しさん
2021/06/26(土) 22:01:32.26ID:WPp8qNv5 librsvgだね
134デフォルトの名無しさん
2021/06/26(土) 23:01:02.22ID:UK7NU6RE135デフォルトの名無しさん
2021/06/27(日) 00:09:44.66ID:hddKqCef それは単に式指向という話なのでは
136デフォルトの名無しさん
2021/06/27(日) 00:12:27.99ID:HvPCU4P8 MLの方が普通に近いな
パターンマッチとか束縛がletとかHMの型システムだとか
パターンマッチとか束縛がletとかHMの型システムだとか
137デフォルトの名無しさん
2021/06/27(日) 01:36:30.56ID:AjjhDlM0 一番近いのは Ocaml。なぜなら、かつてRustはOcamlで組まれていたから。
そして途中でコンパイラをRust自身に直したと聞いた。
そして途中でコンパイラをRust自身に直したと聞いた。
138はちみつ餃子 ◆8X2XSCHEME
2021/06/27(日) 03:28:07.65ID:+5rTVQj/ Rust の Scheme っぽいところを探すとしたらマクロだろ。
伝統的な Lisp 系言語だと実行時の環境とマクロ展開時の環境を分けないが、
Scheme は分ける方針をとってる。
(実際には分けない実装をしている処理系もあるし、次の仕様の更新でどうなるか不透明だけど。)
伝統的な Lisp 系言語だと実行時の環境とマクロ展開時の環境を分けないが、
Scheme は分ける方針をとってる。
(実際には分けない実装をしている処理系もあるし、次の仕様の更新でどうなるか不透明だけど。)
139デフォルトの名無しさん
2021/06/27(日) 12:22:30.08ID:HfXxTqRR 何に近いかでここまで盛り上がれるのだね
何も産まないのに
何も産まないのに
140デフォルトの名無しさん
2021/06/27(日) 12:24:39.60ID:lZYiAKce Parkinson's Law of Triviality
141デフォルトの名無しさん
2021/06/27(日) 13:55:37.78ID:00z9rPIn >>139
比較から何かを見出せる人もいるから何も産まないということはないよ
比較から何かを見出せる人もいるから何も産まないということはないよ
142デフォルトの名無しさん
2021/06/27(日) 14:24:31.82ID:me9wSnu9 そんなセンスのある人がここにいると思うのww?
センスないねw
センスないねw
143デフォルトの名無しさん
2021/06/28(月) 20:31:57.40ID:cQA8O+iD ちょっと見ないうちに色々変わる+自分の理解が浅いせいで追いつけない
144デフォルトの名無しさん
2021/06/29(火) 16:25:09.28ID:W3FYE8ZM RustのIDEでおすすめを教えて
145デフォルトの名無しさん
2021/06/29(火) 19:29:01.37ID:EbM9PL2b VSCode+rust-analyzerが定番
146デフォルトの名無しさん
2021/06/30(水) 01:32:52.11ID:kSD4a98e bindgenって複雑なヘッダーだと全然駄目なんだなあ
殆どそれ目的でRustやってたのに
殆どそれ目的でRustやってたのに
147デフォルトの名無しさん
2021/06/30(水) 09:59:01.57ID:2LaR0NZ5 >>146
実際に使ってみて初めて分かる問題点だね。
実際に使ってみて初めて分かる問題点だね。
148デフォルトの名無しさん
2021/06/30(水) 22:36:50.05ID:Nj/xCjQN >>146
CXXはどうですか?
CXXはどうですか?
149デフォルトの名無しさん
2021/07/03(土) 10:43:55.27ID:6NDcSyYc rust始めました!
ってゲームの方を始めてたネタをやろうと思ったけど
想像以上にクソゲー過ぎてダメだった
やっぱり言語の方がいい
ってゲームの方を始めてたネタをやろうと思ったけど
想像以上にクソゲー過ぎてダメだった
やっぱり言語の方がいい
150デフォルトの名無しさん
2021/07/03(土) 16:18:59.47ID:VnJT/Tz5 検索するとゲームの方と言語の方が出てきてややこしい
Rust(ゲーム)は名前変えてくれ...
Rust(ゲーム)は名前変えてくれ...
151デフォルトの名無しさん
2021/07/03(土) 16:30:28.41ID:lPTKqMkr それな
go(一般動詞)も名前を変えてくれ
go(一般動詞)も名前を変えてくれ
152デフォルトの名無しさん
2021/07/03(土) 16:48:51.41ID:VnJT/Tz5 GoはGolangって別名があるから問題ないけどRustに関してはRustLangとはあまり言わないのがなぁ
153デフォルトの名無しさん
2021/07/03(土) 17:18:42.64ID:HAk/Aizq まあそれはRustの問題ではないですが、クロス環境に問題を感じているなら、Haskellがお勧めですよ。
あわしろ氏がいつも言ってることですがね。
あわしろ氏がいつも言ってることですがね。
154デフォルトの名無しさん
2021/07/03(土) 18:23:28.50ID:yvqGZDdm rustlang言わない?
155デフォルトの名無しさん
2021/07/03(土) 19:07:06.86ID:3WlrzvVf そもそもオフィシャルのレポジトリ名がrust-lang/rustだし普通に言うのでは
156デフォルトの名無しさん
2021/07/03(土) 19:51:08.37ID:VnJT/Tz5 言わなくはないけどRustLangよりはRustと呼ばれることのが多い気がする
GoだったらGo(golang)とかGolangとか言われることが多いけど
GoだったらGo(golang)とかGolangとか言われることが多いけど
157デフォルトの名無しさん
2021/07/03(土) 22:13:02.85ID:yvqGZDdm 単にgoよりgooglabilityが高いことのあらわれじゃね
別にそんなに困ったこと無いけどな
別にそんなに困ったこと無いけどな
158デフォルトの名無しさん
2021/07/03(土) 23:01:24.13ID:5pcVeoYl ていうかGoはもうgolangに改名したほうがいいと思う
Goではとにかく名前がクソすぎる
そもそもなんかダサいし
Goではとにかく名前がクソすぎる
そもそもなんかダサいし
159デフォルトの名無しさん
2021/07/04(日) 00:56:25.25ID:KTwjVJIR goはogle(いやらしい目で見る)という名前のデバッガとセットで売り出す予定だったけど
ogleがこけたから残念な名前だけが残ってしまった
ogleがこけたから残念な名前だけが残ってしまった
160デフォルトの名無しさん
2021/07/04(日) 01:51:19.90ID:1GGCqeGW Rustってゲームなかったっけ?
161デフォルトの名無しさん
2021/07/04(日) 05:17:25.91ID:pNIAvX41 あるからこまってる
162デフォルトの名無しさん
2021/07/04(日) 09:10:12.70ID:1GGCqeGW JuliaでAV女優ばっか出てくるのと一緒やな
163デフォルトの名無しさん
2021/07/04(日) 09:10:48.09ID:FDfsH90c たいていは rust + 別の単語 でググるけどゲームの情報が出てきて困ったことはあまりないかな
164デフォルトの名無しさん
2021/07/04(日) 09:12:10.94ID:Ik+vLhuV pythonってそう考えるとなかなかいいネーミング
165デフォルトの名無しさん
2021/07/04(日) 09:13:21.27ID:1GGCqeGW そういやRustはツイッター検索だとかなり厄介だったな
166デフォルトの名無しさん
2021/07/04(日) 09:25:35.54ID:FDfsH90c 既存の名詞使うときは perl みたいにスペルに一ひねり加えるのが良いんだろうね
rust でやるのは難しいけど
rust でやるのは難しいけど
167デフォルトの名無しさん
2021/07/04(日) 17:06:20.02ID:DVzGg7Pn168デフォルトの名無しさん
2021/07/05(月) 22:26:57.75ID:GYdy1bNH Rust とかGoとか固有名詞やめてほしいよね。。。
169デフォルトの名無しさん
2021/07/06(火) 00:14:23.09ID:cmRSsVyO 固有名詞でない言語名...
「名前を言ってはいけないあの言語」みたいな名付けかな
「名前を言ってはいけないあの言語」みたいな名付けかな
170デフォルトの名無しさん
2021/07/06(火) 00:37:05.95ID:GFPrEw7Y 既存の固有名詞じゃない方が珍しい気がする
171デフォルトの名無しさん
2021/07/06(火) 07:26:35.07ID:SYh5jqXt そう言う意味だとCとか最悪だな
172デフォルトの名無しさん
2021/07/06(火) 09:07:51.28ID:qxjbHNhG langを付けると意味が変わるしCは本当に検索ワードに迷う
173デフォルトの名無しさん
2021/07/06(火) 10:07:00.27ID:t2+Z62DR C++もtwitterでは検索できない。C#もだけど。
それは、わざとなんらかかの意図を持ってされていることかも知れない。
twitteの社長や技術者がC++が嫌いだとか。
それは、わざとなんらかかの意図を持ってされていることかも知れない。
twitteの社長や技術者がC++が嫌いだとか。
174デフォルトの名無しさん
2021/07/06(火) 11:00:10.66ID:cmRSsVyO / も無視されるし単純に記号が無視されるだけでしょ
175デフォルトの名無しさん
2021/07/06(火) 11:33:36.74ID:GDULTuH0 つまりまたもやlispが最強だと判明してしまったわけたな
176デフォルトの名無しさん
2021/07/06(火) 12:33:05.02ID:paV/EiqB ガイジ度でRubyには勝てんだろ
177デフォルトの名無しさん
2021/07/06(火) 13:48:45.02ID:t2+Z62DR >>174
技術的には簡単に直せるのに直さないところに意図を感じる。
技術的には簡単に直せるのに直さないところに意図を感じる。
178デフォルトの名無しさん
2021/07/06(火) 15:47:25.27ID:qxjbHNhG 技術的に簡単だと思うなら外部サービスとして提供してみたら?
179デフォルトの名無しさん
2021/07/06(火) 17:48:26.50ID:W6OOwnvK 外部から伺い知れない部分について簡単に違いないと断言する人とは議論しとうない
180デフォルトの名無しさん
2021/07/06(火) 17:56:26.40ID:luG13vJj 全文検索とか形態素解析を少しでもかじってたら簡単とは思えないはずなんだけどね。
181デフォルトの名無しさん
2021/07/06(火) 18:02:06.64ID:t2+Z62DR182デフォルトの名無しさん
2021/07/06(火) 18:08:31.76ID:8bcWgGBz 人は陰謀論が大好きなんですよ
183デフォルトの名無しさん
2021/07/06(火) 18:15:25.48ID:nSctAZgU 字句解析と形態素解析や全文検索はまったくの別物だろう
184デフォルトの名無しさん
2021/07/06(火) 18:16:09.96ID:t2+Z62DR 陰謀論とかじゃなくて、壊したい相手に不利なようにするのがアメリカ流なんだよ。
卑怯な手口だが、卑怯という概念にはあの国には無いのだろう。
あの国の連中は、ことごとくそういう手口で生き残っているから、そのうち
技術の進歩が遅れてある時、がさっと負けだすかも知れないな、GAFAMも含めて。
卑怯な手口だが、卑怯という概念にはあの国には無いのだろう。
あの国の連中は、ことごとくそういう手口で生き残っているから、そのうち
技術の進歩が遅れてある時、がさっと負けだすかも知れないな、GAFAMも含めて。
185デフォルトの名無しさん
2021/07/06(火) 18:17:03.75ID:t2+Z62DR >>183
形態素解析などに入る前に、例えば、C++をcppと同一視してしまえばいいんだ。
形態素解析などに入る前に、例えば、C++をcppと同一視してしまえばいいんだ。
186デフォルトの名無しさん
2021/07/06(火) 18:20:48.86ID:M25Qh6q2 簡単に直せる
(計算量が増えたり既存機能に影響を与えたりするかもしれないけど)
ってことでしょ
(計算量が増えたり既存機能に影響を与えたりするかもしれないけど)
ってことでしょ
187デフォルトの名無しさん
2021/07/06(火) 19:17:37.60ID:luG13vJj >>186
それを簡単と呼ぶのは研究とかラボの人間よね。
それを簡単と呼ぶのは研究とかラボの人間よね。
188デフォルトの名無しさん
2021/07/06(火) 20:35:47.80ID:5M+Sovmm 字句解析と形態素解析の違いもわからないのはちょっと…
189デフォルトの名無しさん
2021/07/06(火) 23:19:32.02ID:cmRSsVyO まーたrustと関係ない話してる
190デフォルトの名無しさん
2021/07/06(火) 23:35:07.67ID:qUsPK4G4 「また」って言うけど「いつも」の間違いだろ?
191デフォルトの名無しさん
2021/07/07(水) 08:37:56.63ID:ICcjc0w9 >>184
で、c++を壊してtwitterにどんなメリットが?アホなの?
で、c++を壊してtwitterにどんなメリットが?アホなの?
192デフォルトの名無しさん
2021/07/07(水) 10:14:36.36ID:ifayQQT8 アホだと分かってるなら構うなよ
193デフォルトの名無しさん
2021/07/07(水) 10:38:37.05ID:fRD7zTM6 https://lore.kernel.org/lkml/20210704202756.29107-1-ojeda@kernel.org/
panic問題は大部分解決されたみたい
panic問題は大部分解決されたみたい
194デフォルトの名無しさん
2021/07/08(木) 01:55:46.25ID:qbgAaMCH そういうのは形態素解析したあと、同義語辞書(シソーラス)で単語を正規化する作業になる。
形態素解析の段階で記号は除去しないとややこしくなるから記号入りの単語を使うのが悪いわな。
形態素解析の段階で記号は除去しないとややこしくなるから記号入りの単語を使うのが悪いわな。
195デフォルトの名無しさん
2021/07/09(金) 19:08:10.80ID:XWrdIq9z ハッカーが使わない言語は流行らない。メモリ安全だけじゃ一部需要のみ
楽しい言語も流行らない。いつも趣味レベルの言語で終わる
楽しい言語も流行らない。いつも趣味レベルの言語で終わる
196デフォルトの名無しさん
2021/07/09(金) 19:58:26.11ID:/dpK029q ハッカーって言葉久々に聞いた
197デフォルトの名無しさん
2021/07/09(金) 20:07:52.69ID:vKrZ9ebb 自分のこと賢いと思ってそう
198デフォルトの名無しさん
2021/07/09(金) 21:36:56.44ID:6sMTa3MH 流行で選ぶってアフィチューバーやアフィブロガーかな?
199デフォルトの名無しさん
2021/07/10(土) 06:29:54.67ID:XPpA1ojF 一通り学習したつもりになったから、WebAPIで情報取得するプログラムでもいざ書いてみようと思ったら・・・・
いきなりreqwestのクレートでasync/awaitの壁があったぜ
これThe Bookのキーワードの項目にはあるものの、本編で出てきたっけ???
https://doc.rust-lang.org/book/appendix-01-keywords.html
ちょっと適当に書いてみた感じ、他言語と違ってawaitしたところでアンラップされないのかな・・・・・?全然わからん
これって何を見たら学習できるの?
いきなりreqwestのクレートでasync/awaitの壁があったぜ
これThe Bookのキーワードの項目にはあるものの、本編で出てきたっけ???
https://doc.rust-lang.org/book/appendix-01-keywords.html
ちょっと適当に書いてみた感じ、他言語と違ってawaitしたところでアンラップされないのかな・・・・・?全然わからん
これって何を見たら学習できるの?
200デフォルトの名無しさん
2021/07/10(土) 07:10:52.64ID:hr5Pc4AR201デフォルトの名無しさん
2021/07/10(土) 08:40:15.75ID:FBIqRA7j reqwest::blocking使えば?
202デフォルトの名無しさん
2021/07/10(土) 09:30:24.80ID:GKhTMPF2 ぼこぼこDLしてウザ過ぎる
203デフォルトの名無しさん
2021/07/10(土) 09:31:26.47ID:GKhTMPF2 x.py build したあと、x.py install したら、
また意味不明にボコボコビルドし始めたんだけど、
知恵遅れなの?
また意味不明にボコボコビルドし始めたんだけど、
知恵遅れなの?
204デフォルトの名無しさん
2021/07/10(土) 09:47:05.85ID:4hsXIyfP そういう所は今後改善して欲しいわな
205デフォルトの名無しさん
2021/07/10(土) 13:41:38.31ID:e+Cu97LZ206デフォルトの名無しさん
2021/07/10(土) 13:52:24.60ID:aG/WAOkt >>199
ureq 使えよ
ureq 使えよ
207デフォルトの名無しさん
2021/07/10(土) 14:01:01.07ID:4hsXIyfP ハッカー専用の言語ってあるの?
208デフォルトの名無しさん
2021/07/10(土) 14:20:32.32ID:hyh546Qk prolog
209デフォルトの名無しさん
2021/07/10(土) 14:25:24.27ID:jayrPH8y いつまで miri のトラブルを放置しておくの?
ゴミ言語
ゴミ言語
210デフォルトの名無しさん
2021/07/10(土) 14:28:17.22ID:a84ckjUx ハッカーって・・・なに?
211デフォルトの名無しさん
2021/07/10(土) 14:44:49.05ID:e+Cu97LZ unsafeモードが使えても、safeモードでのコード生成結果が予測できないのであれば
使うのは難しい。
使うのは難しい。
212デフォルトの名無しさん
2021/07/10(土) 14:53:04.04ID:SrgkCeWe 無駄な通信と監視と役立たずのゴミでツリーを汚すゴミ
213デフォルトの名無しさん
2021/07/10(土) 16:15:47.34ID:9b6+aeFV ハッカーは書くスピードと実行時間が重要だからnimとかが向いてそう
少なくともRustは絶対にハッカーの第一言語にならない
少なくともRustは絶対にハッカーの第一言語にならない
214デフォルトの名無しさん
2021/07/10(土) 16:53:00.70ID:zdV39cNV お前がそう思うんならそういうことでいいよ
215デフォルトの名無しさん
2021/07/10(土) 17:38:05.35ID:nAGZi/ZP ハッカーとか呼んでねえからキーボードでもしゃぶってろ
216デフォルトの名無しさん
2021/07/10(土) 17:43:28.58ID:IKbPFXW0 最強言語議論スレでやれ
217デフォルトの名無しさん
2021/07/10(土) 17:56:33.98ID:wJrCg/wx 犯罪者用言語とか使いたくないなあ
218デフォルトの名無しさん
2021/07/11(日) 01:09:10.02ID:MzFRAytS ハッカー != 犯罪者 がモダンな解釈だと思うんだが。
○にかけのお爺さんかな?
○にかけのお爺さんかな?
219デフォルトの名無しさん
2021/07/11(日) 02:27:33.50ID:0Hcxwo3i ロシア人ハッカーグループって言ったら
犯罪者っぽくね?
犯罪者っぽくね?
220デフォルトの名無しさん
2021/07/11(日) 02:54:13.69ID:6/u0+cwV イスラエル人ハッカーグループって言うと
なにか巨大な国際政治がらみの陰謀っぽい
なにか巨大な国際政治がらみの陰謀っぽい
221デフォルトの名無しさん
2021/07/11(日) 03:33:22.44ID:PFbpUEa3 日本人ハッカーグループ
よわそう
よわそう
222デフォルトの名無しさん
2021/07/11(日) 03:47:16.72ID:OgOa7vqd 日本は、一人当りのGDPだと先進30カ国中最下位レベルだけど、純粋な頭脳線だと、
三位以内に入ることが良くある。
三位以内に入ることが良くある。
223デフォルトの名無しさん
2021/07/11(日) 09:25:42.31ID:Z2zeAI0N 純粋な頭脳線
224デフォルトの名無しさん
2021/07/11(日) 09:54:14.29ID:HGkeQify >>199
Rustはasync/awaitを言語レベルでゼロコストでサポートする代わりに非同期ランタイムを別途用意する必要がある
これによりRustでは様々な非同期ランタイムを言語と独立に自由に作ることができる
例えば非同期ランタイムを自作することも当然できてfuturesクレイトをその部品として使うことができる
もちろん非同期ランタイムを自作せずとも既に様々なコミュニティから提供されているのでそれを使うこともできる
具体的には例えば最も使われているtokioなどのチュートリアルを見るのが良いかな
https://tokio.rs/tokio/tutorial
Rustはasync/awaitを言語レベルでゼロコストでサポートする代わりに非同期ランタイムを別途用意する必要がある
これによりRustでは様々な非同期ランタイムを言語と独立に自由に作ることができる
例えば非同期ランタイムを自作することも当然できてfuturesクレイトをその部品として使うことができる
もちろん非同期ランタイムを自作せずとも既に様々なコミュニティから提供されているのでそれを使うこともできる
具体的には例えば最も使われているtokioなどのチュートリアルを見るのが良いかな
https://tokio.rs/tokio/tutorial
225デフォルトの名無しさん
2021/07/11(日) 11:06:14.34ID:MzFRAytS >>219-220
その考え方が古い。(というか最初から?)間違ってる。
ハッカー == 凄い奴 的な意図でしかないので
ロシアだろうがイスラエルだろうが某大陸だろうが
超エリートなんだろうなとしか思わない(事になってる)。
犯罪者はクラッカーと言って区別される(事になってる)。
区別しようと言い出したのは…(ry
その考え方が古い。(というか最初から?)間違ってる。
ハッカー == 凄い奴 的な意図でしかないので
ロシアだろうがイスラエルだろうが某大陸だろうが
超エリートなんだろうなとしか思わない(事になってる)。
犯罪者はクラッカーと言って区別される(事になってる)。
区別しようと言い出したのは…(ry
226デフォルトの名無しさん
2021/07/11(日) 12:38:13.92ID:8RaHq8wW でも発端の>>195の「ハッカー」はホワイトかブラックかは知らんがセキュリティ関連の話ちゃうんか?
227デフォルトの名無しさん
2021/07/11(日) 12:47:21.47ID:sDQUZcY3 >>225
モダンな解釈だと良いハッカー=ホワイトハッカー 悪いハッカー=ハッカーですね
あと老人ホームから抜け出してまで5chなんてしたら家族に迷惑かかりますよ
迷惑かけない内に尊厳死をおすすめします
モダンな解釈だと良いハッカー=ホワイトハッカー 悪いハッカー=ハッカーですね
あと老人ホームから抜け出してまで5chなんてしたら家族に迷惑かかりますよ
迷惑かけない内に尊厳死をおすすめします
228デフォルトの名無しさん
2021/07/11(日) 12:48:22.75ID:BdwgI/w3 そんな高度な話だったんだ
小学生がうんこちんちんって罵倒してるようなものだと理解していた
小学生がうんこちんちんって罵倒してるようなものだと理解していた
229デフォルトの名無しさん
2021/07/11(日) 15:23:07.49ID:MzFRAytS230デフォルトの名無しさん
2021/07/11(日) 15:31:18.36ID:lbKLD5N+ 相変わらずマウンター専用言語になっとるな
231デフォルトの名無しさん
2021/07/11(日) 15:34:34.85ID:HtoAUPrm 正しい定義がどうだろうと>>195の意図なんかわからんのでどうでもいいうんこちんちん
232デフォルトの名無しさん
2021/07/11(日) 16:25:58.47ID:SRU4khSo 仕様や実装のマイナーな機能を使って人を驚かせるのがハッカーだ、と思ってるのでは
Cのポインタ祭りとかLISPのマクロ生成マクロとかを好むのだ、と
Cのポインタ祭りとかLISPのマクロ生成マクロとかを好むのだ、と
233デフォルトの名無しさん
2021/07/11(日) 16:31:55.44ID:rINaUnOH クソどうでもいい
234デフォルトの名無しさん
2021/07/11(日) 16:37:35.60ID:8jG+0fGV ハッカーの定義はどうでも良いからせめてrustの何がダメかを語れよ
235デフォルトの名無しさん
2021/07/11(日) 16:47:25.03ID:0Hcxwo3i rustは文字列の扱いに難があるなあ
sjisのコンテンツとかマルチバイトのファイル名(WinだとUTF16?)の扱い方がよくわからん
sjisのコンテンツとかマルチバイトのファイル名(WinだとUTF16?)の扱い方がよくわからん
236デフォルトの名無しさん
2021/07/11(日) 16:48:48.06ID:lbKLD5N+ Non-Lexical Lifetimes が制御フローレベルなので実装をデバッグできるやつがほとんどいない。
c++と同じレベルの複雑さを有するようになってきている。
cargoのビルドシステムがあまりに強制的すぎる。
メモリを直接いじる必要のある効率的なアルゴリズムでは結局unsafeになる。
メモリ最適化の許す範囲があまりに非自明でcから呼ぶのは不安定すぎる。
c++と同じレベルの複雑さを有するようになってきている。
cargoのビルドシステムがあまりに強制的すぎる。
メモリを直接いじる必要のある効率的なアルゴリズムでは結局unsafeになる。
メモリ最適化の許す範囲があまりに非自明でcから呼ぶのは不安定すぎる。
237デフォルトの名無しさん
2021/07/11(日) 17:06:54.98ID:vvFM5IKu コンテナ類が実際にどのように格納されているかが分からないと言うのは、
それをunsafeで扱うのが難しくなってる。
どこでコピーが生じて、どこがmoveなのかも分かりにくいことがあるし。
それをunsafeで扱うのが難しくなってる。
どこでコピーが生じて、どこがmoveなのかも分かりにくいことがあるし。
238デフォルトの名無しさん
2021/07/11(日) 17:08:44.89ID:vvFM5IKu ライフタイムもちゃんと仕様が書いてないから、手探り状態で試さないといけないし
プログラムするのに時間が掛かる。
色々やっても結局、C/C++のような効率のよい方法を取ることは不可能な場合もあるし。
プログラムするのに時間が掛かる。
色々やっても結局、C/C++のような効率のよい方法を取ることは不可能な場合もあるし。
239デフォルトの名無しさん
2021/07/11(日) 17:30:39.23ID:QonYN50D 素晴らしい言語ですね
カニかわいい
カニかわいい
240デフォルトの名無しさん
2021/07/11(日) 18:42:50.97ID:0Hcxwo3i ときどき、Javaの検査例外みたいなやらかし感を感じる
厳密にしすぎると却って使いづらいみたいな
厳密にしすぎると却って使いづらいみたいな
241デフォルトの名無しさん
2021/07/11(日) 19:53:14.68ID:8jG+0fGV Box<dyn Error>やanyhowやeyreを使えば良いのでは
242デフォルトの名無しさん
2021/07/11(日) 21:00:56.13ID:lZiRxAj0 >>235
Windows 系以外のすべての言語は、UTF-8
だから、MSYS/MinGW でも、UTF-8以外でバグるので、
UTF-8以外を使っちゃいけない!
唯一バグらないのは、WSL。
Windows Terminal, VSCode のRemote WSL などで、
ls /mnt/c/Users/Owner/Documents/
と入力すると、日本語のフォルダ名も、正しく表示される
出力
あ
い
たぶん、Windowsが変換しているのだろう
Windows 系以外のすべての言語は、UTF-8
だから、MSYS/MinGW でも、UTF-8以外でバグるので、
UTF-8以外を使っちゃいけない!
唯一バグらないのは、WSL。
Windows Terminal, VSCode のRemote WSL などで、
ls /mnt/c/Users/Owner/Documents/
と入力すると、日本語のフォルダ名も、正しく表示される
出力
あ
い
たぶん、Windowsが変換しているのだろう
243242
2021/07/11(日) 21:05:19.71ID:lZiRxAj0 WSL は一種のチート
ハイパーバイザーでLinux を起動して、
Linux側から、Windows側のドライブを見た時に、
UTF-8 以外の言語をUTF-8に変換する
まあ、漏れの推測だけど
ハイパーバイザーでLinux を起動して、
Linux側から、Windows側のドライブを見た時に、
UTF-8 以外の言語をUTF-8に変換する
まあ、漏れの推測だけど
244デフォルトの名無しさん
2021/07/11(日) 21:46:26.10ID:0Hcxwo3i245242
2021/07/11(日) 22:51:28.82ID:lZiRxAj0 だから、プログラマーの基本は、Windows 系など、UTF-8 以外を使わない事!
この大原則を守っていない人は、システムを作れない
システムには、ascii しか使えない!
これが大原則
この大原則を守っていない人は、システムを作れない
システムには、ascii しか使えない!
これが大原則
246デフォルトの名無しさん
2021/07/11(日) 22:51:54.52ID:3favf/XH >>244
WinならOsStringのエンコーディングは普通にUTF-16だから何の問題もないと思うが
sjis扱いたいならencoding-rsとか
結局何に困ってるのかわからないと何とも言いようがない
WinならOsStringのエンコーディングは普通にUTF-16だから何の問題もないと思うが
sjis扱いたいならencoding-rsとか
結局何に困ってるのかわからないと何とも言いようがない
247デフォルトの名無しさん
2021/07/11(日) 22:52:47.14ID:g6LNT/Hh Ruby外耳に構うなよ
248デフォルトの名無しさん
2021/07/12(月) 00:42:25.80ID:Hp3EIfPo じつはわしはRustはやったことなかったのだが、
これまでの経験上おそらく >>236 みたいな感じだろうなと想像してたら
ほんとうにそのとおりでワロタw
アホみたいに「安全ドグマ」に縛られるとたいがいそうなる
これまでの経験上おそらく >>236 みたいな感じだろうなと想像してたら
ほんとうにそのとおりでワロタw
アホみたいに「安全ドグマ」に縛られるとたいがいそうなる
249デフォルトの名無しさん
2021/07/12(月) 01:08:52.63ID:hS+nIw/n250デフォルトの名無しさん
2021/07/12(月) 01:27:11.82ID:j3ZM+094 論理的な問題点以前に、言語として見た目的な美しさも無いし、記述が
簡潔でもなければ直感的でもなく、無駄に長くなる。
簡潔でもなければ直感的でもなく、無駄に長くなる。
251242
2021/07/12(月) 01:50:03.57ID:7a0iIKMk システムには、ascii しか使わないのは、Linux の基本
AWS でも、そう。
半角空白もバグるから、使わない
必ず、客から注意される。
日本語のファイル名・半角空白を使わないでと。
バグるから
例えば、5ch は、sjis だからバグだらけ。
; を書いていないのに、文字列の後ろに、; が付いてるとか
sjisとか、Windows以外では、どうしようもない
AWS でも、そう。
半角空白もバグるから、使わない
必ず、客から注意される。
日本語のファイル名・半角空白を使わないでと。
バグるから
例えば、5ch は、sjis だからバグだらけ。
; を書いていないのに、文字列の後ろに、; が付いてるとか
sjisとか、Windows以外では、どうしようもない
252デフォルトの名無しさん
2021/07/12(月) 02:01:17.96ID:uNcygyrG encoding-rsつかいにくい
253デフォルトの名無しさん
2021/07/12(月) 02:17:50.78ID:MXdX1Uu3254デフォルトの名無しさん
2021/07/12(月) 02:37:38.72ID:hS+nIw/n255デフォルトの名無しさん
2021/07/12(月) 03:41:51.48ID:3p3WQ9hU UTF-8(とchar用のUTF-32)以外滅んでほしいが、過去の遺産がそれに対応してないという現実的な問題...
まぁencoding_rsってクレート使って変換してやればヨシ
まぁencoding_rsってクレート使って変換してやればヨシ
256242
2021/07/12(月) 04:00:29.19ID:7a0iIKMk >>242
に書いたみたいに、
sjis, UTF-16 などのWindows 用言語で、
唯一バグらないのは、WSL だけ
WSL でLinux側から、Windows側のドライブを見た時だけ、
日本語のファイル名を正常に変換できる
Windows Terminal, VSCode のRemote WSL などで使える
ひょっとして、Windows用言語を扱っていて、WSLを使っていないの?
に書いたみたいに、
sjis, UTF-16 などのWindows 用言語で、
唯一バグらないのは、WSL だけ
WSL でLinux側から、Windows側のドライブを見た時だけ、
日本語のファイル名を正常に変換できる
Windows Terminal, VSCode のRemote WSL などで使える
ひょっとして、Windows用言語を扱っていて、WSLを使っていないの?
257デフォルトの名無しさん
2021/07/12(月) 09:20:21.53ID:fBGbiQ8q258デフォルトの名無しさん
2021/07/12(月) 09:26:54.48ID:fBGbiQ8q あ、あとascii/WSLおじさんは気にしなくていいと思うよ
少なくともRustにそんな制限はない
Cとかだとasciiに限定したい気持ちもわからなくはないけど
少なくともRustにそんな制限はない
Cとかだとasciiに限定したい気持ちもわからなくはないけど
259デフォルトの名無しさん
2021/07/12(月) 09:39:13.23ID:cIYVT4Ba ・ファイルシステム上のエンコーディング
・OSのAPIのエンコーディング
・言語のAPIのエンコーディング
・言語の文字列のエンコーディング
それぞれ独立だし変換しあってることをおじさんは理解していないと見える
・OSのAPIのエンコーディング
・言語のAPIのエンコーディング
・言語の文字列のエンコーディング
それぞれ独立だし変換しあってることをおじさんは理解していないと見える
260デフォルトの名無しさん
2021/07/12(月) 09:40:16.32ID:cIYVT4Ba 最後2つは基本的に同じだけど
261デフォルトの名無しさん
2021/07/12(月) 09:56:37.25ID:Jwa42/D9 >>255
でもUTF8は「ひらがな」ですら3バイトになるので困る。
でもUTF8は「ひらがな」ですら3バイトになるので困る。
262デフォルトの名無しさん
2021/07/12(月) 11:12:15.24ID:k3eDnaJZ >>256
へー WSL って言語だったんだωωω
へー WSL って言語だったんだωωω
263デフォルトの名無しさん
2021/07/12(月) 11:13:38.78ID:k3eDnaJZ >>260
違うよ
違うよ
264デフォルトの名無しさん
2021/07/12(月) 11:24:40.84ID:hS+nIw/n265デフォルトの名無しさん
2021/07/12(月) 12:42:05.71ID:4jaglyfV >>261
最近だと何に困った?
最近だと何に困った?
266デフォルトの名無しさん
2021/07/12(月) 12:58:50.09ID:Yne+2tk7 >>249
sjisを変換せずそのまま内部表現として標準的に扱うプログラミング言語って具体的に何?
もちろん全ての言語でバイト配列としては扱えるけどsjisにとってそれは無意味であり
先頭から全読みしないとsjisの1バイト目か2バイト目かすらわからない欠陥sjis仕様のためsjisそのまま使うことはないよね
仮に入力も出力もsjisなら内部表現もsjisのままにしてsjis処理関数いっぱい
書くのも見合うケースがあるかもしれないけど
入出力の片方がsjisでないならば他との変換必ず必要だから内部表現をsjisにこだわる意味はないよね
一方で内部表現として処理を無条件に簡単にしようとするとUTF32で1文字32bitにするしかないけど常にUTF32強制ではメモリが無駄すぎる
そこでメモリ上だけでなくファイルもネット通信も無駄を避けるためにUTF8を用いる
という当たり前の帰結になりRustもそうだけどこれの何が不満なの?
sjisを変換せずそのまま内部表現として標準的に扱うプログラミング言語って具体的に何?
もちろん全ての言語でバイト配列としては扱えるけどsjisにとってそれは無意味であり
先頭から全読みしないとsjisの1バイト目か2バイト目かすらわからない欠陥sjis仕様のためsjisそのまま使うことはないよね
仮に入力も出力もsjisなら内部表現もsjisのままにしてsjis処理関数いっぱい
書くのも見合うケースがあるかもしれないけど
入出力の片方がsjisでないならば他との変換必ず必要だから内部表現をsjisにこだわる意味はないよね
一方で内部表現として処理を無条件に簡単にしようとするとUTF32で1文字32bitにするしかないけど常にUTF32強制ではメモリが無駄すぎる
そこでメモリ上だけでなくファイルもネット通信も無駄を避けるためにUTF8を用いる
という当たり前の帰結になりRustもそうだけどこれの何が不満なの?
267デフォルトの名無しさん
2021/07/12(月) 13:37:26.66ID:hS+nIw/n268デフォルトの名無しさん
2021/07/12(月) 13:41:52.17ID:Yne+2tk7269デフォルトの名無しさん
2021/07/12(月) 13:45:10.21ID:XKWfaP9x >>264
fgetsで良いって言うなら単にVec<u8>で読むだけだと思うけど
エラー処理が面倒というならとりあえずunwrapしてればいいし
そういうので文字数がかさむのが嫌だというなら、Rustは合ってないんじゃないかな
Rustは基本的にソースコード上にいろいろ明記したい言語なので
fgetsで良いって言うなら単にVec<u8>で読むだけだと思うけど
エラー処理が面倒というならとりあえずunwrapしてればいいし
そういうので文字数がかさむのが嫌だというなら、Rustは合ってないんじゃないかな
Rustは基本的にソースコード上にいろいろ明記したい言語なので
270デフォルトの名無しさん
2021/07/12(月) 14:07:37.33ID:hS+nIw/n >>269
それって行の切り出し(改行までのsplit)って自分で書かなきゃだめ?
それって行の切り出し(改行までのsplit)って自分で書かなきゃだめ?
271デフォルトの名無しさん
2021/07/12(月) 14:14:18.06ID:XKWfaP9x >>270
それは書かないといけないね
たぶんRustが好きな人は「fgetsだと何が改行コードとして想定されてるのか分からなくて不安」
って人が多いんじゃないかな
実際Linux環境でCR改行のファイルをfgetsするとどうなるのかよく分からんし
そういうふうに処理系がうまくやってくれることを期待するならGoとかもほうが合っているかも
それは書かないといけないね
たぶんRustが好きな人は「fgetsだと何が改行コードとして想定されてるのか分からなくて不安」
って人が多いんじゃないかな
実際Linux環境でCR改行のファイルをfgetsするとどうなるのかよく分からんし
そういうふうに処理系がうまくやってくれることを期待するならGoとかもほうが合っているかも
272デフォルトの名無しさん
2021/07/12(月) 14:16:40.71ID:4WArcuIG splitすればいいだけじゃなくて?
273デフォルトの名無しさん
2021/07/12(月) 14:18:27.57ID:hS+nIw/n うーん、Windowsでsjisファイル読み込むのってそんなにニッチなのか……
>>271
>たぶんRustが好きな人は「fgetsだと何が改行コードとして想定されてるのか分からなくて不安」
>って人が多いんじゃないかな
BufReaderがあるので、それはないかと
>>271
>たぶんRustが好きな人は「fgetsだと何が改行コードとして想定されてるのか分からなくて不安」
>って人が多いんじゃないかな
BufReaderがあるので、それはないかと
274デフォルトの名無しさん
2021/07/12(月) 14:29:03.08ID:XKWfaP9x275デフォルトの名無しさん
2021/07/12(月) 14:30:57.94ID:7o0jLcLl これはRustの問題ではない
例えばスクリプト言語であるJavaScriptでもsjisファイルを読み込むにはNodeでも標準サポートはない
だから生バッファに読み込んで次にそのsjisを内部へ変換するという手順となる
いずれにせよ文字コード変換の一行が余分に入るだけでありどの言語でも大した問題ではない
例えばスクリプト言語であるJavaScriptでもsjisファイルを読み込むにはNodeでも標準サポートはない
だから生バッファに読み込んで次にそのsjisを内部へ変換するという手順となる
いずれにせよ文字コード変換の一行が余分に入るだけでありどの言語でも大した問題ではない
276デフォルトの名無しさん
2021/07/12(月) 14:31:19.34ID:hS+nIw/n >>272
うん、それはそうなんだ>splitすればいい
でも、なんでこんなにしつこく聞いたかっていうと
最近の言語にこんな基本的な機能ないわけないだろ?と思ったからなんだ
確かに自分で書いたって大した処理じゃない
でも、一人ひとりがそんな原始的なコード書いてるの?
ありえない 標準で用意しとけやって
うん、それはそうなんだ>splitすればいい
でも、なんでこんなにしつこく聞いたかっていうと
最近の言語にこんな基本的な機能ないわけないだろ?と思ったからなんだ
確かに自分で書いたって大した処理じゃない
でも、一人ひとりがそんな原始的なコード書いてるの?
ありえない 標準で用意しとけやって
277デフォルトの名無しさん
2021/07/12(月) 14:35:03.79ID:hS+nIw/n278デフォルトの名無しさん
2021/07/12(月) 14:40:47.93ID:XKWfaP9x279デフォルトの名無しさん
2021/07/12(月) 14:48:08.10ID:hS+nIw/n280デフォルトの名無しさん
2021/07/12(月) 14:48:41.98ID:hUBiSSyU 要はバイナリのsplitがあればいいんだろ
まあニッチだし標準には入りにくいだろうな
まあニッチだし標準には入りにくいだろうな
281デフォルトの名無しさん
2021/07/12(月) 14:56:20.42ID:OFdOdpfq282デフォルトの名無しさん
2021/07/12(月) 15:01:47.66ID:hS+nIw/n >>281
それはもうutf8の問題じゃないんじゃないか?
それはもうutf8の問題じゃないんじゃないか?
283デフォルトの名無しさん
2021/07/12(月) 15:08:46.48ID:wU8EXWL2 >>281
今さら何を言ってるんだ?
UTF-8が長いとか短いとか論争してたのは20世紀の過去の話であり今は2021年だ
UTF-9のエイプリルフールRFCが出たのですら16年前の2005年だ
既に20世紀に今後は世界中全てUTF-8で行くと方向が決まった
今さら何を言ってるんだ?
UTF-8が長いとか短いとか論争してたのは20世紀の過去の話であり今は2021年だ
UTF-9のエイプリルフールRFCが出たのですら16年前の2005年だ
既に20世紀に今後は世界中全てUTF-8で行くと方向が決まった
284デフォルトの名無しさん
2021/07/12(月) 15:25:03.01ID:OFdOdpfq 日本語処理が僅かに遅くなる。
285デフォルトの名無しさん
2021/07/12(月) 16:15:05.27ID:rb4auT/4 >>242
No.
Linux やら BSD やらでファイル名を UTF-8 と保証しているものはたぶん少数派だ。
ロケール設定で UTF-8 を選ぶのが多数派になっているのは疑いがないが、
システムとして保証しない分だけ Windows よりつらい。
No.
Linux やら BSD やらでファイル名を UTF-8 と保証しているものはたぶん少数派だ。
ロケール設定で UTF-8 を選ぶのが多数派になっているのは疑いがないが、
システムとして保証しない分だけ Windows よりつらい。
286デフォルトの名無しさん
2021/07/12(月) 16:35:47.66ID:OFdOdpfq287デフォルトの名無しさん
2021/07/12(月) 16:36:54.04ID:OFdOdpfq 最近でもJSは日本語の文字イベントがサポートされてない。
アメリカ中心。
アメリカ中心。
288デフォルトの名無しさん
2021/07/12(月) 17:25:47.35ID:+TTC9E1P UTF-8の規格制定の時にはアジア圏も割と口出しだんではなかった?
289デフォルトの名無しさん
2021/07/12(月) 17:31:04.46ID:XXt8kyyQ 余り上手く行ってなかったと聞いている。
290デフォルトの名無しさん
2021/07/12(月) 17:47:35.65ID:msgpc4nf291デフォルトの名無しさん
2021/07/12(月) 19:18:49.33ID:Yne+2tk7 sjisのfgets()相当の件だけど
標準のBufReaderのlines()で回すのは何が不満なんだっけ?
use std::error::Error;
use std::fs::File;
use std::io::{BufReader, BufRead};
use encoding_rs::SHIFT_JIS;
use encoding_rs_io::DecodeReaderBytesBuilder;
fn main() -> Result<(), Box<dyn Error>> {
let file = File::open("sjis.txt")?;
let reader = BufReader::new(DecodeReaderBytesBuilder::new().encoding(Some(SHIFT_JIS)).build(file));
for line in reader.lines() {
println!("utf8: {}", line?);
}
return Ok(());
}
標準のBufReaderのlines()で回すのは何が不満なんだっけ?
use std::error::Error;
use std::fs::File;
use std::io::{BufReader, BufRead};
use encoding_rs::SHIFT_JIS;
use encoding_rs_io::DecodeReaderBytesBuilder;
fn main() -> Result<(), Box<dyn Error>> {
let file = File::open("sjis.txt")?;
let reader = BufReader::new(DecodeReaderBytesBuilder::new().encoding(Some(SHIFT_JIS)).build(file));
for line in reader.lines() {
println!("utf8: {}", line?);
}
return Ok(());
}
292デフォルトの名無しさん
2021/07/12(月) 19:44:27.20ID:XXt8kyyQ >>290
nativeのWin32やMFCだと、IMEで日本語入力した時、WM_CHARで
SJISやUnicodeの文字コードを取得できるが、ブラウザ上のJSだと、
英字の範囲でしかそれに該当するイベント、つまり、IMEで
漢字やひらがなを打った結果を取得する文字イベントが無い。
nativeのWin32やMFCだと、IMEで日本語入力した時、WM_CHARで
SJISやUnicodeの文字コードを取得できるが、ブラウザ上のJSだと、
英字の範囲でしかそれに該当するイベント、つまり、IMEで
漢字やひらがなを打った結果を取得する文字イベントが無い。
293デフォルトの名無しさん
2021/07/12(月) 19:46:32.99ID:NCQjfvng294デフォルトの名無しさん
2021/07/12(月) 20:38:52.08ID:hS+nIw/n295デフォルトの名無しさん
2021/07/12(月) 22:26:31.98ID:+ke1h7j2 encoding_rsが標準になって欲しい(stdに入って欲しい?)のはなぜ?
296デフォルトの名無しさん
2021/07/12(月) 22:49:13.65ID:hS+nIw/n297デフォルトの名無しさん
2021/07/13(火) 00:30:07.97ID:n/daahFD >>296
stdに取り込む提案のRFC書いてみたら?
stdに取り込む提案のRFC書いてみたら?
298デフォルトの名無しさん
2021/07/13(火) 03:10:04.82ID:EtxXgsUj >>293
中身を理解して無いくせに黙ってろ。
中身を理解して無いくせに黙ってろ。
299デフォルトの名無しさん
2021/07/13(火) 03:20:46.36ID:qEHxTKb1 www
300デフォルトの名無しさん
2021/07/13(火) 06:39:54.56ID:cTgR7KKr UTF8(とASCII)以外の文字コードを扱うのが基本機能とは思えんが
301デフォルトの名無しさん
2021/07/13(火) 07:23:42.37ID:b6J4OLfP >>296
> 基本機能だから
UTF-8さえ標準で扱えれば問題ない、UTF-8は世界標準だから
よって基本機能ではない
なので標準化する必要もないし、cargo.tomlに依存ライブラリを書くのが面倒ならapt-getでライブラリをインストールして使うC言語でも使えばいい
> 基本機能だから
UTF-8さえ標準で扱えれば問題ない、UTF-8は世界標準だから
よって基本機能ではない
なので標準化する必要もないし、cargo.tomlに依存ライブラリを書くのが面倒ならapt-getでライブラリをインストールして使うC言語でも使えばいい
302デフォルトの名無しさん
2021/07/13(火) 08:54:58.88ID:NU/mwW4g303デフォルトの名無しさん
2021/07/13(火) 09:10:42.11ID:lb+vVVj1 今は多少議論の余地があっても、数年したら
「なんでstdにSJIS扱うライブラリ入ってるの? めったに使わないのにバカじゃねーの」
って言われるのが目に見えてる
「なんでstdにSJIS扱うライブラリ入ってるの? めったに使わないのにバカじゃねーの」
って言われるのが目に見えてる
304デフォルトの名無しさん
2021/07/13(火) 09:14:58.89ID:n/daahFD エンコーディング関連のコードは量が多いだろうから
あらゆるプログラムのコンパイル時間を増やしたりバイナリサイズを大きくしたりするだけの価値があるかという議論にはなりそう
あらゆるプログラムのコンパイル時間を増やしたりバイナリサイズを大きくしたりするだけの価値があるかという議論にはなりそう
305デフォルトの名無しさん
2021/07/13(火) 09:17:07.48ID:NU/mwW4g encoding_rsはSJISのためのライブラリじゃないでしょ
306デフォルトの名無しさん
2021/07/13(火) 09:36:27.67ID:/A7/SyKa Cとかだと依存ライブラリの導入が面倒すぎるから標準化してほしいというのもわかるが
Cargo.tomlに一行書くのが面倒と言われてもあまり共感は得られないんじゃないかな
Cargo.tomlに一行書くのが面倒と言われてもあまり共感は得られないんじゃないかな
307デフォルトの名無しさん
2021/07/13(火) 11:03:30.55ID:pwZ9R0Fi >>291
変換したくないって話じゃなかったの?
変換したくないって話じゃなかったの?
308242
2021/07/13(火) 11:43:58.46ID:dtNqNBdW309デフォルトの名無しさん
2021/07/13(火) 11:50:05.93ID:WUJYnH4r SJIS 死ね
\ 死ね
\ 死ね
310デフォルトの名無しさん
2021/07/13(火) 11:52:00.92ID:WUJYnH4r >>308
うby厨 死ね
うby厨 死ね
311デフォルトの名無しさん
2021/07/13(火) 12:40:03.07ID:pH6df75p >>302 UTF-8を使えというより、今の標準はUTF-8だから標準化する必要がないということを言いたかった
そんなものを標準化したところで使うのは英語圏以外だけだし、その英語圏以外でも滅多に使うことはないから必要に応じてcargo.tomlに書き加える今の方式で良い
そんなものを標準化したところで使うのは英語圏以外だけだし、その英語圏以外でも滅多に使うことはないから必要に応じてcargo.tomlに書き加える今の方式で良い
312デフォルトの名無しさん
2021/07/13(火) 13:23:53.20ID:EtxXgsUj >>311
多数決で言えば漢字文化圏の方が人口が多い。
しかも母国語が漢字を使う。英語を母国語とする人口は三億人くらい。
漢字を母国語で使うのは15億人くらい。
漢字以外の多バイト文字を使う国まで入れたら70億人、つまり地球の95%異常
となる。英語の方が少数派。
多数決で言えば漢字文化圏の方が人口が多い。
しかも母国語が漢字を使う。英語を母国語とする人口は三億人くらい。
漢字を母国語で使うのは15億人くらい。
漢字以外の多バイト文字を使う国まで入れたら70億人、つまり地球の95%異常
となる。英語の方が少数派。
313デフォルトの名無しさん
2021/07/13(火) 13:23:53.20ID:EtxXgsUj >>311
多数決で言えば漢字文化圏の方が人口が多い。
しかも母国語が漢字を使う。英語を母国語とする人口は三億人くらい。
漢字を母国語で使うのは15億人くらい。
漢字以外の多バイト文字を使う国まで入れたら70億人、つまり地球の95%異常
となる。英語の方が少数派。
多数決で言えば漢字文化圏の方が人口が多い。
しかも母国語が漢字を使う。英語を母国語とする人口は三億人くらい。
漢字を母国語で使うのは15億人くらい。
漢字以外の多バイト文字を使う国まで入れたら70億人、つまり地球の95%異常
となる。英語の方が少数派。
314デフォルトの名無しさん
2021/07/13(火) 13:40:25.49ID:NU/mwW4g 漢字とかもあるけど、例えばMIME64のデコードとか
エンコード・デコード処理の標準化と考えれば英語圏でもありかも
エンコード・デコード処理の標準化と考えれば英語圏でもありかも
315242
2021/07/13(火) 13:42:56.59ID:dtNqNBdW 日本語をユーザー名・ファイル名など、システムに使うのは、Windows の香具師だけ
Linux を使うプロは絶対に、ascii しか使わない。
せいぜい、ハイフン・アンダーバーぐらい
もし、半角空白でも使えば、あちこちから怒りの声が届く。
システムがバグるから使うな!
Linux を使うプロは絶対に、ascii しか使わない。
せいぜい、ハイフン・アンダーバーぐらい
もし、半角空白でも使えば、あちこちから怒りの声が届く。
システムがバグるから使うな!
316デフォルトの名無しさん
2021/07/13(火) 13:46:44.21ID:NU/mwW4g >>315
ここにいる人間はそんなことわかってるから、まあ落ち着け
ここにいる人間はそんなことわかってるから、まあ落ち着け
317242
2021/07/13(火) 13:46:50.24ID:dtNqNBdW Linux のテレビの録画システムで、
日本語のテレビ番組名を、そのままファイル名にしていた香具師がいたけど、
バグって使えない
日本語のテレビ番組名を、そのままファイル名にしていた香具師がいたけど、
バグって使えない
318デフォルトの名無しさん
2021/07/13(火) 13:48:05.76ID:qZprVsAK なんか変なのが居着いたな
319デフォルトの名無しさん
2021/07/13(火) 14:21:53.19ID:Ooc6RI1Q Rubyボットの活動範囲がさらに広がってきたな
よほど暇なんだろう
よほど暇なんだろう
320デフォルトの名無しさん
2021/07/13(火) 15:12:06.73ID:QsXB5/qu 今日はRust in Actionが45%off
321デフォルトの名無しさん
2021/07/13(火) 15:55:17.99ID:oaeUW36h323デフォルトの名無しさん
2021/07/13(火) 16:16:17.73ID:QSkHhbzy Windows ではプログラムをインストールするフォルダが Program Files となっているのは
パスが空白を含むくらいでおかしくなるようなカスなソフトを早めに発見するためなんよな。
パスが空白も漢字も含みうる仕様なのに対応してないソフトがあるならそのソフトがカスなだけじゃん。
今の時点で現実にそういうソフトがあるから仕方ないという論法だと
SJIS のデータがあるから仕方ないというのと言ってることは同じなわけで、
データが大事かソフトが大事かという点で軸が違うに過ぎない。
パスが空白を含むくらいでおかしくなるようなカスなソフトを早めに発見するためなんよな。
パスが空白も漢字も含みうる仕様なのに対応してないソフトがあるならそのソフトがカスなだけじゃん。
今の時点で現実にそういうソフトがあるから仕方ないという論法だと
SJIS のデータがあるから仕方ないというのと言ってることは同じなわけで、
データが大事かソフトが大事かという点で軸が違うに過ぎない。
324デフォルトの名無しさん
2021/07/13(火) 19:45:00.15ID:SMX4Ldwl cmd「せやな」
325デフォルトの名無しさん
2021/07/14(水) 11:14:54.14ID:eOdFkTAr Windows 11は64-bitのみになるみたいだけど
Rustじゃ i686-pc-windows-gnu, i686-pc-windows-msvc はいつまでTier 1なんだろう?
Rustじゃ i686-pc-windows-gnu, i686-pc-windows-msvc はいつまでTier 1なんだろう?
326デフォルトの名無しさん
2021/07/14(水) 11:43:09.28ID:eD4Wlw/y >>325
32bit macがtier3落ちしたときはxcodeでコンパイルもできないし実行環境もないからって理由だったはず
同様にmsvcはMSがサポート切ってくればなくなるかもね
32bitアプリ自体が動かなくなるわけじゃなさそうだしgnuは大丈夫なんじゃないかな
32bit macがtier3落ちしたときはxcodeでコンパイルもできないし実行環境もないからって理由だったはず
同様にmsvcはMSがサポート切ってくればなくなるかもね
32bitアプリ自体が動かなくなるわけじゃなさそうだしgnuは大丈夫なんじゃないかな
327デフォルトの名無しさん
2021/07/14(水) 13:27:24.91ID:BkkfMVAi Win11はOSが32bitCPUでは動かないってだけで32ビットアプリはまだ動くのでは
328デフォルトの名無しさん
2021/07/14(水) 13:35:34.15ID:FWHo5b9L それであってる
329デフォルトの名無しさん
2021/07/14(水) 16:08:27.83ID:bE2/aeQE Win11は、16bitが公式では完全に動かなくなる
330デフォルトの名無しさん
2021/07/16(金) 07:53:03.75ID:xJNtEE5m >>329
マジ!? ちょっと困るなぁ
マジ!? ちょっと困るなぁ
331ハノン ◆QZaw55cn4c
2021/07/17(土) 20:18:11.59ID:Blzyac97332デフォルトの名無しさん
2021/07/17(土) 22:06:07.73ID:u8FQMqKe Win11は u16, i16 が使えなくなるのか
ま、使ったことないけど
ま、使ったことないけど
333デフォルトの名無しさん
2021/07/17(土) 23:18:45.26ID:H+CbDngl どうしてそうなる
334デフォルトの名無しさん
2021/07/18(日) 01:10:05.65ID:uA1uG+Zo 冗談と気付くまで時間かかっちゃったぞ
335デフォルトの名無しさん
2021/07/19(月) 17:48:08.64ID:Ex9Tt6CE Rustの文法を教えて欲しいんだけどさあ
https://github.com/seanmonstar/reqwest
ここのExampleの中にある
>.json::<HashMap<String, String>>()
の行って、渡されたデータをHashMapに変換してるようだけど・・・・()があるから関数を呼び出しているんだろうけど、なのに関数名が無いってどういう文法なの?
https://github.com/seanmonstar/reqwest
ここのExampleの中にある
>.json::<HashMap<String, String>>()
の行って、渡されたデータをHashMapに変換してるようだけど・・・・()があるから関数を呼び出しているんだろうけど、なのに関数名が無いってどういう文法なの?
336デフォルトの名無しさん
2021/07/19(月) 18:18:59.22ID:N5AD9uIb >>335
関数名はjsonで::の後はjsonの型パラメーター
関数名はjsonで::の後はjsonの型パラメーター
337デフォルトの名無しさん
2021/07/19(月) 18:58:43.60ID:R+McuOkS >>335
turbofishで検索してみると幸せになれるかもよ
turbofishで検索してみると幸せになれるかもよ
338デフォルトの名無しさん
2021/07/20(火) 08:52:59.51ID:m4QWlK0Z そういうことだったのか
チュートリアルやったつもりが全然身についてなくて、まるで初見の文法に見えたよ
ありがとう!
チュートリアルやったつもりが全然身についてなくて、まるで初見の文法に見えたよ
ありがとう!
339デフォルトの名無しさん
2021/07/20(火) 11:37:04.97ID:bZGFynsp async/awaitよく理解できないので質問です。
async fnを.awaitすることは、
thread::spawn(fn)で得られたJoinHandleをjoinすることと何が異なるのでしょうか
async fnを.awaitすることは、
thread::spawn(fn)で得られたJoinHandleをjoinすることと何が異なるのでしょうか
340デフォルトの名無しさん
2021/07/20(火) 13:18:42.59ID:ZLL16lvF341デフォルトの名無しさん
2021/07/20(火) 13:51:30.35ID:x1qprig3 日本語でOK
342デフォルトの名無しさん
2021/07/20(火) 14:46:16.61ID:0ur63h8Z343デフォルトの名無しさん
2021/07/20(火) 17:53:25.45ID:poqzYj22 >>339
どのプログラミング言語でも同じ概念の話として
非同期プログラミングとスレッドプログラミングの違いをまず学ぶと良いでしょう
非同期プログラミングはスレッド使わないシングルスレッドでも成立するしよく使われます
スレッドは無駄にリソースを喰って重いのでスレッドを使わないシングルスレッドでプログラミング出来る事ならばそれが最も軽くて速いです
まずはシングルスレッドでの非同期プログラミングを経験しておきましょう
もちろん最初はasync/awaitを使わずに非同期プログラミングを体験したほうが良いでしょう
そうすることで初めてasync/awaitの意義と利便性を理解することができます
以上が通常のasync/awaitの初心者がたどるべき入門コースです
どのプログラミング言語でも同じ概念の話として
非同期プログラミングとスレッドプログラミングの違いをまず学ぶと良いでしょう
非同期プログラミングはスレッド使わないシングルスレッドでも成立するしよく使われます
スレッドは無駄にリソースを喰って重いのでスレッドを使わないシングルスレッドでプログラミング出来る事ならばそれが最も軽くて速いです
まずはシングルスレッドでの非同期プログラミングを経験しておきましょう
もちろん最初はasync/awaitを使わずに非同期プログラミングを体験したほうが良いでしょう
そうすることで初めてasync/awaitの意義と利便性を理解することができます
以上が通常のasync/awaitの初心者がたどるべき入門コースです
344デフォルトの名無しさん
2021/07/21(水) 18:10:51.09ID:xEcHVrDP 初級プログラマーは非同期プログラミングをしたことない人もいるけど
中級プログラマーになるには必須の技術だからね
中級プログラマーになるには必須の技術だからね
345デフォルトの名無しさん
2021/07/21(水) 20:22:35.81ID:zFAfbWuD 初級なら知らなくても仕方ない、中級なら必須という区分けはなんか違和感あるかな。対象の業務次第で知っとけよって範囲は違うからなぁ。
346デフォルトの名無しさん
2021/07/22(木) 00:13:25.98ID:nOo3Pk8s その辺は分野にもよるでしょ
組み込みと可だと初級でもマルチスレッドシラネはかなり問題だぞ
組み込みと可だと初級でもマルチスレッドシラネはかなり問題だぞ
347デフォルトの名無しさん
2021/07/22(木) 00:59:16.39ID:GmU5m4WV 昔ながらの言語だとスレッドはできてもコルーチンはできなかったりするので分野次第かな
348デフォルトの名無しさん
2021/07/22(木) 03:11:24.17ID:lswwPTyi349デフォルトの名無しさん
2021/07/22(木) 10:08:08.42ID:I7nexIle プリエンプティブじゃないマルチタスクωですねわかります
350デフォルトの名無しさん
2021/07/22(木) 11:38:36.18ID:K4TSDl0a await後にどのスレッドが戻ってくるかは運なの?
351デフォルトの名無しさん
2021/07/22(木) 13:02:57.44ID:DiCBumX8 >>350
ランタイムの実装次第
ランタイムの実装次第
352デフォルトの名無しさん
2021/07/22(木) 16:56:26.36ID:PJWgwtfy >>350
async/awaitとスレッドは直接は関係がない
async/awaitの対象はタスク
例えば1つのスレッドに10000のタスクを動作可能
8つのスレッドそれぞれでそれを行なえば計80000のタスクになるけども
スレッド1つにタスク1つしか使わなければ8つのスレッドで計8つのタスクになるといった具合い
これらはランタイムによってサポートが様々
したがって正確な質問は「await後にどのタスクが戻ってくるかは運なの?」となるけど
これはランタイムのスケジューリング次第
ランタイムはRustの言語仕様範囲外なので自分で決めた方針でスケジューリングするランタイムを作ることが可能
つまり運ではなく自分の思い通りに実行させることも可能
async/awaitとスレッドは直接は関係がない
async/awaitの対象はタスク
例えば1つのスレッドに10000のタスクを動作可能
8つのスレッドそれぞれでそれを行なえば計80000のタスクになるけども
スレッド1つにタスク1つしか使わなければ8つのスレッドで計8つのタスクになるといった具合い
これらはランタイムによってサポートが様々
したがって正確な質問は「await後にどのタスクが戻ってくるかは運なの?」となるけど
これはランタイムのスケジューリング次第
ランタイムはRustの言語仕様範囲外なので自分で決めた方針でスケジューリングするランタイムを作ることが可能
つまり運ではなく自分の思い通りに実行させることも可能
353デフォルトの名無しさん
2021/07/22(木) 17:10:57.69ID:KJg/dUdU JSのasync awaitってややこしい
goroutineのほうが簡単
goroutineのほうが簡単
354デフォルトの名無しさん
2021/07/22(木) 20:26:18.99ID:7YxYJ8AQ promise使うのに比べてそこまで楽か?って言われるとそうでもないわな
355ハノン ◆QZaw55cn4c
2021/07/22(木) 20:40:46.75ID:BtepJ1kx356デフォルトの名無しさん
2021/07/22(木) 23:09:12.36ID:9gEORT6M JSのawait/asyncとかめちゃくちゃ簡単やろ
シングルスレッドなのと背後にイベントループが存在することを抑えておけば余裕よ
すまんスレチだな
シングルスレッドなのと背後にイベントループが存在することを抑えておけば余裕よ
すまんスレチだな
357デフォルトの名無しさん
2021/07/23(金) 00:43:44.14ID:n7dIeb/9 >>355
ここはRustのスレ。
スレッドとはstd::threadであり、いわゆるOSスレッド。
つまり1つのOSプロセスの中で、1つまたは複数のOSスレッドが動く。
一方で、async/.awaitが対象としているのは、スレッドよりさらに小さいタスク。
つまり1つのOSスレッドの上で、1つまたは複数のタスクが動く。
例えばシングルスレッドマルチタスクランタイムでは、1つのOSスレッドの上で無数のタスクを動かすことができる。
async/.awaitはこの非同期に実行されるタスクを扱う。
ここはRustのスレ。
スレッドとはstd::threadであり、いわゆるOSスレッド。
つまり1つのOSプロセスの中で、1つまたは複数のOSスレッドが動く。
一方で、async/.awaitが対象としているのは、スレッドよりさらに小さいタスク。
つまり1つのOSスレッドの上で、1つまたは複数のタスクが動く。
例えばシングルスレッドマルチタスクランタイムでは、1つのOSスレッドの上で無数のタスクを動かすことができる。
async/.awaitはこの非同期に実行されるタスクを扱う。
358デフォルトの名無しさん
2021/07/23(金) 02:10:09.02ID:j3QjPF86 asyncは途中I/Oウェイトで待たされるような処理じゃないと意味がない
359デフォルトの名無しさん
2021/07/23(金) 10:52:29.51ID:QeE9wwG7 スレッド、プロセス、タスクなどの定義は分野やプラットフォーム等によって異なる
360デフォルトの名無しさん
2021/07/23(金) 12:55:46.87ID:luTvzo3i VSCode+Rust Analyzerの環境で、ミュータブル変数にアンダーラインが付されるのをやめたいのですがどうすればよいですか?
361デフォルトの名無しさん
2021/07/23(金) 13:55:17.59ID:Y7b/5yJk awaitの前後でスレッドは変わる可能性があるものの、タスクは変わらないんだと思ってたわ
362デフォルトの名無しさん
2021/07/23(金) 13:58:58.67ID:c2hWXBFi >>357の言う「タスク」って1つのasync関数のように読めるんだが、そういう理解で合ってるのか?
363デフォルトの名無しさん
2021/07/23(金) 14:46:14.22ID:eQcO0XNp364デフォルトの名無しさん
2021/07/23(金) 15:12:50.36ID:c2hWXBFi だとすると「スレッドよりさらに小さい」ってのは変だな。大きい小さいあるいは包含関係が決められるものじゃない。
365デフォルトの名無しさん
2021/07/23(金) 15:14:21.60ID:6EkuYiQH そもそも直交する概念だし用途によって使い分けるものでもあるし
366デフォルトの名無しさん
2021/07/23(金) 16:49:32.73ID:+8+VImv7 スレッドより軽量という意味での小さいなら分かる
367デフォルトの名無しさん
2021/07/23(金) 19:17:06.47ID:Nx0yKcVz Elixirのプロセスは、軽量プロセスと言われていて、
OSのプロセスやスレッドではなく、Greenスレッドです
カーネルではなく、VMでスケジューリングされるので軽量、
コンテキストスイッチが発生しない
1軽量プロセスで約300ワードです
OSのプロセスやスレッドではなく、Greenスレッドです
カーネルではなく、VMでスケジューリングされるので軽量、
コンテキストスイッチが発生しない
1軽量プロセスで約300ワードです
368デフォルトの名無しさん
2021/07/23(金) 19:46:36.80ID:j3QjPF86 ここはRustスレ
369デフォルトの名無しさん
2021/07/23(金) 21:20:19.48ID:O9MjyOb4 いつものRubyキチガイだろう
何言っても無駄だからスルーするしかない
何言っても無駄だからスルーするしかない
370デフォルトの名無しさん
2021/07/23(金) 21:25:52.66ID:c2hWXBFi >>366
スレッドで動くんだから「スレッドより軽量」ってことはない。
スレッドで動くんだから「スレッドより軽量」ってことはない。
371デフォルトの名無しさん
2021/07/23(金) 21:50:34.41ID:TZPR0HeA >>367
軽量プロセスでもコンテキストスイッチは発生するよ
軽量プロセスでもコンテキストスイッチは発生するよ
372デフォルトの名無しさん
2021/07/23(金) 22:59:27.49ID:eQcO0XNp >>370
タスクと同じことをスレッドでやろうとした場合の比較ね
タスクと同じ数のスレッドを作った場合スタックだけで結構な量のメモリが必要になったりする
あとコンテキストスイッチのコストは少なく済んだりするんじゃないかな
タスクと同じことをスレッドでやろうとした場合の比較ね
タスクと同じ数のスレッドを作った場合スタックだけで結構な量のメモリが必要になったりする
あとコンテキストスイッチのコストは少なく済んだりするんじゃないかな
373デフォルトの名無しさん
2021/07/23(金) 23:08:30.77ID:c2hWXBFi374デフォルトの名無しさん
2021/07/24(土) 00:30:53.20ID:LBBZ+Kmj 心臓のスイッチ切って死なねえかなこいつら
375デフォルトの名無しさん
2021/07/24(土) 01:45:40.45ID:5ex845z5376デフォルトの名無しさん
2021/07/24(土) 02:52:34.75ID:F/fcX2Mm タスクって名前が良くないな
一般的にはタスクってプロセスのことじゃない?
一般的にはタスクってプロセスのことじゃない?
377デフォルトの名無しさん
2021/07/24(土) 02:57:53.91ID:UokC4u3Y んなことないでしょ???
378デフォルトの名無しさん
2021/07/24(土) 04:00:31.27ID:NjCPGO8Q タスクってのは内部実装的には非同期I/Oを使ったシングルスレッドでしょ。
379デフォルトの名無しさん
2021/07/24(土) 07:37:56.03ID:vPIKycwR380デフォルトの名無しさん
2021/07/24(土) 09:29:01.55ID:qEX1axDl Rustのasyncについて知りたければ「async-book」は必読なので
次からテンプレに入れよう
https://rust-lang.github.io/async-book/
>>980
よろしこ
次からテンプレに入れよう
https://rust-lang.github.io/async-book/
>>980
よろしこ
381デフォルトの名無しさん
2021/07/24(土) 10:59:35.94ID:/TMjuFD+ >>379
1スレッドで同時に実行されるタスクが1つというのは正しい
従来のスレッドでの並列化(1スレッド1タスク)の場合、IO処理を呼び出すと処理完了するまでの間はスレッドはsleep状態になってしまっていた
sleepしている間に他のタスクを実行させるためには、実行するタスクと同じ数だけのスレッドを生成する必要があるが
スレッド生成で消費するリソースが多いため数万タスクを同時に捌くことは難しかった
async-awaitではIO処理完了までの間スレッドをsleep状態にするのではなく別のタスクを実行する
これによりスレッドあたりの処理可能タスク数が増えるため、アプリケーション全体で同時に捌けるタスク数も増える
従来の手法でもスレッドをsleepさせないようなプログラミングは可能だけどプログラムの構造を大きく書き換えないといけなかった
普通のスレッド並列のプログラムと同じ書き味でより多くのタスクを捌けるプログラムが書けるというのがasync-awaitの一番のメリット
ただし常にasync-awaitが望ましいわけでもない
async-awaitで効率的に実行できるのはIO待ちが発生するタスクの場合で、CPUをぶんまわす処理には向いていない
適材適所で従来のスレッドによる並列化手法と組み合わせて使うことになる
1スレッドで同時に実行されるタスクが1つというのは正しい
従来のスレッドでの並列化(1スレッド1タスク)の場合、IO処理を呼び出すと処理完了するまでの間はスレッドはsleep状態になってしまっていた
sleepしている間に他のタスクを実行させるためには、実行するタスクと同じ数だけのスレッドを生成する必要があるが
スレッド生成で消費するリソースが多いため数万タスクを同時に捌くことは難しかった
async-awaitではIO処理完了までの間スレッドをsleep状態にするのではなく別のタスクを実行する
これによりスレッドあたりの処理可能タスク数が増えるため、アプリケーション全体で同時に捌けるタスク数も増える
従来の手法でもスレッドをsleepさせないようなプログラミングは可能だけどプログラムの構造を大きく書き換えないといけなかった
普通のスレッド並列のプログラムと同じ書き味でより多くのタスクを捌けるプログラムが書けるというのがasync-awaitの一番のメリット
ただし常にasync-awaitが望ましいわけでもない
async-awaitで効率的に実行できるのはIO待ちが発生するタスクの場合で、CPUをぶんまわす処理には向いていない
適材適所で従来のスレッドによる並列化手法と組み合わせて使うことになる
382デフォルトの名無しさん
2021/07/24(土) 11:28:00.32ID:0bHT8/gy >>379
いいえ
1つのスレッド上で同時に複数のタスクを並行(concurrent)に実行できるのがasync/awaitのタスクです。
C10Kと言われるように1つのスレッド上で10000のタスクでも並行に実行できます。
ちなみに1つのスレッド上で並列(parallel)に実行されるのは1つのタスクのみなのは当たり前なので、わざわざ言うことはないです。
今回はasync/awaitの話なので、
『1つのスレッド上で同時に複数のタスクを並行(concurrent)に実行できる』が正解です。
いいえ
1つのスレッド上で同時に複数のタスクを並行(concurrent)に実行できるのがasync/awaitのタスクです。
C10Kと言われるように1つのスレッド上で10000のタスクでも並行に実行できます。
ちなみに1つのスレッド上で並列(parallel)に実行されるのは1つのタスクのみなのは当たり前なので、わざわざ言うことはないです。
今回はasync/awaitの話なので、
『1つのスレッド上で同時に複数のタスクを並行(concurrent)に実行できる』が正解です。
383デフォルトの名無しさん
2021/07/24(土) 11:33:29.24ID:vPIKycwR >>381
その1スレッドが時分割で複数タスクを実行できるということのちょうど裏返しで、1タスクは複数スレッドから実行され得る。
つまりそこに大小関係、包含関係などは無い直交した概念。
軽量云々てのはOSスレッドとグリーンスレッドの話とごっちゃになってんじゃないかねぇ。
その1スレッドが時分割で複数タスクを実行できるということのちょうど裏返しで、1タスクは複数スレッドから実行され得る。
つまりそこに大小関係、包含関係などは無い直交した概念。
軽量云々てのはOSスレッドとグリーンスレッドの話とごっちゃになってんじゃないかねぇ。
384デフォルトの名無しさん
2021/07/24(土) 12:05:51.45ID:F/fcX2Mm385デフォルトの名無しさん
2021/07/24(土) 12:13:15.89ID:XrocH4ML ねえこの引っ込みがつかなくなったゴミクズ共のメンチの切り合いっていつまで続くの?
386デフォルトの名無しさん
2021/07/24(土) 12:14:13.90ID:XrocH4ML 包丁刺し合って死んで終わらないからネットのマウント取り合いって性質が悪いんだよね
387デフォルトの名無しさん
2021/07/24(土) 12:17:43.31ID:sVj/Jq99 5chに何も期待してるのか
388デフォルトの名無しさん
2021/07/24(土) 12:21:52.26ID:K4Uz+tqB389デフォルトの名無しさん
2021/07/24(土) 12:40:53.43ID:F/fcX2Mm390デフォルトの名無しさん
2021/07/24(土) 12:41:30.17ID:F/fcX2Mm 間違った
並行じゃないってことね
並行じゃないってことね
391デフォルトの名無しさん
2021/07/24(土) 12:42:53.22ID:F/fcX2Mm で、実際のところランタイムってlongjmpみたいなことしてるの?
392デフォルトの名無しさん
2021/07/24(土) 12:49:05.14ID:yYYDVwTY393367
2021/07/24(土) 12:51:25.18ID:zz8rVX09 Elixir, Go の軽量プロセスと同じでしょ?
OS は関係ない。
言語(VM)内で切り替えているだけだから
OS は関係ない。
言語(VM)内で切り替えているだけだから
394デフォルトの名無しさん
2021/07/24(土) 13:02:35.92ID:yYYDVwTY タスクの厳密な定義が気になるのってFutureを必要とする動機が無いんじゃないかね
別に新しいことができるわけじゃないし、必要無ければ知らなくていいよ
別に新しいことができるわけじゃないし、必要無ければ知らなくていいよ
395デフォルトの名無しさん
2021/07/24(土) 13:54:25.17ID:lC8WbEdp C10k問題がまずあって、それをselect/epollで解決するってシナリオをまず理解しておかないと
何でめんどくさい事わざわざやってんの?としかならんでしょ
モチベーションが大事
何でめんどくさい事わざわざやってんの?としかならんでしょ
モチベーションが大事
396sage
2021/07/24(土) 14:51:29.52ID:HHfUZBfC まともにテストしてねーじゃん
https://lkml.org/lkml/2021/7/7/422
https://lkml.org/lkml/2021/7/7/422
397デフォルトの名無しさん
2021/07/25(日) 01:04:24.12ID:2QCCz/RS オライリーのrustの本ってどう?
これから勉強するんだけど、これ使っても時代に遅れない?
これから勉強するんだけど、これ使っても時代に遅れない?
398デフォルトの名無しさん
2021/07/25(日) 02:38:56.34ID:kViuqetF 4年前の本だからおすすめはしないな
399デフォルトの名無しさん
2021/07/25(日) 02:43:00.77ID:xzEFH2+d >>383
マルチスレッドなランタイムを使えばスレッドとタスクはm:nだけど
シングルスレッドなランタイムを使えばスレッドとタスクは1:n
いずれの場合でもタスクはスレッドより軽量な存在であり直交する概念ではない
マルチスレッドなランタイムを使えばスレッドとタスクはm:nだけど
シングルスレッドなランタイムを使えばスレッドとタスクは1:n
いずれの場合でもタスクはスレッドより軽量な存在であり直交する概念ではない
400デフォルトの名無しさん
2021/07/25(日) 09:01:27.23ID:gzVcIMN0 >>397
原著の第2版がオススメ
といってもasyncの章が追加されたのを除くとコアなところは第1版と同じ
今のところオライリー本が圧倒的に良いので他の本で学ぶくらいなら第1版の訳書のほうがいい
古くなってるところはEdition Guideやasync-book、Rust Blogで補完
原著の第2版がオススメ
といってもasyncの章が追加されたのを除くとコアなところは第1版と同じ
今のところオライリー本が圧倒的に良いので他の本で学ぶくらいなら第1版の訳書のほうがいい
古くなってるところはEdition Guideやasync-book、Rust Blogで補完
401デフォルトの名無しさん
2021/07/25(日) 09:12:18.43ID:vKIU/TO0 俺もそう思う。古かろうがオライリー本が圧倒的に良い。
402デフォルトの名無しさん
2021/07/25(日) 09:59:11.23ID:jOyNlFI3403デフォルトの名無しさん
2021/07/25(日) 11:34:17.97ID:CXQT/x9B Rust はサンプルコードを見ながら真似ていれば雰囲気で書けるようになる……
なんていう言語ではないので基礎的な理屈を体系的に (それでいてわかりやすく)
説明してくれるオライリー本はとても良いよ。
確かに理屈っぽいが、 Rust がそういう言語なのでオライリーの本がつらいと思う人は
そもそも Rust がつらいタイプの人なんだと思う。
なんていう言語ではないので基礎的な理屈を体系的に (それでいてわかりやすく)
説明してくれるオライリー本はとても良いよ。
確かに理屈っぽいが、 Rust がそういう言語なのでオライリーの本がつらいと思う人は
そもそも Rust がつらいタイプの人なんだと思う。
404デフォルトの名無しさん
2021/07/25(日) 19:04:19.16ID:HNTE1GP9 Rustlingsのこれやっててよくわかんなかったんだけどさあ
https://github.com/rust-lang/rustlings/blob/main/exercises/if/if1.rs
自分の解答は
pub fn bigger(a: i32, b: i32) -> i32 {
if a > b{
return a;
}
b
}
これなんだけど、「return a;」のところってなんで「a」だけじゃダメなの?
https://github.com/rust-lang/rustlings/blob/main/exercises/if/if1.rs
自分の解答は
pub fn bigger(a: i32, b: i32) -> i32 {
if a > b{
return a;
}
b
}
これなんだけど、「return a;」のところってなんで「a」だけじゃダメなの?
405デフォルトの名無しさん
2021/07/25(日) 19:46:35.31ID:gzVcIMN0 elseがあればいいんじゃない?
406デフォルトの名無しさん
2021/07/25(日) 19:49:48.51ID:Wj/gwJho >>404
関数の最後じゃにゃいから
関数の最後じゃにゃいから
407デフォルトの名無しさん
2021/07/25(日) 21:25:46.69ID:2QCCz/RS オライリー買ってくる
408デフォルトの名無しさん
2021/07/25(日) 21:31:05.59ID:HNTE1GP9 ありがとう
最後の式だ特別なのか
最後の式だ特別なのか
409デフォルトの名無しさん
2021/07/26(月) 20:33:20.42ID:FeBtPwa3 文と式を区別しましょう
410デフォルトの名無しさん
2021/07/26(月) 21:31:17.41ID:H6CQkre6 ブロック式が値を持つなら式文も値を持たせればよかったと思うんだけど、それだと何か都合が悪いのかな。
411デフォルトの名無しさん
2021/07/26(月) 21:53:51.50ID:6YP5cq8/ それは式文を構成する式と何が違うのか
412デフォルトの名無しさん
2021/07/26(月) 22:05:31.99ID:H6CQkre6 最後だけセミコロンを外すとかしなくて済む。
413デフォルトの名無しさん
2021/07/26(月) 22:09:46.01ID:x+l/EPbt セミコロンあるなしで意味が変わるのって、バグを産む原因になりそう
414デフォルトの名無しさん
2021/07/26(月) 22:26:28.18ID:6YP5cq8/ その流れ前スレでも見た気がする
415デフォルトの名無しさん
2021/07/27(火) 00:03:59.51ID:rFi02BpK どちらかというと;の有無で()を返すかどうか制御できる方がいい気がするけどな
式文も値を持つならわざわざ();って書かないといけない
(まぁわざわざ書かせるのもRustらしい気もするが)
>>413
間違えたら型エラーになるからバグにはならんと思うよ
式文も値を持つならわざわざ();って書かないといけない
(まぁわざわざ書かせるのもRustらしい気もするが)
>>413
間違えたら型エラーになるからバグにはならんと思うよ
416デフォルトの名無しさん
2021/07/27(火) 03:17:46.37ID:MlLztw4F () を返す場合は関数省略だからreturn必須でよかったな
417デフォルトの名無しさん
2021/07/27(火) 05:41:20.63ID:QHeETuJ4 if-elseとかmatchとかでひたすら();書くのさすがにやばくない?
418デフォルトの名無しさん
2021/07/27(火) 08:21:13.66ID:fovpYeUo どうしても () を返さなきゃならない場面ってそんなに多いんだっけ?
419デフォルトの名無しさん
2021/07/27(火) 08:35:39.46ID:XvzwJYSJ コード例がないから全然わからん
420デフォルトの名無しさん
2021/07/27(火) 08:54:31.16ID:D32lY0Gw Ok(())とか?
421デフォルトの名無しさん
2021/07/27(火) 09:50:38.86ID:UmdqpWnl 最初アホみたいにReturn合った方が…とか思ってたけど慣れると全く要らん境地になるから不思議
422デフォルトの名無しさん
2021/07/27(火) 10:35:08.16ID:KNfqOmw/ >>418
少なくともletは値を返すわけにはいかないので()だね
まぁCopyなら返せなくもないけど、Copyかどうかで挙動が変わるのはさすがに…
();を明示する、みたいにするとletだけ特別扱いになるし、結局今のルールでいいんじゃないかと
少なくともletは値を返すわけにはいかないので()だね
まぁCopyなら返せなくもないけど、Copyかどうかで挙動が変わるのはさすがに…
();を明示する、みたいにするとletだけ特別扱いになるし、結局今のルールでいいんじゃないかと
423デフォルトの名無しさん
2021/07/27(火) 11:00:19.20ID:+VH8W8kj elseのないif式で偽の時の値の話だと思ってた
424デフォルトの名無しさん
2021/07/27(火) 11:03:48.76ID:MlLztw4F425デフォルトの名無しさん
2021/07/27(火) 19:22:36.90ID:AoeS3kCP でも、関数の最後じゃなくてもさあ
文があったら、そこでリターンしてくれたらいいのにな
まあ、ミスってても気づき辛くなるからダメなんかな?
文があったら、そこでリターンしてくれたらいいのにな
まあ、ミスってても気づき辛くなるからダメなんかな?
426デフォルトの名無しさん
2021/07/27(火) 19:47:32.00ID:klQCV9Qk 2文目以降は一切評価されないってことか
斬新だね
斬新だね
427デフォルトの名無しさん
2021/07/27(火) 21:44:05.27ID:fovpYeUo428デフォルトの名無しさん
2021/07/27(火) 21:53:09.04ID:fgL6LRsn そもそもletは式じゃないし
429デフォルトの名無しさん
2021/07/27(火) 22:40:27.72ID:KUIeKdyD XXXがstatementだとか、XXXはexpressionだとか
そういう議論が出る時点でダメ言語のオーラが
言語オタクには楽しいかもしれないけど
そういう議論が出る時点でダメ言語のオーラが
言語オタクには楽しいかもしれないけど
430デフォルトの名無しさん
2021/07/27(火) 22:47:11.69ID:fovpYeUo だから式文じゃない文は () でいいんじゃね?特に特別扱いとは思わんが。
431デフォルトの名無しさん
2021/07/27(火) 23:18:47.62ID:rFi02BpK 文は()という単純なルールを崩してまで式文から値を得たいモチベーションがよくわからん
単に;を取って式にすればいいだけなのに
単に;を取って式にすればいいだけなのに
432デフォルトの名無しさん
2021/07/27(火) 23:20:35.98ID:3rBo4v1y Rust書いてて式と文を意識して区別しないといけないことなんて無いよ
CやPythonならあるけど
CやPythonならあるけど
433デフォルトの名無しさん
2021/07/27(火) 23:30:43.54ID:fgL6LRsn 関数末尾だけセミコロン外すのが気に入らないなら、C/C++でやってたようにreturn x;とすればいい
それで不都合を生むことはない
それで不都合を生むことはない
434デフォルトの名無しさん
2021/07/28(水) 00:01:15.04ID:SAGnL8kO clippy先生に注意される
435デフォルトの名無しさん
2021/07/28(水) 01:30:00.88ID:ch5q2ifJ 全てはclippy先生の仰せのままに
436デフォルトの名無しさん
2021/07/28(水) 01:47:51.35ID:QoybXfTv #![allow(clippy::foo)] を書けばいいじゃん
437デフォルトの名無しさん
2021/07/28(水) 04:09:34.57ID:96ImUxMy なるほど
>Rustのセミコロンは意味と構文からそれぞれ説明できる。
>意味論的には、以下の原則を覚えておけば十分である。
>
>・セミコロンで終端された文は強制的に () 型となる。
>・ブロックの途中の文は () 型でなければならない。
>・ブロックの型はブロックの最後の文の型と等しい。(文がひとつもない場合は ())
>Rustのセミコロンは意味と構文からそれぞれ説明できる。
>意味論的には、以下の原則を覚えておけば十分である。
>
>・セミコロンで終端された文は強制的に () 型となる。
>・ブロックの途中の文は () 型でなければならない。
>・ブロックの型はブロックの最後の文の型と等しい。(文がひとつもない場合は ())
438デフォルトの名無しさん
2021/07/28(水) 07:29:31.85ID:o1sqfUmC >・ブロックの途中の文は () 型でなければならない。
これがあるから1行目の仕様なんだろうけど、これの理由ってなんなのかな。
これがあるから1行目の仕様なんだろうけど、これの理由ってなんなのかな。
439デフォルトの名無しさん
2021/07/28(水) 08:03:12.35ID:LX2CDHAF 文に型なんてないよ
440デフォルトの名無しさん
2021/07/28(水) 08:14:26.64ID:9WJC0mlm 文って値を返さないのかと思ってたけれど、
()を返してるって事?
()を返してるって事?
441デフォルトの名無しさん
2021/07/28(水) 08:37:40.51ID:LX2CDHAF ブロックの型はブロックの最後の「式」の型と等しい。(「ブロックの最後に式がない」場合は())
ここの間違いが他のすべての説明によく分からない辻褄合わせを持ち込んでいるだけだと思う
ここの間違いが他のすべての説明によく分からない辻褄合わせを持ち込んでいるだけだと思う
442デフォルトの名無しさん
2021/07/28(水) 09:58:43.22ID:rdzsGCBs >>437
>・ブロックの途中の文は () 型でなければならない。
そもそもブロックの途中の文を()以外にすることってできるの?
{ foo; bar } みたいなブロックを{ foo bar }とは書けないし
>・ブロックの途中の文は () 型でなければならない。
そもそもブロックの途中の文を()以外にすることってできるの?
{ foo; bar } みたいなブロックを{ foo bar }とは書けないし
443デフォルトの名無しさん
2021/07/28(水) 10:29:08.57ID:LX2CDHAF444デフォルトの名無しさん
2021/07/28(水) 11:58:08.16ID:ch5q2ifJ Facebook、次期ビルドシステムの開発でRust言語の採用を明らかに
https://www.publickey1.jp/blog/21/facebookrust.html
https://www.publickey1.jp/blog/21/facebookrust.html
445デフォルトの名無しさん
2021/07/28(水) 11:59:44.89ID:rdzsGCBs >>443
文法の問題を解決しつつブロックの途中の文を()以外にする方法がわからんってことよ
文法の問題を解決しつつブロックの途中の文を()以外にする方法がわからんってことよ
446デフォルトの名無しさん
2021/07/28(水) 12:46:01.08ID:LX2CDHAF447デフォルトの名無しさん
2021/07/28(水) 12:58:11.75ID:LX2CDHAF 「文を()にする/()以外にする」の正確な意味を言語化してほしい
「文が評価されて結果として()/()以外が得られる」という意味で言っているのなら、文は評価されて結果を返すものではない
評価されて結果を返すものは式と呼ばれる
文は式ではない
「文が評価されて結果として()/()以外が得られる」という意味で言っているのなら、文は評価されて結果を返すものではない
評価されて結果を返すものは式と呼ばれる
文は式ではない
448デフォルトの名無しさん
2021/07/28(水) 13:10:10.87ID:rdzsGCBs449デフォルトの名無しさん
2021/07/28(水) 13:12:38.58ID:YxciSlP+ この一連の議論の評価値は ()
450デフォルトの名無しさん
2021/07/28(水) 13:27:20.45ID:LX2CDHAF451デフォルトの名無しさん
2021/07/28(水) 14:29:43.24ID:x93GMB6T >>449
コンパイルエラーだよ
コンパイルエラーだよ
452デフォルトの名無しさん
2021/07/28(水) 14:52:26.31ID:QoybXfTv セミコロン省略できる式文(?)の型が()ではない場合は型エラーになるね
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=85e09ac464b7f9fb07b6aa1e2d08e8c9
セミコロンをつけたり、型を()にしたりするとエラーにならない
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=4e4152ae35e8fd2821060f44ed9a2fda
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=86429babc54c38b515dfe1f9de85f127
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=85e09ac464b7f9fb07b6aa1e2d08e8c9
セミコロンをつけたり、型を()にしたりするとエラーにならない
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=4e4152ae35e8fd2821060f44ed9a2fda
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=86429babc54c38b515dfe1f9de85f127
453デフォルトの名無しさん
2021/07/28(水) 17:33:51.84ID:Ns6HtioT 最も単純化してこれはコンパイル通るけど
fn main() {
if true {
1
} else {
0
};
()
}
しかし上記のifの尻のセミコロン無しだとコンパイルエラー【値が()ではない】となる
セミコロン無しでも数字1と0を()へ変えればコンパイルが通る
つまり
>>437
>・ブロックの途中の文は () 型でなければならない。
ifをセミコロン無しで値が数字だと上記の条項を満たせないためエラー
ifをセミコロン無しで値が()だと上記の条項を満たせる
あるいは
>・セミコロンで終端された文は強制的に () 型となる。
値が数字でもifをセミコロン終端させれば上記の条項を満たせる
fn main() {
if true {
1
} else {
0
};
()
}
しかし上記のifの尻のセミコロン無しだとコンパイルエラー【値が()ではない】となる
セミコロン無しでも数字1と0を()へ変えればコンパイルが通る
つまり
>>437
>・ブロックの途中の文は () 型でなければならない。
ifをセミコロン無しで値が数字だと上記の条項を満たせないためエラー
ifをセミコロン無しで値が()だと上記の条項を満たせる
あるいは
>・セミコロンで終端された文は強制的に () 型となる。
値が数字でもifをセミコロン終端させれば上記の条項を満たせる
454デフォルトの名無しさん
2021/07/28(水) 17:46:15.09ID:SAGnL8kO455デフォルトの名無しさん
2021/07/28(水) 18:03:06.43ID:zh3fVAA3 >>454
そのリファレンスの説明だけだと
以下はコンパイル通るけど、関数内の3つの()のうち任意の1つでも数値に変えるとコンパイルエラーとなる説明はどの部分になる?
fn main() {
if true {
()
} else {
()
}
()
}
そのリファレンスの説明だけだと
以下はコンパイル通るけど、関数内の3つの()のうち任意の1つでも数値に変えるとコンパイルエラーとなる説明はどの部分になる?
fn main() {
if true {
()
} else {
()
}
()
}
456デフォルトの名無しさん
2021/07/28(水) 18:13:09.38ID:gOp2Ufou457デフォルトの名無しさん
2021/07/28(水) 18:38:39.95ID:SAGnL8kO >>455
Note: As a control flow expression, if a block expression is the outer expression of an expression statement, the expected type is () unless it is followed immediately by a semicolon.
https://doc.rust-lang.org/reference/expressions/block-expr.html
An expression that consists of only a block expression or control flow expression, if used in a context where a statement is permitted, can omit the trailing semicolon. This can cause an ambiguity between it being parsed as a standalone statement and as a part of another expression; in this case, it is parsed as a statement. The type of ExpressionWithBlock expressions when used as statements must be the unit type.
When the trailing semicolon is omitted, the result must be type ().
https://doc.rust-lang.org/reference/statements.html#expression-statements
あとif式はifのブロックとelseのブロックで型が揃ってないとだめだよ
Note: As a control flow expression, if a block expression is the outer expression of an expression statement, the expected type is () unless it is followed immediately by a semicolon.
https://doc.rust-lang.org/reference/expressions/block-expr.html
An expression that consists of only a block expression or control flow expression, if used in a context where a statement is permitted, can omit the trailing semicolon. This can cause an ambiguity between it being parsed as a standalone statement and as a part of another expression; in this case, it is parsed as a statement. The type of ExpressionWithBlock expressions when used as statements must be the unit type.
When the trailing semicolon is omitted, the result must be type ().
https://doc.rust-lang.org/reference/statements.html#expression-statements
あとif式はifのブロックとelseのブロックで型が揃ってないとだめだよ
458デフォルトの名無しさん
2021/07/28(水) 20:25:06.81ID:o1sqfUmC >>440
「値を返さない」と「()を返す」は同義だと思う。
「値を返さない」と「()を返す」は同義だと思う。
459デフォルトの名無しさん
2021/07/28(水) 20:32:49.95ID:lhnCplqc >>458
値を返さないことはnever typeとして別途定義されてるから()を返すこととは違うよ
値を返さないことはnever typeとして別途定義されてるから()を返すこととは違うよ
460デフォルトの名無しさん
2021/07/28(水) 21:30:00.41ID:o1sqfUmC never は値どころか制御も返さないから別物では?
()を返す(値は返さない)ことはできるけど、neverは返すことも不可能だと思う。
()を返す(値は返さない)ことはできるけど、neverは返すことも不可能だと思う。
461デフォルトの名無しさん
2021/07/28(水) 21:34:29.80ID:iYnBfOfY >>455
2つのエラー要因がある
ifは式(rustでは式文と呼ぶのか)なので、then節とelse節が同じ型でないといけない
mainはTerminationトレイトを実装していないといけないので最後の()は数値にできない
2つのエラー要因がある
ifは式(rustでは式文と呼ぶのか)なので、then節とelse節が同じ型でないといけない
mainはTerminationトレイトを実装していないといけないので最後の()は数値にできない
462デフォルトの名無しさん
2021/07/28(水) 21:51:43.19ID:iYnBfOfY >>458
値を返さない、という言葉が今この場では曖昧に見える
本当にrustが値を返すものじゃない、と定義しているのは文法レベルで定義しているのはletや関数定義などの文
これは型チェック入る前にエラーになる
文法的に正しい、けど「値を返さない型」としか呼べないような式も存在して、それはrustだとnever type (!) と呼んでいる
loop {} とかif true { return 10} else { return 0 }とか、こいつらは式だけど決して値にならない
値を返さない、という言葉が今この場では曖昧に見える
本当にrustが値を返すものじゃない、と定義しているのは文法レベルで定義しているのはletや関数定義などの文
これは型チェック入る前にエラーになる
文法的に正しい、けど「値を返さない型」としか呼べないような式も存在して、それはrustだとnever type (!) と呼んでいる
loop {} とかif true { return 10} else { return 0 }とか、こいつらは式だけど決して値にならない
463デフォルトの名無しさん
2021/07/28(水) 23:11:13.67ID:SAGnL8kO464デフォルトの名無しさん
2021/07/28(水) 23:15:38.71ID:fFOGvJ3Q >>461
じゃあどうしてこれがコンパイルエラーとなるの?
fn main() {
if true {
1
} else {
0
}
()
}
じゃあどうしてこれがコンパイルエラーとなるの?
fn main() {
if true {
1
} else {
0
}
()
}
465デフォルトの名無しさん
2021/07/28(水) 23:25:02.98ID:SAGnL8kO The syntax for a block is {, then any inner attributes, then any number of statements, then an optional expression, called the final operand, and finally a }.
The type of a block is the type of the final operand, or () if the final operand is omitted.
https://doc.rust-lang.org/reference/expressions/block-expr.html
let foo = { fn_call(); }; // final operandがないのでブロックの型は()
let bar = { fn_call() }; // final operandがあるのブロックの型はfn_call()の型
式文が()を返すわけじゃない
The type of a block is the type of the final operand, or () if the final operand is omitted.
https://doc.rust-lang.org/reference/expressions/block-expr.html
let foo = { fn_call(); }; // final operandがないのでブロックの型は()
let bar = { fn_call() }; // final operandがあるのブロックの型はfn_call()の型
式文が()を返すわけじゃない
466デフォルトの名無しさん
2021/07/28(水) 23:28:39.35ID:SAGnL8kO >>464
fn main() {
if true { 1 } else { 0 } // <- 式。文法的にfinal operand以外は文じゃないとダメ。if式の型が()の場合のみセミコロンを省略可。
() // <- final operand
}
fn main() {
if true { 1 } else { 0 } // <- 式。文法的にfinal operand以外は文じゃないとダメ。if式の型が()の場合のみセミコロンを省略可。
() // <- final operand
}
467デフォルトの名無しさん
2021/07/28(水) 23:34:19.58ID:2+fvqic5 >>466
なぜ『if式の型が()の場合のみセミコロンを省略可。』という謎ルールがあるの??
なぜ『if式の型が()の場合のみセミコロンを省略可。』という謎ルールがあるの??
468デフォルトの名無しさん
2021/07/29(木) 00:18:18.96ID:J3IrN4Ey >>467
使い勝手がいいから
fn main() {
if true { 1 } else { 0 }
()
}
↑この`if true { 1 } else { 0 }`に意味ないでしょ?
意味持たせるには`let foo = if true { 1 } else { 0 };`みたいに評価結果の値を何かしら使う形にする必要がある
意味がないけどセミコロンで式文にして「値を無視します」と表明すればエラーにはしない
表明がなければ「お前意味ないことやってるぞ」とエラーにしてくれる
`if condition { println!(“1”) } else { println!(“0”) }`みたいに()に評価されるif式は
副作用を起こしたいケースなので評価結果の値を何かしら使う形じゃなくても意味がある
この使い方の時にセミコロンを必須にすると他言語習得者にとってはめちゃくちゃ使い勝手が悪い
知ってれば役に立つことはあっても普段コードを書く時に意識する必要のないルール
使い勝手がいいから
fn main() {
if true { 1 } else { 0 }
()
}
↑この`if true { 1 } else { 0 }`に意味ないでしょ?
意味持たせるには`let foo = if true { 1 } else { 0 };`みたいに評価結果の値を何かしら使う形にする必要がある
意味がないけどセミコロンで式文にして「値を無視します」と表明すればエラーにはしない
表明がなければ「お前意味ないことやってるぞ」とエラーにしてくれる
`if condition { println!(“1”) } else { println!(“0”) }`みたいに()に評価されるif式は
副作用を起こしたいケースなので評価結果の値を何かしら使う形じゃなくても意味がある
この使い方の時にセミコロンを必須にすると他言語習得者にとってはめちゃくちゃ使い勝手が悪い
知ってれば役に立つことはあっても普段コードを書く時に意識する必要のないルール
469デフォルトの名無しさん
2021/07/29(木) 00:18:47.37ID:+vgAr19b >>467 他の言語での一般的な書き方も出来るようにだと思う
470デフォルトの名無しさん
2021/07/29(木) 00:23:32.99ID:vLI97hvR471デフォルトの名無しさん
2021/07/29(木) 00:27:10.13ID:J3IrN4Ey472デフォルトの名無しさん
2021/07/29(木) 08:55:08.12ID:KzEq3JVg >>470
構文解析フェーズで型を意識してるの?
構文解析フェーズで型を意識してるの?
473デフォルトの名無しさん
2021/07/29(木) 22:05:11.47ID:0uhLIXqL >>470
こういうことかな
if true { () } else { () } - 2 【値-2】
if true { 1 } else { 0 } - 2 【エラー】
if true { 1 } else { 0 }; - 2 【値-2】
(if true { 1 } else { 0 }) - 2 【値-1】
こういうことかな
if true { () } else { () } - 2 【値-2】
if true { 1 } else { 0 } - 2 【エラー】
if true { 1 } else { 0 }; - 2 【値-2】
(if true { 1 } else { 0 }) - 2 【値-1】
474デフォルトの名無しさん
2021/07/30(金) 02:02:42.06ID:VAfd9CHU rust version 1.54.0 リリース
475デフォルトの名無しさん
2021/07/30(金) 11:59:34.52ID:3yGih40v https://twitter.com/mattn_jp/status/1420772207186255880
https://twitter.com/5chan_nel (5ch newer account)
https://twitter.com/5chan_nel (5ch newer account)
476デフォルトの名無しさん
2021/07/30(金) 13:41:26.16ID:bSJbrTlR Cは、明確にポインタをつかって書くことで手作業で最適化できるが、
Rustのsafeモードは、見た目は参照もポインタも使わず実体コピーのような
書き方をする。例えば、
let a = Box::new(オブジェクト名:{・・・});
や、
let b = Box::new(オブジェクトを返す関数(・・・));
のように。
これはちゃんとコピーが生じないように最適化されているのだろうか?
C++は、同様の書き方をする場合は、無駄をなくすために例えば、
vector::emplace_back()
なるものがあり、最適化に任さずに明確にコピーを省略するマクロの様な
働きをするらしい。
Rustのsafeモードは、見た目は参照もポインタも使わず実体コピーのような
書き方をする。例えば、
let a = Box::new(オブジェクト名:{・・・});
や、
let b = Box::new(オブジェクトを返す関数(・・・));
のように。
これはちゃんとコピーが生じないように最適化されているのだろうか?
C++は、同様の書き方をする場合は、無駄をなくすために例えば、
vector::emplace_back()
なるものがあり、最適化に任さずに明確にコピーを省略するマクロの様な
働きをするらしい。
477デフォルトの名無しさん
2021/07/30(金) 14:17:32.88ID:bSJbrTlR >>476
あと、C++の場合、
CPerson person = CPerson(・・・);
と書いた場合は、代入にならずに必ず、
CPerson person(・・・);
と書いた場合と全く同様にコンストラクタが呼び出されることが決まっている。
Rustの場合、そういうことが全くドキュメント化されてない。
C++プログラマはそのことを理解しているから高速なコードが書けるが、
Rustは書いてないのでテキトーに書くしかない。
結果、あまり速くないコードになって、しかもどこが原因かも分からなく
なりそう。
あと、C++の場合、
CPerson person = CPerson(・・・);
と書いた場合は、代入にならずに必ず、
CPerson person(・・・);
と書いた場合と全く同様にコンストラクタが呼び出されることが決まっている。
Rustの場合、そういうことが全くドキュメント化されてない。
C++プログラマはそのことを理解しているから高速なコードが書けるが、
Rustは書いてないのでテキトーに書くしかない。
結果、あまり速くないコードになって、しかもどこが原因かも分からなく
なりそう。
478はちみつ餃子 ◆8X2XSCHEME
2021/07/30(金) 14:26:14.81ID:qMgk6unv479デフォルトの名無しさん
2021/07/30(金) 14:26:20.43ID:uBYlPp6h それよりdropがいつ走るかわからない方が怖いわ
480デフォルトの名無しさん
2021/07/30(金) 15:17:37.81ID:bSJbrTlR Rustでは、CPersonのメンバ関数 new()の中で Heapにオブジェクトを作る時、
fn new(yyy) {
return Box::new( CPerson {
age: xxxx,
name: xxxx
} );
}
みたいに書くしかないらしい。しかし、C++だと、コンストラクタの中で、
GetSystemModuleName(&name, zzz);
のような書き方も出来る。
何が言いたいかと言えば、Rustだと代入形式でしか書けないので柔軟性に
欠けるということ。
fn new(yyy) {
return Box::new( CPerson {
age: xxxx,
name: xxxx
} );
}
みたいに書くしかないらしい。しかし、C++だと、コンストラクタの中で、
GetSystemModuleName(&name, zzz);
のような書き方も出来る。
何が言いたいかと言えば、Rustだと代入形式でしか書けないので柔軟性に
欠けるということ。
481デフォルトの名無しさん
2021/07/30(金) 15:19:00.34ID:bSJbrTlR >>478
リンク先間違ってない?
リンク先間違ってない?
482デフォルトの名無しさん
2021/07/30(金) 15:31:40.72ID:87Gl51wF bindings_after_at stableになったのうれしい
483デフォルトの名無しさん
2021/07/30(金) 16:14:14.47ID:ghy/bFcm >>480
メモリ安全性を保つのが困難になっていくからそれを避ける方法がベストだよ
メモリ安全性を保つのが困難になっていくからそれを避ける方法がベストだよ
484デフォルトの名無しさん
2021/07/30(金) 16:42:36.73ID:bSJbrTlR >>483
なんともなあ。
なんともなあ。
485デフォルトの名無しさん
2021/07/30(金) 16:53:36.97ID:SwFfvD28 せっかくだしこっち使ってくれよ
https://mevius.5ch.net/test/read.cgi/tech/1619219089/
https://mevius.5ch.net/test/read.cgi/tech/1619219089/
486デフォルトの名無しさん
2021/07/30(金) 16:58:32.68ID:9xDw6FKV487デフォルトの名無しさん
2021/07/30(金) 17:02:02.06ID:lHY+syIy >>480
具体的にこのように書きたいけどエラーになるというRustのコードを示してください。(他の言語のコードは不要)
それによりようやく初めて、何を問題としているのか、何が問題なのか、がはっきりします。
具体的にこのように書きたいけどエラーになるというRustのコードを示してください。(他の言語のコードは不要)
それによりようやく初めて、何を問題としているのか、何が問題なのか、がはっきりします。
488デフォルトの名無しさん
2021/07/30(金) 17:29:20.46ID:nNXXdoxJ VeqDequeに二分探索実装されてるけどそもそもソートできなくない???
489デフォルトの名無しさん
2021/07/30(金) 18:21:23.96ID:N3W+nBLQ >>488
make_contiguousかas_mut_slicesで中身の可変スライスを受け取って
そのスライスのsortかsort_byを使えばソートできそう(試してない)
make_contiguousが本線っぽいからリファレンス読んでくれ
make_contiguousかas_mut_slicesで中身の可変スライスを受け取って
そのスライスのsortかsort_byを使えばソートできそう(試してない)
make_contiguousが本線っぽいからリファレンス読んでくれ
490デフォルトの名無しさん
2021/07/30(金) 18:33:31.64ID:nNXXdoxJ make_contiguousするならそのあとのas_mut_slicesに対して二分探索でよくない????
491デフォルトの名無しさん
2021/07/30(金) 19:00:01.19ID:N3W+nBLQ その辺はもう「お好きにどうぞ」としか言えない
492デフォルトの名無しさん
2021/07/30(金) 20:35:47.56ID:Lxzkaxvv contiguousじゃないがsortされてることが保証されてるケースで使いたいのかね
493デフォルトの名無しさん
2021/07/30(金) 21:37:49.30ID:7fXRNBDL sort順を壊さない位置に要素を挿入するのにbinary_searchを使う
494デフォルトの名無しさん
2021/07/30(金) 21:46:04.82ID:Lxzkaxvv495デフォルトの名無しさん
2021/07/30(金) 23:01:01.92ID:YV3ifLwI >>486
オブジェクトを返す関数を Box::new()のパラメータの位置に書いてもそうなるの?
オブジェクトを返す関数を Box::new()のパラメータの位置に書いてもそうなるの?
496デフォルトの名無しさん
2021/07/30(金) 23:11:44.30ID:ZatLdYYe >>477
explicitでなければな
explicitでなければな
497デフォルトの名無しさん
2021/07/31(土) 16:04:12.94ID:4L+o4Dn8 配列の添え字はusize以外も許容してほしいなー
498デフォルトの名無しさん
2021/07/31(土) 16:11:02.83ID:zwQwPVDS std::ops::Index を実装すればええんちゃう?
499デフォルトの名無しさん
2021/07/31(土) 16:31:36.36ID:4L+o4Dn8 >>498
おお、こんなのあるのか。知らなかった。
おお、こんなのあるのか。知らなかった。
500デフォルトの名無しさん
2021/08/02(月) 06:51:52.57ID:rcivjOzc Tokio @tokio_rs
Announcing Axum - An ergonomic and modular web framework that takes full advantage of the Tokio, Hyper, and Tower ecosystem.
https://tokio.rs/blog/2021-07-announcing-axum
Announcing Axum - An ergonomic and modular web framework that takes full advantage of the Tokio, Hyper, and Tower ecosystem.
https://tokio.rs/blog/2021-07-announcing-axum
501デフォルトの名無しさん
2021/08/02(月) 10:51:16.95ID:/2ZmNaA8 Rocketが統一するんじゃなかったんかい
502デフォルトの名無しさん
2021/08/02(月) 11:07:27.91ID:IM57Srba axumはシンプルかつ洗練されており柔軟性もあって、よりRustっぽい
それでいてtokio直轄だから今後の主流になりそう
それでいてtokio直轄だから今後の主流になりそう
503デフォルトの名無しさん
2021/08/02(月) 11:09:36.24ID:gKjubcDS actix-webと比較するとどう?
504デフォルトの名無しさん
2021/08/02(月) 11:22:47.21ID:LBPYCkqw asyncも結局Tokioが覇権になるんかな?
505デフォルトの名無しさん
2021/08/02(月) 11:40:06.27ID:txHGxpYt 高収入エンジニアは「ラスト」に注目、ファインディ調査:日本経済新聞
https://www.nikkei.com/article/DGXZQOUC312180R30C21A7000000/
https://www.nikkei.com/article/DGXZQOUC312180R30C21A7000000/
506デフォルトの名無しさん
2021/08/02(月) 11:52:00.11ID:XqEhhKmo tokio、名前がダサすぎて無理w
async-std勢にもっと頑張ってほしい
async-std勢にもっと頑張ってほしい
507デフォルトの名無しさん
2021/08/02(月) 13:37:03.39ID:b7V5cI6n どうしても沢田研二を思い出すからな
508デフォルトの名無しさん
2021/08/02(月) 13:48:07.46ID:cEvsPyTU 客の入りが悪くてダサいヤツ
509デフォルトの名無しさん
2021/08/02(月) 14:35:12.33ID:txHGxpYt Tokioの名前の由来って普通に東京の可能性があるのか
>I enjoyed visiting Tokio (Tokyo) the city and I liked the "io" suffix and how it plays w/ Mio as well. I don't know... naming is hard so I didn't spend too much time thinking about it.
https://www.reddit.com/r/rust/comments/d3ld9z/how_tokio_crate_got_its_name_like_that/
>I enjoyed visiting Tokio (Tokyo) the city and I liked the "io" suffix and how it plays w/ Mio as well. I don't know... naming is hard so I didn't spend too much time thinking about it.
https://www.reddit.com/r/rust/comments/d3ld9z/how_tokio_crate_got_its_name_like_that/
510デフォルトの名無しさん
2021/08/02(月) 18:57:04.81ID:+XZCqP9q axumのimpl IntoResponseとかはaxcixより命名規則とかディレクトリ構造とかよかったけどappの組み立て方が微妙だなー
n-texとかがかなりいいよね
n-texとかがかなりいいよね
511デフォルトの名無しさん
2021/08/02(月) 21:06:18.53ID:K5Gz/oHK tokioは問題のある挙動が発覚しそうで嫌
512デフォルトの名無しさん
2021/08/02(月) 23:22:29.33ID:5JIyBWeF async-stdなら発覚しない?
513デフォルトの名無しさん
2021/08/03(火) 05:46:07.98ID:NdBhyyWi ランタイムはasync-std, tokio, actixの3系統という認識であっていますか?
今回は組み込みとか除外で、ウェブ使う前提での根幹の非同期ランタイムに限る話として。
それぞれの系統のデメリットは何ですか?
今回は組み込みとか除外で、ウェブ使う前提での根幹の非同期ランタイムに限る話として。
それぞれの系統のデメリットは何ですか?
514デフォルトの名無しさん
2021/08/03(火) 10:52:22.44ID:C59tapei actixは内部でtokio使ってるから実質tokio
515デフォルトの名無しさん
2021/08/04(水) 05:06:56.84ID:vy1xC0f1 ここ反tokio派が多いようなので
見習ってasync-std派になろうと思います
デメリットなどあれば教えてください
見習ってasync-std派になろうと思います
デメリットなどあれば教えてください
516デフォルトの名無しさん
2021/08/04(水) 13:06:46.39ID:i8X/nYqM ワタシはtokio派
517デフォルトの名無しさん
2021/08/04(水) 13:23:10.51ID:djLthEM6 どうせ遊びコードだろうしどれでもいっしょだろ
518デフォルトの名無しさん
2021/08/04(水) 14:08:55.46ID:kUGuSA9v 遊びコードなら非同期なんか要らないだろ
同期処理のフレームワークにしとけ
同期処理のフレームワークにしとけ
519デフォルトの名無しさん
2021/08/04(水) 14:41:35.72ID:wzpAdwFh tokioは巨大な一枚岩になっていて方針がおかしくね?
520デフォルトの名無しさん
2021/08/04(水) 18:03:25.14ID:ixF3VIJu smolってどうなの
521デフォルトの名無しさん
2021/08/05(木) 00:05:10.42ID:+sKg5038 >>520
smolはasync-ioやasync-fsやasync-netやasync-executorなどの親分だね
それらsmolのサブクレートであるasync-*シリーズはsmol以外のところでも使われてる
smolはasync-ioやasync-fsやasync-netやasync-executorなどの親分だね
それらsmolのサブクレートであるasync-*シリーズはsmol以外のところでも使われてる
522デフォルトの名無しさん
2021/08/05(木) 06:32:52.89ID:vEltfgyn RustではじめるWebAssembly入門〜JavaScriptを超える高速なWebアプリ開発を実践しよう
https://codezine.jp/article/detail/14567
https://codezine.jp/article/detail/14567
523デフォルトの名無しさん
2021/08/05(木) 22:19:57.77ID:CdYIb2/R 昔はtokioも同じように多数のtokio-xxxから成り立っていた
しかしどんどん合併していき巨大な一枚岩tokioになってしまった
しかしどんどん合併していき巨大な一枚岩tokioになってしまった
524デフォルトの名無しさん
2021/08/05(木) 23:44:46.85ID:igzlcjJl 最終的に各機能は連携するので整合性を維持したまま保守し続けることを考えたら
全体でひとつのパッケージにしてしまうのが楽というのはわかる。
全体でひとつのパッケージにしてしまうのが楽というのはわかる。
525デフォルトの名無しさん
2021/08/06(金) 00:29:20.56ID:BpKFUZU0 featureで機能on/offするtokio方式の方が使う側も楽では
526デフォルトの名無しさん
2021/08/06(金) 05:47:54.70ID:uymdWrFB527デフォルトの名無しさん
2021/08/07(土) 08:24:17.06ID:xZrMsPjx オライリーの本で勉強始めたんだが、説明なしにいきなりSomeとか出てきてもやもやしながら読み進んでいる。
索引にも見つからないし。この本のどこかにSomeの説明があるなら誰かページ数教えて。
索引にも見つからないし。この本のどこかにSomeの説明があるなら誰かページ数教えて。
528デフォルトの名無しさん
2021/08/07(土) 08:54:25.11ID:pHhntc3E Somewhere
言いたかっただけだから叩かないで蹴らないで
言いたかっただけだから叩かないで蹴らないで
529デフォルトの名無しさん
2021/08/07(土) 09:03:20.19ID:Xj8Oc6zx わいの持ってるオライリーの『プログラミング Rust』だと27ページ(§2.6.1)でOptionの説明してる
530デフォルトの名無しさん
2021/08/07(土) 09:03:35.46ID:7YRCcDcM 索引に「Option<&T>」はない?
531デフォルトの名無しさん
2021/08/07(土) 09:10:40.92ID:xZrMsPjx 同じ本です。そこで使っているSome(T)の説明がなかったので。
文脈からするとT型の値を持っている何かなんだろうけど、正体がわからないのがもやもやして。
文脈からするとT型の値を持っている何かなんだろうけど、正体がわからないのがもやもやして。
532デフォルトの名無しさん
2021/08/07(土) 09:22:21.99ID:Xj8Oc6zx 列挙型(enum)なら10章で取り上げてるね
Optionは出てこないかもしれないけど
Optionは出てこないかもしれないけど
533デフォルトの名無しさん
2021/08/07(土) 09:30:04.54ID:xZrMsPjx あ、なるほど。Some(T)とい型があるのかと思ってしまったけど、Some<T>じゃないですね。
Option<T>の値の一つとしてSomeがあって、それがTの値を持っていると。
Option<T>の値の一つとしてSomeがあって、それがTの値を持っていると。
534デフォルトの名無しさん
2021/08/07(土) 09:31:53.94ID:tg14s6ns オライリー、はやく改訂してくれええあええぃ!
535デフォルトの名無しさん
2021/08/07(土) 11:16:06.74ID:KHlBD2QX Rustの特徴のうち今回の件だと以下の3つの側面を理解するまでが初心者あるあるですもんね
・Rustのenumは値付きenumすなわちタグ付きunionである
・enumのうちResultとOptionの時だけmatch/return構造のsyntax sugarとして? operatorがある
・そのためRustにはtry/catchの大域脱出機構が無いけども同様の利便性を途中の関数呼び出しに?の1文字付けるだけでスルー出来る
・Rustのenumは値付きenumすなわちタグ付きunionである
・enumのうちResultとOptionの時だけmatch/return構造のsyntax sugarとして? operatorがある
・そのためRustにはtry/catchの大域脱出機構が無いけども同様の利便性を途中の関数呼び出しに?の1文字付けるだけでスルー出来る
536デフォルトの名無しさん
2021/08/07(土) 12:12:56.92ID:VbMntA3z537デフォルトの名無しさん
2021/08/07(土) 12:23:21.41ID:nftxz994 >>536
エラー返す関数はResult<T,Error>で統一されているから、呼び出す自分もそれを見習うだけでしょ。
そしてエラーをcatchしたいところではmatchして、エラーをスルーしたいところでは『?』
エラー返す関数はResult<T,Error>で統一されているから、呼び出す自分もそれを見習うだけでしょ。
そしてエラーをcatchしたいところではmatchして、エラーをスルーしたいところでは『?』
538デフォルトの名無しさん
2021/08/07(土) 13:32:55.26ID:Xj8Oc6zx >>537
Result<T, Error>のErrorの部分の型が違うと?演算子は使えない
struct MyError; // 独自エラー型
fn task() -> Result<(), MyError> {
let file = std::fs::File::open("foo.txt")?; // std::io::Error ≠ MyError だから駄目
// ...
Ok(())
}
ただ型が違ってもFromを実装することで?演算子を使えるようになるのは知っておくと便利
// ↓があると↑はコンパイルできる
impl From<std::io::Error> for MyError {
fn from(error: std::io::Error)-> MyError {
MyError
}
}
Result<T, Error>のErrorの部分の型が違うと?演算子は使えない
struct MyError; // 独自エラー型
fn task() -> Result<(), MyError> {
let file = std::fs::File::open("foo.txt")?; // std::io::Error ≠ MyError だから駄目
// ...
Ok(())
}
ただ型が違ってもFromを実装することで?演算子を使えるようになるのは知っておくと便利
// ↓があると↑はコンパイルできる
impl From<std::io::Error> for MyError {
fn from(error: std::io::Error)-> MyError {
MyError
}
}
539デフォルトの名無しさん
2021/08/07(土) 14:50:06.24ID:GahNZGHc ?はintoを呼び出してるから
まで知っているとモテる
まで知っているとモテる
540デフォルトの名無しさん
2021/08/07(土) 17:42:21.09ID:FYrxKjUH dyn で全部キャッチするようにするから大丈夫!
541デフォルトの名無しさん
2021/08/07(土) 18:01:27.03ID:+ABrS84s 不要なuse削除してくれる便利な機能ってもしかしてあったりしますか?
542デフォルトの名無しさん
2021/08/07(土) 19:24:08.57ID:7Hk1t5D8 >>541
Go使え
Go使え
543デフォルトの名無しさん
2021/08/07(土) 19:33:00.30ID:+7+FQ4Xg cargo fixで消せたっけ?
544デフォルトの名無しさん
2021/08/07(土) 21:44:09.86ID:5+EnO1ft Optionすら知らない人が、いきなりオライリー読んでも分からんのでは…
無料で読めるBookから読んだ方が良くない?
無料で読めるBookから読んだ方が良くない?
545デフォルトの名無しさん
2021/08/08(日) 01:21:05.48ID:pbwTdSH0 Rustlingsの構造体のところやってるんだけどさあ
↓この構造体があった場合に、なんで後に出てくるダメって方のじゃ動かないの???
struct ColorClassicStruct {
name :String,
hex :String,
}
//ダメ
//テキスト領域に"green"や"#00FF00"が書き込まれて、それに対する参照が渡されるからダメってこと!?
let green = ColorClassicStruct{
name: "green",
hex: "#00FF00",
};
//OK
let green = ColorClassicStruct{
name: "green".to_string(),
hex: "#00FF00".to_string(),
};
↓この構造体があった場合に、なんで後に出てくるダメって方のじゃ動かないの???
struct ColorClassicStruct {
name :String,
hex :String,
}
//ダメ
//テキスト領域に"green"や"#00FF00"が書き込まれて、それに対する参照が渡されるからダメってこと!?
let green = ColorClassicStruct{
name: "green",
hex: "#00FF00",
};
//OK
let green = ColorClassicStruct{
name: "green".to_string(),
hex: "#00FF00".to_string(),
};
546デフォルトの名無しさん
2021/08/08(日) 02:00:43.05ID:VDR20IrG "green"の型は&'static strで"green".to_string()の型はString
ただそれだけの話
ただそれだけの話
547デフォルトの名無しさん
2021/08/08(日) 07:20:41.65ID:3PQxbLEp >>545
型が異なる
どちらも文字列実体はUTF8の[u8]配列だが
String
・Vec<u8>を利用
・つまり文字列実体は[u8]配列をヒープに領域確保(この場所は伸長により自動的に移動あり)
・そこへのポインタと確保メモリの長さと文字列の長さの『3つ組』を持つ
・文字列の長さは可変で確保メモリの長さを超えるとヒープ再割り当てが自動的に起きる
&str
・スライス&[u8]を利用
・つまり文字列実体の[u8]は既にどこかに確保されている
・そこへのポインタと文字列の長さの『2つ組』を持つ
・文字列の長さを変えるという概念はない
型が異なる
どちらも文字列実体はUTF8の[u8]配列だが
String
・Vec<u8>を利用
・つまり文字列実体は[u8]配列をヒープに領域確保(この場所は伸長により自動的に移動あり)
・そこへのポインタと確保メモリの長さと文字列の長さの『3つ組』を持つ
・文字列の長さは可変で確保メモリの長さを超えるとヒープ再割り当てが自動的に起きる
&str
・スライス&[u8]を利用
・つまり文字列実体の[u8]は既にどこかに確保されている
・そこへのポインタと文字列の長さの『2つ組』を持つ
・文字列の長さを変えるという概念はない
548デフォルトの名無しさん
2021/08/08(日) 14:26:56.33ID:UvnbNG8C Rustとかまだ生きてるのか
549デフォルトの名無しさん
2021/08/08(日) 14:30:32.33ID:ZbQryp6F 逆にイキイキし始めた
550デフォルトの名無しさん
2021/08/08(日) 17:42:08.00ID:AtnJJ/4w 現状LLVM上でしか動かないらしいけど
将来的にC/C++並みにターゲットプラットホーム増やすって動きはないの?
将来的にC/C++並みにターゲットプラットホーム増やすって動きはないの?
551デフォルトの名無しさん
2021/08/08(日) 17:57:57.87ID:8fWNQyKy >>550
そのプラットホームって何を指して言ってる?
そのプラットホームって何を指して言ってる?
552デフォルトの名無しさん
2021/08/08(日) 17:58:17.99ID:f8nEzm+l それはLLVMの仕事です
553デフォルトの名無しさん
2021/08/08(日) 18:23:12.96ID:YO4aMRa7 >>550
gccバックエンドとかのプロジェクトは進んでいる
gccバックエンドとかのプロジェクトは進んでいる
554デフォルトの名無しさん
2021/08/08(日) 18:26:41.67ID:hfCzmf6o555デフォルトの名無しさん
2021/08/08(日) 18:34:13.86ID:YO4aMRa7556デフォルトの名無しさん
2021/08/08(日) 18:37:27.80ID:hfCzmf6o JVMバックエンドで動くJRustも欲しい
あ、Rust.NETもいるな
あ、Rust.NETもいるな
557デフォルトの名無しさん
2021/08/08(日) 19:39:21.77ID:Sm1ghOWg >>556
メリットは?
メリットは?
558デフォルトの名無しさん
2021/08/08(日) 19:46:05.12ID:hfCzmf6o >>557
豊富な既存ライブラリを利用できる
豊富な既存ライブラリを利用できる
559デフォルトの名無しさん
2021/08/08(日) 20:10:03.36ID:7dicyYlk 聳え立つクソの山の間違えだろ
560デフォルトの名無しさん
2021/08/08(日) 20:12:30.23ID:Sm1ghOWg ランタイムを変える必要はなくて、FFIでいいんじゃないだろうか
561デフォルトの名無しさん
2021/08/08(日) 20:22:22.71ID:o6Sz00kX 純粋に興味だけで言えば面白そうだけど
C++/CLIの二の舞になりそう
C++/CLIの二の舞になりそう
562デフォルトの名無しさん
2021/08/08(日) 21:30:40.77ID:T1ZtDM68 JVM上で動かすなんて、既存資産扱うところでGC避けられなくなる訳だから嬉しさが皆無では。
JVM上で現代的なプログラミングしたいだけならScalaやKotlinのほうがよっぽどいい。
JVM上で現代的なプログラミングしたいだけならScalaやKotlinのほうがよっぽどいい。
564デフォルトの名無しさん
2021/08/08(日) 21:41:24.86ID:Cdmlpdjr >>561
二の舞って、MSがサポートを投げだした以外は別に悪いところは無かったと思うが。
二の舞って、MSがサポートを投げだした以外は別に悪いところは無かったと思うが。
565デフォルトの名無しさん
2021/08/09(月) 00:22:56.88ID:Xf+oNAim Googleもサポートやめる
566デフォルトの名無しさん
2021/08/09(月) 00:45:05.35ID:iRm2fJ4Y C++/CLIのCLIってマイクロソフト.NETのでしょ
567デフォルトの名無しさん
2021/08/09(月) 16:05:33.35ID:bWVDlgk2 LLVMのバックエンドがgcc並みになれば万事解決
568デフォルトの名無しさん
2021/08/09(月) 16:10:16.25ID:OWI9S7jW569デフォルトの名無しさん
2021/08/09(月) 16:57:51.57ID:qYrd5+ip はぁ。
>>561はGCを持った仮想マシン環境に移植することがC++/CLIと似た状況だと言っていたのかと思ったが、
そこは全然これっぽっちも関係ない話なわけね。
開発コミュニティが途中で投げ出す恐れなんて言っていたらあらゆるものが当てはまりそうだが。
>>561はGCを持った仮想マシン環境に移植することがC++/CLIと似た状況だと言っていたのかと思ったが、
そこは全然これっぽっちも関係ない話なわけね。
開発コミュニティが途中で投げ出す恐れなんて言っていたらあらゆるものが当てはまりそうだが。
570デフォルトの名無しさん
2021/08/09(月) 20:27:58.38ID:xgGPGjpP 競プロでRustを使ってみようと思って勉強してたんだけど、
再帰関数がめっちゃ面倒なのね
関数の外のスコープの変数の読み取りができないから、
全部引数に記述しなくちゃいけなくて凄い面倒
処理速度が速かったので期待してたんだけどな(´・ω・`)
再帰関数がめっちゃ面倒なのね
関数の外のスコープの変数の読み取りができないから、
全部引数に記述しなくちゃいけなくて凄い面倒
処理速度が速かったので期待してたんだけどな(´・ω・`)
571デフォルトの名無しさん
2021/08/09(月) 20:38:14.63ID:yQGrG0lM >>545
ダメの方で通るでしょ
宣言でStringを&'static strにする
"green"とだけ書けばプログラムコードのread onlyエリアに確保されて&'static strのライフタイムになる
Stringを使うとheapエリアを余分に使ってしまうので損
もちろん文字列が伸びたり一部書き換わったりなど対応したい時ならばStringを使う
ダメの方で通るでしょ
宣言でStringを&'static strにする
"green"とだけ書けばプログラムコードのread onlyエリアに確保されて&'static strのライフタイムになる
Stringを使うとheapエリアを余分に使ってしまうので損
もちろん文字列が伸びたり一部書き換わったりなど対応したい時ならばStringを使う
572デフォルトの名無しさん
2021/08/09(月) 21:19:46.40ID:9eWGuwAZ573デフォルトの名無しさん
2021/08/09(月) 21:26:05.96ID:fbmhz8DS574デフォルトの名無しさん
2021/08/09(月) 21:59:43.94ID:xgGPGjpP >>573
マジかそんなんあんのか!!!!
static mut test: i32 = 0;
fn main() {
unsafe {
test = 1;
unsafe fn calc() {
if test == 1 { println!("yes") }
}
calc();
}
}
yes表示キタ━━━━(゚∀゚)━━━━!!
ありがとうありがとうヽ(´ー`)ノ
マジかそんなんあんのか!!!!
static mut test: i32 = 0;
fn main() {
unsafe {
test = 1;
unsafe fn calc() {
if test == 1 { println!("yes") }
}
calc();
}
}
yes表示キタ━━━━(゚∀゚)━━━━!!
ありがとうありがとうヽ(´ー`)ノ
575デフォルトの名無しさん
2021/08/10(火) 00:56:57.83ID:u04QFiKf 純粋なグローバル変数は仕方ないけど、thread_localは
もっと簡単な使い方にしてほしかったなー
コールバック関数みたいに引数で渡せないパターンが面倒
もっと簡単な使い方にしてほしかったなー
コールバック関数みたいに引数で渡せないパターンが面倒
576デフォルトの名無しさん
2021/08/10(火) 01:04:05.56ID:1P7sVbl8 引数だけで解決できないなら設計が悪い
577デフォルトの名無しさん
2021/08/10(火) 01:17:00.79ID:mSeKT5En >>575
どうなって欲しいの?
どうなって欲しいの?
578デフォルトの名無しさん
2021/08/10(火) 02:01:49.31ID:pisrhHbj 競プロに向いてるかって言われるとそうでもない気はする
579デフォルトの名無しさん
2021/08/10(火) 02:02:54.83ID:ukJY1zau580デフォルトの名無しさん
2021/08/10(火) 02:13:08.50ID:KzRmJx3E >>570
グローバル変数の代わりに関数の引数を増やすと毎回連れ回す形で見にくくなるけれど
再帰関数ではなく再帰メソッドにしてしまえば引数を増やさずにいくらでもパラメータを使えます
例えば「再帰で1からnまでの和や積」を求める例で「差分diff」が可変パラメータとした場合
struct Arith { diff: i32 }
impl Arith {
fn sum(&self, n: i32) -> i32 { if n <= 0 { 0 } else { n + self.sum(n - self.diff) } }
fn mul(&self, n: i32) -> i32 { if n <= 1 { 1 } else { n * self.mul(n - self.diff) } }
}
fn main() {
let diff1 = Arith { diff: 1 };
assert_eq!(diff1.sum(10), 55); // 1+2+3+4+5+6+7+8+9+10
assert_eq!(diff1.mul(7), 5040); // 1*2*3*4*5*6*7
let diff2 = Arith { diff: 2 };
assert_eq!(diff2.sum(10), 30); // 2+4+6+8+10
assert_eq!(diff2.mul(7), 105); // 1*3*5*7
}
今回はdiffの部分が1個だけですが複数のパラメータにもできます
こうすることで「グローバル変数を使わず」&「引数を毎回連れ回さず」に書けます
グローバル変数の代わりに関数の引数を増やすと毎回連れ回す形で見にくくなるけれど
再帰関数ではなく再帰メソッドにしてしまえば引数を増やさずにいくらでもパラメータを使えます
例えば「再帰で1からnまでの和や積」を求める例で「差分diff」が可変パラメータとした場合
struct Arith { diff: i32 }
impl Arith {
fn sum(&self, n: i32) -> i32 { if n <= 0 { 0 } else { n + self.sum(n - self.diff) } }
fn mul(&self, n: i32) -> i32 { if n <= 1 { 1 } else { n * self.mul(n - self.diff) } }
}
fn main() {
let diff1 = Arith { diff: 1 };
assert_eq!(diff1.sum(10), 55); // 1+2+3+4+5+6+7+8+9+10
assert_eq!(diff1.mul(7), 5040); // 1*2*3*4*5*6*7
let diff2 = Arith { diff: 2 };
assert_eq!(diff2.sum(10), 30); // 2+4+6+8+10
assert_eq!(diff2.mul(7), 105); // 1*3*5*7
}
今回はdiffの部分が1個だけですが複数のパラメータにもできます
こうすることで「グローバル変数を使わず」&「引数を毎回連れ回さず」に書けます
581デフォルトの名無しさん
2021/08/10(火) 04:53:07.24ID:yd00h36W >>574
キャプチャしたいだけならクロージャ使えばいいけど
let test = 1;
let calc = || {
if test == 1 { println!("yes") }
};
calc();
再帰ならaccumulator的なものを連れ回すほうがいいと思う
キャプチャしたいだけならクロージャ使えばいいけど
let test = 1;
let calc = || {
if test == 1 { println!("yes") }
};
calc();
再帰ならaccumulator的なものを連れ回すほうがいいと思う
582デフォルトの名無しさん
2021/08/10(火) 05:14:22.44ID:gCWS4DSe >>581
moveしなくていいの?
moveしなくていいの?
583デフォルトの名無しさん
2021/08/10(火) 05:38:40.18ID:2mfgVpK+ struct使ってimplで&mut selfを持ち回せばいい気が
584デフォルトの名無しさん
2021/08/10(火) 09:41:32.99ID:u04QFiKf585デフォルトの名無しさん
2021/08/10(火) 09:51:21.46ID:u04QFiKf586デフォルトの名無しさん
2021/08/10(火) 14:05:16.63ID:mSeKT5En587デフォルトの名無しさん
2021/08/10(火) 15:05:08.24ID:QyXjq7Ed みんなありがとう、なんとなく再帰できたよ。やり方あってるかわからんけども
以下お試しプログラム
ttps://paiza.jp/works/mondai/dp_primer/dp_primer_stairs_boss
use std::*;
fn main() {
let mut str = String::new();
io::stdin().read_line(&mut str).unwrap();
let mut nums0: Vec<i32> = str.trim().split(" ").map(|it| it.parse().unwrap()).collect();
let mut test = Test { nums: nums0 };
println!("{}", test.calc(0));
}
pub struct Test {
nums: Vec<i32>,
}
impl Test {
pub fn calc(&mut self, id: i32) -> i32 {
if id == self.nums[0] { return 1; }
let mut res0: i32 = 0;
for i in 1..=3 {
if id + self.nums[i] <= self.nums[0] {
res0 += self.calc(id + self.nums[i as usize]);
}
}
return res0;
}
}
以下お試しプログラム
ttps://paiza.jp/works/mondai/dp_primer/dp_primer_stairs_boss
use std::*;
fn main() {
let mut str = String::new();
io::stdin().read_line(&mut str).unwrap();
let mut nums0: Vec<i32> = str.trim().split(" ").map(|it| it.parse().unwrap()).collect();
let mut test = Test { nums: nums0 };
println!("{}", test.calc(0));
}
pub struct Test {
nums: Vec<i32>,
}
impl Test {
pub fn calc(&mut self, id: i32) -> i32 {
if id == self.nums[0] { return 1; }
let mut res0: i32 = 0;
for i in 1..=3 {
if id + self.nums[i] <= self.nums[0] {
res0 += self.calc(id + self.nums[i as usize]);
}
}
return res0;
}
}
588デフォルトの名無しさん
2021/08/10(火) 15:09:12.73ID:QyXjq7Ed ちな、同じプログラムをkotlinで
fun main() {
var numList = readLine()!!.split(" ").map { it.toInt() }.toIntArray();
fun calc(id: Int): Int {
if (id == numList[0]) return 1
var res: Int = 0
for (i in 1..3) {
if (id + numList[i] <= numList[0])
res += calc(id + numList[i])
}
return res;
}
println(calc(0))
}
fun main() {
var numList = readLine()!!.split(" ").map { it.toInt() }.toIntArray();
fun calc(id: Int): Int {
if (id == numList[0]) return 1
var res: Int = 0
for (i in 1..3) {
if (id + numList[i] <= numList[0])
res += calc(id + numList[i])
}
return res;
}
println(calc(0))
}
589デフォルトの名無しさん
2021/08/10(火) 15:34:52.35ID:yd00h36W590デフォルトの名無しさん
2021/08/10(火) 16:13:38.39ID:QyXjq7Ed とりあえずできるかどうか適当に書いたものだからw
あと、これはindexだけを順繰りに送っていけばいいので引数1個でいいけど、
複雑な問題だとindexに、3次元配列の添え字として3つ、その配列本体、比較する配列の文字列とか、
さらにメモ化するためには、メモする配列もとか、めっちゃ引数がもの凄くなることがあるのね
だから、なんとかグローバル変数にアクセスできないかと思って
逆に構造体に全部の参照したい変数をまとめて、それだけを持ち回るとかもいいかもw
あと、これはindexだけを順繰りに送っていけばいいので引数1個でいいけど、
複雑な問題だとindexに、3次元配列の添え字として3つ、その配列本体、比較する配列の文字列とか、
さらにメモ化するためには、メモする配列もとか、めっちゃ引数がもの凄くなることがあるのね
だから、なんとかグローバル変数にアクセスできないかと思って
逆に構造体に全部の参照したい変数をまとめて、それだけを持ち回るとかもいいかもw
591デフォルトの名無しさん
2021/08/10(火) 22:09:35.86ID:OZBv7QiC 再帰使うならもっと再帰っぽく書いてくれ
numsの初項とそれ以降の数値の意味が全く違うなら同じ変数に入れないでくれ
書き捨てや試行錯誤の途中ですらやらないぞこんなの
numsの初項とそれ以降の数値の意味が全く違うなら同じ変数に入れないでくれ
書き捨てや試行錯誤の途中ですらやらないぞこんなの
592デフォルトの名無しさん
2021/08/10(火) 22:40:39.77ID:OOQ3UOoB 競プロってそういうもんだし……
593デフォルトの名無しさん
2021/08/10(火) 22:43:09.06ID:QyXjq7Ed >numsの初項とそれ以降の数値の意味が全く違うなら同じ変数に入れないでくれ
確かにそうなんだが、一度配列にいれちゃったからいいと思ってw
そして十分に再帰っぽいと思うけどなあ
↓スキルがありそうな人のご意見なので、もし良ければ再帰での美しい実装を披露して欲しい
↓参考にしたいのでよろしくお願いします
ttps://paiza.jp/works/mondai/dp_primer/dp_primer_stairs_boss
確かにそうなんだが、一度配列にいれちゃったからいいと思ってw
そして十分に再帰っぽいと思うけどなあ
↓スキルがありそうな人のご意見なので、もし良ければ再帰での美しい実装を披露して欲しい
↓参考にしたいのでよろしくお願いします
ttps://paiza.jp/works/mondai/dp_primer/dp_primer_stairs_boss
594デフォルトの名無しさん
2021/08/11(水) 00:14:29.43ID:KIBLBTNR スマン競プロなの失念してた。ならしょうがないゴメンよ
595デフォルトの名無しさん
2021/08/11(水) 01:42:26.90ID:z0BKpdQB dpに関しては再帰使わない方が計算量少なそう
596デフォルトの名無しさん
2021/08/11(水) 02:02:46.71ID:umCpXnDX >>592
競技プログラミングが何の実用的な実力に結びつかず、全く役に立たない遊びに過ぎない、と言われているのはそこですね
競技プログラミングが何の実用的な実力に結びつかず、全く役に立たない遊びに過ぎない、と言われているのはそこですね
597デフォルトの名無しさん
2021/08/11(水) 02:13:25.09ID:haNghl2/ 再帰でメモ化したバージョンとループでボトムアップにしたバージョン
https://play.rust-lang.org/?version=stable&mode=release&edition=2018&gist=d1b9bd1a085e334225a253ed9360c2e7
テストはしてない
https://play.rust-lang.org/?version=stable&mode=release&edition=2018&gist=d1b9bd1a085e334225a253ed9360c2e7
テストはしてない
598デフォルトの名無しさん
2021/08/11(水) 02:37:36.02ID:z0BKpdQB メモ化するならグローバル変数(もしくは引数で渡す)にした方が良いんじゃないの?
599デフォルトの名無しさん
2021/08/11(水) 02:55:43.83ID:oifoaA/x >>596
競プロは戦闘機でいうところのアクロバット技術と同じようなものだな
アクロバット飛行はときに見るものを魅了するし部分的には実戦に通じるような高度な技術も必要だが
それ自体は実戦では役にたたず実戦でアクロバット飛行のような飛び方をしようものなら撃墜される
競プロは戦闘機でいうところのアクロバット技術と同じようなものだな
アクロバット飛行はときに見るものを魅了するし部分的には実戦に通じるような高度な技術も必要だが
それ自体は実戦では役にたたず実戦でアクロバット飛行のような飛び方をしようものなら撃墜される
600デフォルトの名無しさん
2021/08/11(水) 06:37:52.46ID:MmQ+sLSI >>593
やってみた
入出力例のassertも通ったけどこれでいい?
fn main() {
assert_eq!(17, count(10, &vec![2, 3, 4]));
}
fn count(n: i32, abc: &[i32]) -> i32 {
if n < 0 { 0 } else if n == 0 { 1 } else { abc.iter().map(|a| count(n - a, abc)).sum() }
}
やってみた
入出力例のassertも通ったけどこれでいい?
fn main() {
assert_eq!(17, count(10, &vec![2, 3, 4]));
}
fn count(n: i32, abc: &[i32]) -> i32 {
if n < 0 { 0 } else if n == 0 { 1 } else { abc.iter().map(|a| count(n - a, abc)).sum() }
}
601デフォルトの名無しさん
2021/08/11(水) 17:20:51.95ID:haNghl2/602デフォルトの名無しさん
2021/08/11(水) 18:22:13.11ID:iayIuizo >>600
おお 与えられた数値をmapのなかでラムダ式で計算して、リストのsumするところが素晴らしいw
この場合はカウントだからsumだけど、最小値のminとか最大値のmaxとかでも利用できそうだ
おお 与えられた数値をmapのなかでラムダ式で計算して、リストのsumするところが素晴らしいw
この場合はカウントだからsumだけど、最小値のminとか最大値のmaxとかでも利用できそうだ
603デフォルトの名無しさん
2021/08/11(水) 20:10:22.26ID:iayIuizo >>600
いま試しにやってみたけど、メモ化は必須だから、その美しさは保つことができなかった(´・ω・`)
いま試しにやってみたけど、メモ化は必須だから、その美しさは保つことができなかった(´・ω・`)
604デフォルトの名無しさん
2021/08/11(水) 20:23:36.62ID:haNghl2/ メモを連れ回す方式に修正した
borrowだと面倒なのでmoveにしたがRefCell使うともう少し速くなったりするのかもしれない
https://play.rust-lang.org/?version=stable&mode=release&edition=2018&gist=a0cd25619216cbe4dcdab6c51b7301ad
borrowだと面倒なのでmoveにしたがRefCell使うともう少し速くなったりするのかもしれない
https://play.rust-lang.org/?version=stable&mode=release&edition=2018&gist=a0cd25619216cbe4dcdab6c51b7301ad
605デフォルトの名無しさん
2021/08/11(水) 20:39:47.21ID:zSuiQf57 競プロって計算量を落とせるアルゴリズムを考えることがポイントだと思うんだけど
実装言語の差異はどれくらい影響してくるの?
実装言語の差異はどれくらい影響してくるの?
606デフォルトの名無しさん
2021/08/11(水) 20:46:12.70ID:iayIuizo >>605
あくまで参考だけど、こういうのがあるよ
ttps://twitter.com/chokudai/status/1325981178730438657
ただ3次元配列になると途端に速度が落ちるとか、そういうのもあるので鵜呑みにはできないけど傾向ってことで
あと、各言語の時間制限をしているサイトもある
ttps://paiza.jp/guide/language.html
この各言語の時間制限をみると、運営が考えている言語ごとの速度の違いが大まかにわかる
https://twitter.com/5chan_nel (5ch newer account)
あくまで参考だけど、こういうのがあるよ
ttps://twitter.com/chokudai/status/1325981178730438657
ただ3次元配列になると途端に速度が落ちるとか、そういうのもあるので鵜呑みにはできないけど傾向ってことで
あと、各言語の時間制限をしているサイトもある
ttps://paiza.jp/guide/language.html
この各言語の時間制限をみると、運営が考えている言語ごとの速度の違いが大まかにわかる
https://twitter.com/5chan_nel (5ch newer account)
607デフォルトの名無しさん
2021/08/11(水) 21:01:22.52ID:+LwnMsCS 競プロやっても日本の情報処理産業の国際的地位向上に結びつく気がしない
608デフォルトの名無しさん
2021/08/11(水) 21:19:11.26ID:iayIuizo そら趣味だもの。仕事とは関係ない
ただ、言ってる論理構成が、某小学生youtuberが義務教育なんか
必要ないって言ってる理屈と同じだなと感じる
ただ、言ってる論理構成が、某小学生youtuberが義務教育なんか
必要ないって言ってる理屈と同じだなと感じる
609デフォルトの名無しさん
2021/08/12(木) 00:24:49.53ID:pB2NXWq+ >>603
メモ化するならこう
fn main() {
let mut input_line = String::new();
std::io::stdin().read_line(&mut input_line).unwrap();
let input_numbers: Vec<i32> = input_line.split_whitespace().filter_map(|s| s.parse().ok()).collect();
let n = input_numbers[0];
let abc = &input_numbers[1..];
let mut memo: Vec<i32> = vec!(1);
memo.resize((n + 1) as usize, -1);
println!("{}", count(n, abc, &mut memo));
}
fn count(n: i32, abc: &[i32], memo: &mut [i32]) -> i32 {
abc.iter().map(|a| { let m = n - a; if m < 0 { 0 } else { if memo[m as usize] == -1 { memo[m as usize] = count(m, abc, memo); }; memo[m as usize] }}).sum()
}
メモ化するならこう
fn main() {
let mut input_line = String::new();
std::io::stdin().read_line(&mut input_line).unwrap();
let input_numbers: Vec<i32> = input_line.split_whitespace().filter_map(|s| s.parse().ok()).collect();
let n = input_numbers[0];
let abc = &input_numbers[1..];
let mut memo: Vec<i32> = vec!(1);
memo.resize((n + 1) as usize, -1);
println!("{}", count(n, abc, &mut memo));
}
fn count(n: i32, abc: &[i32], memo: &mut [i32]) -> i32 {
abc.iter().map(|a| { let m = n - a; if m < 0 { 0 } else { if memo[m as usize] == -1 { memo[m as usize] = count(m, abc, memo); }; memo[m as usize] }}).sum()
}
610デフォルトの名無しさん
2021/08/12(木) 02:22:16.40ID:WcppFbZK >>608
むしろ義務教育でyoutube撮影方法教えるべきだとか主張するアホと一緒だろ
むしろ義務教育でyoutube撮影方法教えるべきだとか主張するアホと一緒だろ
611デフォルトの名無しさん
2021/08/12(木) 04:12:25.44ID:/wS1lumL612デフォルトの名無しさん
2021/08/12(木) 14:49:35.08ID:xCjM/E2I 競プロはある種のパズル
パズルを解いたり競ったりを楽しむのもの
パズルをたくさん解くことで仕事のプログラミングに活きる部分がなくも無いが
その二つを同一視してる人は有害
パズルを解いたり競ったりを楽しむのもの
パズルをたくさん解くことで仕事のプログラミングに活きる部分がなくも無いが
その二つを同一視してる人は有害
613デフォルトの名無しさん
2021/08/12(木) 15:56:43.60ID:id/zPgju 同一視してるというか
同一視された方が有利になれる人が同一視するように仕向けている
それ誰よっていうと、サロン屋や人材屋
同一視された方が有利になれる人が同一視するように仕向けている
それ誰よっていうと、サロン屋や人材屋
614デフォルトの名無しさん
2021/08/12(木) 18:29:44.63ID:/wS1lumL ○○検定とかも同じ臭いがする
615デフォルトの名無しさん
2021/08/12(木) 18:49:01.38ID:5/ThobAf キャベツ?
616デフォルトの名無しさん
2021/08/13(金) 02:12:49.72ID:nWHbUrjv Rustlingsの問題なんだけど、これの37行目のmutってなんで必要なの???
https://ideone.com/41tBgy
参照するアドレスが変わるわけでもないのに・・・・どう理解すればいいものなんだろう・・・・
それと、ある構造体を構成するメンバーって、全部がmutか否かの二択になっちゃうわけ?混ぜれないの???
https://ideone.com/41tBgy
参照するアドレスが変わるわけでもないのに・・・・どう理解すればいいものなんだろう・・・・
それと、ある構造体を構成するメンバーって、全部がmutか否かの二択になっちゃうわけ?混ぜれないの???
617デフォルトの名無しさん
2021/08/13(金) 02:51:10.09ID:FruLH7M6 >>616
え?どこに参照が出てきているの?構造体そのものでしょ
そして直後に構造体の中を書き換えているからmutが必要
そして構造体のメンバーはバラバラに生死貸借が起きることはないからメンバー個別の指定の必要性はない
え?どこに参照が出てきているの?構造体そのものでしょ
そして直後に構造体の中を書き換えているからmutが必要
そして構造体のメンバーはバラバラに生死貸借が起きることはないからメンバー個別の指定の必要性はない
618デフォルトの名無しさん
2021/08/13(金) 02:55:04.80ID:E7XaaQej 38,39でその構造体のメンバーに代入するのに必要
619デフォルトの名無しさん
2021/08/13(金) 11:51:53.45ID:FT9FF6Ap >>616
1. let mut x = create_order();
2. let mut x = &create_order();
3. let y = &mut create_order();
4. let mut y = &mut create_order();
それぞれ何がmutableなのか違う
「参照するアドレスが変わるわけでもないのに」ってのは3番目をイメージしてると思われる
1. let mut x = create_order();
2. let mut x = &create_order();
3. let y = &mut create_order();
4. let mut y = &mut create_order();
それぞれ何がmutableなのか違う
「参照するアドレスが変わるわけでもないのに」ってのは3番目をイメージしてると思われる
620デフォルトの名無しさん
2021/08/13(金) 18:27:47.71ID:fDsS9u/P let mut your_name = Some(String::from("変更前"));
match robot_name {
Some(ref mut name) => *name = String::from("変更後"),
None => (),
}
println!("君の名は。: {:?}", your_name);
match robot_name {
Some(ref mut name) => *name = String::from("変更後"),
None => (),
}
println!("君の名は。: {:?}", your_name);
621デフォルトの名無しさん
2021/08/14(土) 04:36:12.68ID:ndgh8Ezu 初歩的な申し訳ないんだが
let x = "hello".to_string(); // convart text to a string テキストを文字列に変換
let y = String::from("hello"); // get text directly テキストを直接取得
これの違いがわかりません
やってること同じですよね?
出力の違いが出る例とかあれば教えてもらえないでしょうか?
let x = "hello".to_string(); // convart text to a string テキストを文字列に変換
let y = String::from("hello"); // get text directly テキストを直接取得
これの違いがわかりません
やってること同じですよね?
出力の違いが出る例とかあれば教えてもらえないでしょうか?
622デフォルトの名無しさん
2021/08/14(土) 06:01:03.88ID:AK8F+nV0 to_stringはinlineでString::fromしてるから全く同じ
impl ToString for str {
#[inline]
fn to_string(&self) -> String {
String::from(self)
}
}
impl ToString for str {
#[inline]
fn to_string(&self) -> String {
String::from(self)
}
}
623デフォルトの名無しさん
2021/08/14(土) 06:06:43.67ID:ndgh8Ezu624デフォルトの名無しさん
2021/08/15(日) 13:09:40.85ID:QO3tNTj5 社員120人が原則テレワーク、「在宅勤務を語ろうチャット」で不安解消 ピクスタ流の働き方
https://www.itmedia.co.jp/business/articles/2103/04/news016.html
正社員ゼロ、会議ゼロのベンチャーが、急成長している驚きの秘密
https://president.jp/articles/-/39405
テレワーク率95%をキープ! “全員原則テレワーク企業”が導入した「Uber手当」「Zoom飲み会代」
https://www.itmedia.co.jp/business/articles/2102/26/news024.html
驚異のテレワーク率「9割超」 営業利益16倍の企業は、生産性が「下がった」社員をどのようにケアしたのか
https://www.itmedia.co.jp/business/articles/2102/04/news010.html
Withコロナ時代の営業改革とは?アステリアが説く「ワークログ」と「マイクロラーニング」の重要性
https://saleszine.jp/article/detail/1677
出社率100%→50% オフィスレイアウトの変更例 社員が「オフィスに行く理由」を考慮せよ
https://www.itmedia.co.jp/business/articles/2101/19/news122.html
キャンピングカーでテレワーク 京急などが実証実験
https://www.itmedia.co.jp/business/articles/2102/17/news112.html
コロナ禍で働き方が激変 これからのシェアオフィスに必要なものとは?
https://www.itmedia.co.jp/business/articles/2103/09/news002.html
【サンフロンティア不動産】〜通うオフィスから“集うオフィス”へ
アフターコロナ時代の働き方を提案するワークプレイス「LIT(リット)」2021年5月オープン
https://prtimes.jp/main/html/rd/p/000000013.000069250.html
https://www.itmedia.co.jp/business/articles/2103/04/news016.html
正社員ゼロ、会議ゼロのベンチャーが、急成長している驚きの秘密
https://president.jp/articles/-/39405
テレワーク率95%をキープ! “全員原則テレワーク企業”が導入した「Uber手当」「Zoom飲み会代」
https://www.itmedia.co.jp/business/articles/2102/26/news024.html
驚異のテレワーク率「9割超」 営業利益16倍の企業は、生産性が「下がった」社員をどのようにケアしたのか
https://www.itmedia.co.jp/business/articles/2102/04/news010.html
Withコロナ時代の営業改革とは?アステリアが説く「ワークログ」と「マイクロラーニング」の重要性
https://saleszine.jp/article/detail/1677
出社率100%→50% オフィスレイアウトの変更例 社員が「オフィスに行く理由」を考慮せよ
https://www.itmedia.co.jp/business/articles/2101/19/news122.html
キャンピングカーでテレワーク 京急などが実証実験
https://www.itmedia.co.jp/business/articles/2102/17/news112.html
コロナ禍で働き方が激変 これからのシェアオフィスに必要なものとは?
https://www.itmedia.co.jp/business/articles/2103/09/news002.html
【サンフロンティア不動産】〜通うオフィスから“集うオフィス”へ
アフターコロナ時代の働き方を提案するワークプレイス「LIT(リット)」2021年5月オープン
https://prtimes.jp/main/html/rd/p/000000013.000069250.html
625デフォルトの名無しさん
2021/08/16(月) 09:44:36.63ID:MZWGbmHz loop式はbreakで指定した値を返せるのに
なぜwhile式やfor式は値を返せないの?
Option型にしてbreakで値を指定した時だけSome(値)としてそれ以外はNoneとすれば便利なのに
なぜwhile式やfor式は値を返せないの?
Option型にしてbreakで値を指定した時だけSome(値)としてそれ以外はNoneとすれば便利なのに
626デフォルトの名無しさん
2021/08/16(月) 10:30:33.78ID:rx7L9F9W (while true のような実質無条件ループを除き)条件付きループをbreakで抜けるのは可読性を下げる要因になるから一般的にはRustに限らずできるだけ避けるだろ
悪い作法を推奨するような機能は付けるべきではない
悪い作法を推奨するような機能は付けるべきではない
627デフォルトの名無しさん
2021/08/16(月) 10:39:16.03ID:WTBg47DG ほぉたしかにそうゆうのあれば便利な時もありそう
macroで似たような物は作れそうな気がする
たしかにlispとかでもwhileはnil returnだな(´・ω・`)
macroで似たような物は作れそうな気がする
たしかにlispとかでもwhileはnil returnだな(´・ω・`)
628デフォルトの名無しさん
2021/08/16(月) 12:47:44.44ID:meTevnZp629デフォルトの名無しさん
2021/08/16(月) 14:09:14.90ID:ScFkjf4y >>628
打ち切りたいなら、take_whileの結果を対して回せばよくね?
打ち切りたいなら、take_whileの結果を対して回せばよくね?
630デフォルトの名無しさん
2021/08/16(月) 14:32:54.40ID:ebJKRLr3 手間かけて機能拡張するほどのメリットがないってことだろうね
https://github.com/rust-lang/rfcs/issues/1767#issuecomment-292678002
https://github.com/rust-lang/rfcs/issues/1767#issuecomment-292678002
631デフォルトの名無しさん
2021/08/16(月) 16:29:22.27ID:RqqPeHPy つまりforやwhileではなくiterを使うかloopを使えってことか
632デフォルトの名無しさん
2021/08/16(月) 16:36:53.53ID:iL7TnNF0 awaitとか ? が絡むとループ使いたい場合はあるかもね
633デフォルトの名無しさん
2021/08/16(月) 16:57:08.35ID:QDTL5fKB634デフォルトの名無しさん
2021/08/16(月) 20:57:35.53ID:iL7TnNF0635デフォルトの名無しさん
2021/08/16(月) 22:05:08.22ID:bBW7ChkS featuresは?
636デフォルトの名無しさん
2021/08/16(月) 23:25:05.01ID:e18AJ9DT >>634
?の方だけど、NoneやErrを除外してSomeやOkの皮を外すのはfilter_map使わないとメンドイね
例えばこんな感じで「?」はクロージャ内で使えた
println!("{}", std::env::args().filter_map(|x| std::char::from_u32(x.parse::<u32>().ok()?+110)).collect::<String>());
実行結果
$ cargo run 4 test 7 5 987654321 6
rust
?の方だけど、NoneやErrを除外してSomeやOkの皮を外すのはfilter_map使わないとメンドイね
例えばこんな感じで「?」はクロージャ内で使えた
println!("{}", std::env::args().filter_map(|x| std::char::from_u32(x.parse::<u32>().ok()?+110)).collect::<String>());
実行結果
$ cargo run 4 test 7 5 987654321 6
rust
637デフォルトの名無しさん
2021/08/17(火) 01:06:37.74ID:diXkc4zq >>636
これは filter_map よりも map().collect::<Result<String, _>>() の方がよさそう
これは filter_map よりも map().collect::<Result<String, _>>() の方がよさそう
638デフォルトの名無しさん
2021/08/17(火) 01:42:37.78ID:2Xo4qCNa 全く関係ないけど、
for x in v
には、
for x in &v
for x in &mut v
for x in v.iter()
のようなバリエーションもあるようだけど、
for &x in v
のような書き方も出来るの?
あと、v と書いても v.iter() の省略なの?
この辺の話はどこに書いてる?
for x in v
には、
for x in &v
for x in &mut v
for x in v.iter()
のようなバリエーションもあるようだけど、
for &x in v
のような書き方も出来るの?
あと、v と書いても v.iter() の省略なの?
この辺の話はどこに書いてる?
639デフォルトの名無しさん
2021/08/17(火) 01:44:24.62ID:2Xo4qCNa640デフォルトの名無しさん
2021/08/17(火) 01:46:10.93ID:yPn/BtRt >>638-639
左辺と右辺はパターンマッチで対応するメカニズムになっている。
左辺と右辺はパターンマッチで対応するメカニズムになっている。
641デフォルトの名無しさん
2021/08/17(火) 02:15:00.92ID:Ok9gkDKS >>638
forの展開はこの辺とか。.iter()じゃなくて.into_iter()やね
https://doc.rust-lang.org/reference/expressions/loop-expr.html#iterator-loops
forの展開はこの辺とか。.iter()じゃなくて.into_iter()やね
https://doc.rust-lang.org/reference/expressions/loop-expr.html#iterator-loops
642デフォルトの名無しさん
2021/08/17(火) 03:20:14.87ID:q/ldIEfm この言語の敷居の高さの上げ方は異常すぎる。誰も全容分かってない
643デフォルトの名無しさん
2021/08/17(火) 03:39:07.39ID:yPn/BtRt C++ よりマシ。
644デフォルトの名無しさん
2021/08/17(火) 04:00:51.74ID:run+2ZVZ それだと最初のエラーを拾ってしまうけど今回はエラーになる引数を与えてそれらを無視して拾い集めるコード
もしエラーにならない引数だけを与えて成功するコードならばその方針もいいかも
あとfrom_u32はOptionを返すのでResultでなく全体をOptionにするとして
最後にunwrapも必要なのでmap().collect()のコードは以下になると思いますが
元の>>636より長くなってしまいますね
println!("{}", std::env::args().skip(1).map(|x| std::char::from_u32(x.parse::<u32>().ok()?+110)).collect::<Option<String>>().unwrap());
実行結果
$ cargo run 4 7 5 6
rust
もしエラーにならない引数だけを与えて成功するコードならばその方針もいいかも
あとfrom_u32はOptionを返すのでResultでなく全体をOptionにするとして
最後にunwrapも必要なのでmap().collect()のコードは以下になると思いますが
元の>>636より長くなってしまいますね
println!("{}", std::env::args().skip(1).map(|x| std::char::from_u32(x.parse::<u32>().ok()?+110)).collect::<Option<String>>().unwrap());
実行結果
$ cargo run 4 7 5 6
rust
645デフォルトの名無しさん
2021/08/17(火) 09:39:00.09ID:Wyc5eeHq 小中学生あたりでもわかる本ある?
646デフォルトの名無しさん
2021/08/17(火) 09:48:35.92ID:uTdncVPo きったねぇコードだな
647デフォルトの名無しさん
2021/08/17(火) 13:39:50.79ID:hwU1GG4D 参照型の変数xをlet文で新しい変数yの初期値にした場合、
let a = 123;
let x:&i32 = &a;
let y = x;
y は参照型になるんだっけ?
そもそも、最初の文は
let x = &a;
と書いても全く同じ意味だっけ? さらに、
let x:&i32 = a;
と書いても同じ?
let a = 123;
let x:&i32 = &a;
let y = x;
y は参照型になるんだっけ?
そもそも、最初の文は
let x = &a;
と書いても全く同じ意味だっけ? さらに、
let x:&i32 = a;
と書いても同じ?
648デフォルトの名無しさん
2021/08/17(火) 14:30:13.21ID:082KifEP >>647
試してみるといいよ
yの型を知りたければtype_of(&y)で
fn type_of<T>(_: &T) -> &str {
std::any::type_name::<T>()
}
let a = 123;
let x = &a;
let y = x;
println!("{}:{}, {}:{}", x, type_of(&x), y, type_of(&y));
試してみるといいよ
yの型を知りたければtype_of(&y)で
fn type_of<T>(_: &T) -> &str {
std::any::type_name::<T>()
}
let a = 123;
let x = &a;
let y = x;
println!("{}:{}, {}:{}", x, type_of(&x), y, type_of(&y));
649デフォルトの名無しさん
2021/08/17(火) 14:31:53.69ID:hwU1GG4D 答えを知ってる人に書いて欲しい。
この言語、試してみないと型すら分からないんだったら困るな。
この言語、試してみないと型すら分からないんだったら困るな。
650デフォルトの名無しさん
2021/08/17(火) 14:35:58.73ID:Ok9gkDKS >>647
> y は参照型になるんだっけ?
なる
> そもそも、最初の文は
> let x = &a;
> と書いても全く同じ意味だっけ?
ほぼ同じ
下だとaの型がi32に固定されない点だけ違う
> さらに、
> let x:&i32 = a;
> と書いても同じ?
これは全然違う
そもそも型エラーでコンパイルできない
> y は参照型になるんだっけ?
なる
> そもそも、最初の文は
> let x = &a;
> と書いても全く同じ意味だっけ?
ほぼ同じ
下だとaの型がi32に固定されない点だけ違う
> さらに、
> let x:&i32 = a;
> と書いても同じ?
これは全然違う
そもそも型エラーでコンパイルできない
651デフォルトの名無しさん
2021/08/17(火) 14:41:24.86ID:QXNoWfC2 >>647
めちゃ基本的なことなので入門書を読もう
めちゃ基本的なことなので入門書を読もう
652デフォルトの名無しさん
2021/08/17(火) 14:45:56.55ID:hwU1GG4D 本を読んだけど、明確には書いてなかったと思う。
let文に置いて参照型が右辺の場合、左辺も参照型になるということなのか。
ということは、letを書かない代入文で左辺に参照型で無い型を
書いて、右辺に参照型がある場合にはエラーになるのか???
わけが分からん。
let文に置いて参照型が右辺の場合、左辺も参照型になるということなのか。
ということは、letを書かない代入文で左辺に参照型で無い型を
書いて、右辺に参照型がある場合にはエラーになるのか???
わけが分からん。
653デフォルトの名無しさん
2021/08/17(火) 14:51:57.21ID:WvkHdE3s C++出身の人かな
654デフォルトの名無しさん
2021/08/17(火) 15:00:35.72ID:hwU1GG4D C++出身だ。
Rustにおける参照型の変数の規則性が分からない。
Rustにおける参照型の変数の規則性が分からない。
655デフォルトの名無しさん
2021/08/17(火) 15:06:15.30ID:Ok9gkDKS >>654
Rustの参照はC++の参照じゃなくてポインタのほうが近いよ
Rustの参照はC++の参照じゃなくてポインタのほうが近いよ
656デフォルトの名無しさん
2021/08/17(火) 15:06:32.93ID:uFWUzCTr Rustから入る人や
色々な言語をやってきた人は理解が早い
しかしC++だけやJavaだけしか経験ない人は
自己中な思い込みが激しくて素直に学習しようとせずに間違った解釈したりして無駄な質問ばかりしがち
色々な言語をやってきた人は理解が早い
しかしC++だけやJavaだけしか経験ない人は
自己中な思い込みが激しくて素直に学習しようとせずに間違った解釈したりして無駄な質問ばかりしがち
657デフォルトの名無しさん
2021/08/17(火) 15:06:36.98ID:hwU1GG4D Rustは例はあるが、ちゃんとした論理的な言葉や数式の様なもので、規則性が
書いてないのではない?
C++だともっと厳密に書いてある。
書いてないのではない?
C++だともっと厳密に書いてある。
658デフォルトの名無しさん
2021/08/17(火) 15:10:48.52ID:+ZvfT+RK >>652
何て本?
何て本?
659デフォルトの名無しさん
2021/08/17(火) 15:11:29.96ID:hwU1GG4D660デフォルトの名無しさん
2021/08/17(火) 15:12:37.71ID:hwU1GG4D661デフォルトの名無しさん
2021/08/17(火) 15:13:56.74ID:Ok9gkDKS >>657
そういう位置付けのドキュメントはこれだね
ただし冒頭にもある通り完全ではない
The Rust Reference
https://doc.rust-lang.org/stable/reference/
そういう位置付けのドキュメントはこれだね
ただし冒頭にもある通り完全ではない
The Rust Reference
https://doc.rust-lang.org/stable/reference/
662デフォルトの名無しさん
2021/08/17(火) 15:15:28.48ID:Y5PdM7En663デフォルトの名無しさん
2021/08/17(火) 15:18:24.83ID:hwU1GG4D >>662
めんどくさいので試してないんだよ。
試さなくても数学の用に読んで理解できる規則が欲しい。
Cのポインタは難しいとされるが、俺は数学が得意なので本を読んだだけで
完璧に理解できた。
C++探せばちゃんと書いてある本がある。
めんどくさいので試してないんだよ。
試さなくても数学の用に読んで理解できる規則が欲しい。
Cのポインタは難しいとされるが、俺は数学が得意なので本を読んだだけで
完璧に理解できた。
C++探せばちゃんと書いてある本がある。
664デフォルトの名無しさん
2021/08/17(火) 15:23:08.50ID:hwU1GG4D665デフォルトの名無しさん
2021/08/17(火) 15:24:30.00ID:+8wra73u 「俺は数学が得意なんだ!」
ワロタ
いつものBoxおじいさんじゃん
ワロタ
いつものBoxおじいさんじゃん
666デフォルトの名無しさん
2021/08/17(火) 15:24:31.45ID:hwU1GG4D 目次を見てもReferenceの文字が見当たらないが。
C++だとちゃんとあるぞ。
どうしてReferenceも型のはずなのに、目次すらないんだよ。
C++だとちゃんとあるぞ。
どうしてReferenceも型のはずなのに、目次すらないんだよ。
667デフォルトの名無しさん
2021/08/17(火) 15:25:31.33ID:hwU1GG4D >>665
トップだったからな。
トップだったからな。
668デフォルトの名無しさん
2021/08/17(火) 15:27:48.00ID:bPhCjiXF >>660
そこまで言うならば十数種類あるRustドキュメントのうち、
editionとapiとstdとreferenceとtheとcookとexampleあたりにあとはcliとasyncくらいまでが基礎かな。
あと外部たがcargoとrustcにrustdocなどのbookも。
unstableやnomiconは後でいい。
wasmやembedded系bookも必要なら。
そこまで言うならば十数種類あるRustドキュメントのうち、
editionとapiとstdとreferenceとtheとcookとexampleあたりにあとはcliとasyncくらいまでが基礎かな。
あと外部たがcargoとrustcにrustdocなどのbookも。
unstableやnomiconは後でいい。
wasmやembedded系bookも必要なら。
669デフォルトの名無しさん
2021/08/17(火) 15:28:18.82ID:jTG+Bjsl IQ87の人でしょ
相手しちゃダメ
相手しちゃダメ
670デフォルトの名無しさん
2021/08/17(火) 15:29:44.40ID:hwU1GG4D671デフォルトの名無しさん
2021/08/17(火) 15:30:14.32ID:hwU1GG4D >>669
お前の友達と一緒にすんな。
お前の友達と一緒にすんな。
672デフォルトの名無しさん
2021/08/17(火) 15:35:47.16ID:JF4CPCdG >>667
数学得意ならRustも深く理解しやすい
強い静的な型システムの元にある
そして生死貸借も明確で数学的にメモリ安全性を保証
利便性のための参照&外し自動適用を除いて型キャストが暗黙に自動で行われることともない
数学得意ならRustも深く理解しやすい
強い静的な型システムの元にある
そして生死貸借も明確で数学的にメモリ安全性を保証
利便性のための参照&外し自動適用を除いて型キャストが暗黙に自動で行われることともない
673デフォルトの名無しさん
2021/08/17(火) 15:44:19.09ID:hwU1GG4D >>672
さっきから聞いているのに、ちゃんとした論理的規則を語った人は誰も居ない。
つまり、今このスレに居る人達は誰も理解してない証拠だろう。
つまりこれは、Rustが試してみないと分からない言語だからではないか。
さっきから聞いているのに、ちゃんとした論理的規則を語った人は誰も居ない。
つまり、今このスレに居る人達は誰も理解してない証拠だろう。
つまりこれは、Rustが試してみないと分からない言語だからではないか。
674デフォルトの名無しさん
2021/08/17(火) 15:46:21.18ID:diXkc4zq675デフォルトの名無しさん
2021/08/17(火) 15:48:51.11ID:hwU1GG4D676デフォルトの名無しさん
2021/08/17(火) 15:56:13.41ID:UjpqRJxn ポインタを理解するのにもRustを理解するのにも数学の得意不得意は関係なくね?
ポインタを理解できない人をあまり多く見たことがないから実際のところどうなのかよく分からないんだが
ポインタを理解できない人をあまり多く見たことがないから実際のところどうなのかよく分からないんだが
677デフォルトの名無しさん
2021/08/17(火) 15:57:56.00ID:U4J278+6678デフォルトの名無しさん
2021/08/17(火) 15:59:25.04ID:hwU1GG4D679デフォルトの名無しさん
2021/08/17(火) 16:06:26.36ID:KRsjniKD680デフォルトの名無しさん
2021/08/17(火) 17:16:17.31ID:uVOQbHaf グリーンスレッド何それ?さんだっけ?
681デフォルトの名無しさん
2021/08/17(火) 17:20:32.19ID:apgY8ckc 公式の言葉が欲しいってならreferenceのlet statement, reference patternsあたりでもみりゃいいんじゃないっすかね知らんけど
682デフォルトの名無しさん
2021/08/17(火) 17:32:50.74ID:fMgDzJWA rustは思ったより流行りそうにないなぁ。
使用者爆発的に増えてくるハズがC++知らん人は
そもそも使う層じゃないし、
C++知ってる人は、逆にめんどくさいから様子見、流行らなければスルー
ぐらいかね。
使用者爆発的に増えてくるハズがC++知らん人は
そもそも使う層じゃないし、
C++知ってる人は、逆にめんどくさいから様子見、流行らなければスルー
ぐらいかね。
683デフォルトの名無しさん
2021/08/17(火) 18:03:44.37ID:PENy3uzh ぶっちゃけ1言語のみしか使えないようなプログラマが有能だとはとても思えないが
実際にそういう人はいるけど融通効かないし生産性が高いとも思えない
所詮ドカタじゃないの
実際にそういう人はいるけど融通効かないし生産性が高いとも思えない
所詮ドカタじゃないの
684デフォルトの名無しさん
2021/08/17(火) 18:14:54.04ID:yPn/BtRt >>682
C++ で疲弊した人が Rust に移ってるってのはあるぞ。
C++ で疲弊した人が Rust に移ってるってのはあるぞ。
685デフォルトの名無しさん
2021/08/17(火) 18:21:01.37ID:diXkc4zq686デフォルトの名無しさん
2021/08/17(火) 20:01:51.20ID:uTdncVPo 疲弊というかドロップアウター
687デフォルトの名無しさん
2021/08/17(火) 21:03:40.91ID:iE5VyQYC >>647
上3つの式は正しいのに、なんで下2つの式はそうなるのか
上3つの式は正しいのに、なんで下2つの式はそうなるのか
688デフォルトの名無しさん
2021/08/17(火) 21:04:44.45ID:iE5VyQYC689デフォルトの名無しさん
2021/08/17(火) 21:18:21.30ID:sY2NwSu8 実際はc++わからんけどrustわかればマウント取れそうじゃね?って馬鹿しか手を出してないという現実。
690デフォルトの名無しさん
2021/08/17(火) 21:24:14.87ID:hwU1GG4D Rustは、GoogleTrendsでは他の言語に比べて低空飛行だけど(Kotlinと同じくらい
ではあるが)、他の言語が下がる傾向があるのに対してRustだけは少しずつ上がってる。
Stackoverflowでは既にC++の30%〜40%位まで質問の量が迫ってきているとか。
なので良く分からない。
GoogleTrendsが実際と合ってないという説も見かけた。
ではあるが)、他の言語が下がる傾向があるのに対してRustだけは少しずつ上がってる。
Stackoverflowでは既にC++の30%〜40%位まで質問の量が迫ってきているとか。
なので良く分からない。
GoogleTrendsが実際と合ってないという説も見かけた。
691デフォルトの名無しさん
2021/08/17(火) 21:26:37.22ID:hwU1GG4D crates.ioでcrateをダウンロードされた回数が20億回を越えていたり、
投稿されたcrateの数が3万種類を超えたりとか。
20億回というのはとんでもない大きな数字。
全世界のプログラマの数は2,500万人くらいだそうだから相当な数だ。
良く分からないくらい異常に大きな数値。
投稿されたcrateの数が3万種類を超えたりとか。
20億回というのはとんでもない大きな数字。
全世界のプログラマの数は2,500万人くらいだそうだから相当な数だ。
良く分からないくらい異常に大きな数値。
692デフォルトの名無しさん
2021/08/17(火) 21:35:56.30ID:hYkkAkQv iocrateはきっと誰かがwhile true do; cargo build; cargo clean;doneみたいの流し続けたんだろ
c++よりマシなのは確かだがredosだかみたいの全然進まんしc++,cな代替物にはなれなさそう
tech giantsみたいな連中が根幹部分rustに変えるみたいな事言ってるけど流行ってる感じ全然しないよね(´・ω・`)
c++よりマシなのは確かだがredosだかみたいの全然進まんしc++,cな代替物にはなれなさそう
tech giantsみたいな連中が根幹部分rustに変えるみたいな事言ってるけど流行ってる感じ全然しないよね(´・ω・`)
693デフォルトの名無しさん
2021/08/17(火) 21:40:50.24ID:jTG+Bjsl 久しぶりに流行ってない流行らないアピールきてるね
694デフォルトの名無しさん
2021/08/17(火) 21:41:43.37ID:LO76a4+c 土方では流行らないでしょ
695デフォルトの名無しさん
2021/08/17(火) 21:45:28.03ID:yac5fWyQ リポジトリの分散化考えないとマジ負荷が半端無さそう
696デフォルトの名無しさん
2021/08/17(火) 21:49:53.88ID:fMgDzJWA rustで作ったライブラリは他の言語から使いやすいんかい?
c\c++置き換えるなら、むしろそここそ一番重要かもしれん。
c\c++置き換えるなら、むしろそここそ一番重要かもしれん。
697デフォルトの名無しさん
2021/08/17(火) 22:12:04.05ID:53TH2cCY698デフォルトの名無しさん
2021/08/17(火) 22:14:00.60ID:53TH2cCY699デフォルトの名無しさん
2021/08/17(火) 22:16:21.15ID:53TH2cCY vue.jsのgithubでのStar数は、18万7,000だった。
crate.ioのダウンロード回数はこの1万倍を越えている。
普通に使っているだけでは辻褄が合いそうに無いな。
全世界の全てのプログラマが100回くらいcrateをダウンロードしたことになる。
crate.ioのダウンロード回数はこの1万倍を越えている。
普通に使っているだけでは辻褄が合いそうに無いな。
全世界の全てのプログラマが100回くらいcrateをダウンロードしたことになる。
700デフォルトの名無しさん
2021/08/17(火) 22:54:36.64ID:Ok9gkDKS crates.ioのDL数と比較すべきはnpmのDL数では?
https://www.npmtrends.com/vue
https://www.npmtrends.com/vue
701デフォルトの名無しさん
2021/08/18(水) 00:15:56.99ID:24ORvnDg crates.ioのダウンロード数は依存crateのCIが走る度に増えるようなものだからそりゃ多くなるでしょ
GitHubのstarと比較したのはなぜ?
GitHubのstarと比較したのはなぜ?
702デフォルトの名無しさん
2021/08/18(水) 00:33:37.55ID:c7Y+RcIr 別にプログラマが手動でダウンロードするわけではないんだが…
1回コンパイルすると100個以上落としてくるのも普通だから
2千万回コンパイルが実行された、という程度の話
ざっくり5年で均せば1日1万回ってとこか
1回コンパイルすると100個以上落としてくるのも普通だから
2千万回コンパイルが実行された、という程度の話
ざっくり5年で均せば1日1万回ってとこか
703デフォルトの名無しさん
2021/08/18(水) 01:06:03.53ID:WOvB8ChX CIだろうね。人がcargoを直に打ってるとは思えん
704デフォルトの名無しさん
2021/08/18(水) 01:16:27.76ID:wcIqldgw 強力にキャッシュが効くはずのCIでツールが未整備なために効かず
異常にDL数が伸びてしまっただけだろう
異常にDL数が伸びてしまっただけだろう
705デフォルトの名無しさん
2021/08/18(水) 04:35:06.87ID:AXrkZvXQ CIのライブラリインストールが動画の次に無駄な帯域を食ってると言われているだけある
706デフォルトの名無しさん
2021/08/18(水) 09:18:01.26ID:k0LDI8WO >>639
難しく考えすぎ
&と*の関係は単純明白
let a = 123; // a: i32
let b = a; // b: i32
let p = &b; // p: &i32
let q = p; // q: &i32
let &r = &p; // r: &i32
let x = &q; // x: &&i32
let s = *x; // s: &i32
let c = *r; // c: i32
let y = &&c // y: &&i32
let z = y; // z: &&i32
let d = **z; // d: i32
難しく考えすぎ
&と*の関係は単純明白
let a = 123; // a: i32
let b = a; // b: i32
let p = &b; // p: &i32
let q = p; // q: &i32
let &r = &p; // r: &i32
let x = &q; // x: &&i32
let s = *x; // s: &i32
let c = *r; // c: i32
let y = &&c // y: &&i32
let z = y; // z: &&i32
let d = **z; // d: i32
707デフォルトの名無しさん
2021/08/18(水) 09:35:44.42ID:GD93l4al ライブラリが他言語から使いにくいってのも謎だな
他言語からならC ABI一択なわけで、どの言語でライブラリ書こうが使い勝手は同じだと思うが
他言語からならC ABI一択なわけで、どの言語でライブラリ書こうが使い勝手は同じだと思うが
708デフォルトの名無しさん
2021/08/18(水) 09:48:19.81ID:JVjfL7Fa >>697
例えばPyO3でPythonからRust呼び出せるよ
例えばPyO3でPythonからRust呼び出せるよ
709デフォルトの名無しさん
2021/08/18(水) 10:49:15.04ID:NS5B/B7Q >>672
自動的な参照外し(*を記載してないのに*適用)って、値を使うところで&Tや&&Tなどが使われたときにTの値になる、というルールだからそれも数学的でしょ。
あと&Tではない各種スマートポインタや自作の型を、*記載で参照外しする時も、Derefトレイト実装通りに行われるからこれも数学的。
自動的な参照外し(*を記載してないのに*適用)って、値を使うところで&Tや&&Tなどが使われたときにTの値になる、というルールだからそれも数学的でしょ。
あと&Tではない各種スマートポインタや自作の型を、*記載で参照外しする時も、Derefトレイト実装通りに行われるからこれも数学的。
710デフォルトの名無しさん
2021/08/18(水) 11:27:15.93ID:k0LDI8WO >>647氏が混乱したのもそこかもね
例えば
let a = 99;
let b = &a;
assert_eq!(100, b + 1);
assert_eq!(100, *b + 1);
つまり値を使う所では参照のままではなく安全に*が自動適用
構造体のフィールドアクセスも
struct Point {x: i32, y: i32}
let p = Point {x: 19, y: 31};
let q = &p;
assert_eq!(p.x, q.x);
assert_eq!(p.y, (*q).y);
つまりフィールドアクセスする所では参照のままではなく安全に*が自動適用
だからC言語などにある「q->y」という記法がRustには不要なので存在しない
例えば
let a = 99;
let b = &a;
assert_eq!(100, b + 1);
assert_eq!(100, *b + 1);
つまり値を使う所では参照のままではなく安全に*が自動適用
構造体のフィールドアクセスも
struct Point {x: i32, y: i32}
let p = Point {x: 19, y: 31};
let q = &p;
assert_eq!(p.x, q.x);
assert_eq!(p.y, (*q).y);
つまりフィールドアクセスする所では参照のままではなく安全に*が自動適用
だからC言語などにある「q->y」という記法がRustには不要なので存在しない
711デフォルトの名無しさん
2021/08/18(水) 11:41:08.71ID:XfIyaV62 こじつけの自己レス自演が気持ち悪い
これでバレないとおもってるんだからww
お前も頑張って勉強中なの丸出しなのになぜそんなに上から目線で書きたがる?
これでバレないとおもってるんだからww
お前も頑張って勉強中なの丸出しなのになぜそんなに上から目線で書きたがる?
712デフォルトの名無しさん
2021/08/18(水) 12:12:05.22ID:cmZsMbhP713デフォルトの名無しさん
2021/08/18(水) 12:12:56.84ID:Lbl25gGI 演算子も含めてメソッド呼出しのときの self の参照が調整されるのは言語コアの機能だけど
演算子の右辺で参照が剥がされるのは参照を受け取るバージョンのメソッドも用意されてるから
という理解でいいんだよね?
演算子の右辺で参照が剥がされるのは参照を受け取るバージョンのメソッドも用意されてるから
という理解でいいんだよね?
714デフォルトの名無しさん
2021/08/18(水) 12:16:13.67ID:UTiWVDvk715デフォルトの名無しさん
2021/08/18(水) 12:52:27.85ID:KGSse8GZ そこはstd::ops::Addトレイトのimplがあるかどうか
ただしi32と&i32に対してはあるけど&&i32に対してはない
そのためさきほどの例だと
let a = 99;
let c = &&a;
assert_eq!(100, **c + 1); // i32はそのままOK
assert_eq!(100, *c + 1); // &i32は参照外してi32でOK
assert_eq!(100, c + 1); // &&i32のAddトレイト定義はないからコンパイルエラー
ただしi32と&i32に対してはあるけど&&i32に対してはない
そのためさきほどの例だと
let a = 99;
let c = &&a;
assert_eq!(100, **c + 1); // i32はそのままOK
assert_eq!(100, *c + 1); // &i32は参照外してi32でOK
assert_eq!(100, c + 1); // &&i32のAddトレイト定義はないからコンパイルエラー
716デフォルトの名無しさん
2021/08/18(水) 13:56:40.85ID:XmrgRQmj 繰り返し間違った内容垂れ流すのいい加減やめれ
717デフォルトの名無しさん
2021/08/18(水) 14:02:16.47ID:NAGfODce >>715で合ってるよ
718デフォルトの名無しさん
2021/08/18(水) 14:42:37.07ID:tdn9Bdbv ご愁傷様
719デフォルトの名無しさん
2021/08/18(水) 15:05:20.49ID:PR0UGd3d ご安全に*
720デフォルトの名無しさん
2021/08/18(水) 19:37:59.33ID:e8CK2aK/ 質問したようなのと近い流れになってて助かった
(0..7).filter(|&x| x == 0);
↑これ通るから ↓こうしたら駄目だった。なんでなん?
let mut vec0 = vec![1, 2, 3, 4, 5, 6];
vec0.iter().filter(|&x| x == 1);
そこで、様々テストしたら、↓の方法でコンパイルが通ることがわかった
どのやり方が一般的なん?個人的には1か4かと思うんだけど。あと、2は+0することで型推論が働いてるのん?
vec0.iter().filter(|&x| *x == 1); //1
vec0.iter().filter(|&x| x + 0 == 1); //2
vec0.iter().filter(|&x| x == &1); //3
vec0.iter().filter(|&x| x.clone() == 1); //4
vec0.iter().filter(|x| **x == 1); //5
vec0.iter().filter(|x| *x == &1); //6
(0..7).filter(|&x| x == 0);
↑これ通るから ↓こうしたら駄目だった。なんでなん?
let mut vec0 = vec![1, 2, 3, 4, 5, 6];
vec0.iter().filter(|&x| x == 1);
そこで、様々テストしたら、↓の方法でコンパイルが通ることがわかった
どのやり方が一般的なん?個人的には1か4かと思うんだけど。あと、2は+0することで型推論が働いてるのん?
vec0.iter().filter(|&x| *x == 1); //1
vec0.iter().filter(|&x| x + 0 == 1); //2
vec0.iter().filter(|&x| x == &1); //3
vec0.iter().filter(|&x| x.clone() == 1); //4
vec0.iter().filter(|x| **x == 1); //5
vec0.iter().filter(|x| *x == &1); //6
721デフォルトの名無しさん
2021/08/18(水) 19:43:27.81ID:4IMEZtM2 全部結果まで含めて正しかった?
722デフォルトの名無しさん
2021/08/18(水) 19:48:58.01ID:e8CK2aK/ ベクタの内容を↓にして
let mut vec0 = vec![1, 2, 1, 4, 1, 6];
1の数をcountするようにして表示させてみたけど、>>720の1〜6のやり方でどれもcountの数は同じだね
let mut vec0 = vec![1, 2, 1, 4, 1, 6];
1の数をcountするようにして表示させてみたけど、>>720の1〜6のやり方でどれもcountの数は同じだね
723デフォルトの名無しさん
2021/08/18(水) 20:01:07.37ID:e8CK2aK/ いいぞ!いいぞ!これも通るぞ!!
let mut test6 = vec0.iter().filter(|&&x| x == 1).count();
let mut test7 = vec0.iter().filter(|x| x == &&1).count();
let mut test8 = vec0.iter().filter(|x| *x + 0 == 1).count();
ヽ(゚∀゚)メ(゚∀゚)メ(゚∀゚)ノ
let mut test6 = vec0.iter().filter(|&&x| x == 1).count();
let mut test7 = vec0.iter().filter(|x| x == &&1).count();
let mut test8 = vec0.iter().filter(|x| *x + 0 == 1).count();
ヽ(゚∀゚)メ(゚∀゚)メ(゚∀゚)ノ
724デフォルトの名無しさん
2021/08/18(水) 20:03:48.63ID:gDWYR9GO Bible終えるのにどれぐらい時間かかりましたか?
725デフォルトの名無しさん
2021/08/18(水) 20:30:38.07ID:4eCzRIG7726デフォルトの名無しさん
2021/08/18(水) 20:47:56.15ID:e8CK2aK/727デフォルトの名無しさん
2021/08/18(水) 21:38:07.08ID:KGSse8GZ 違いをわかりやすく示すと
let vec0 = vec![1, 2, 3, 4, 5, 6];
assert_eq!(Some(&1), vec0.iter().next());
assert_eq!(Some(1), vec0.into_iter().next());
let vec0 = vec![1, 2, 3, 4, 5, 6];
assert_eq!(Some(&1), vec0.iter().next());
assert_eq!(Some(1), vec0.into_iter().next());
728デフォルトの名無しさん
2021/08/18(水) 21:41:22.71ID:e8CK2aK/ ありがとうありがとう
&TのイテレータとTのイテレータが別々になっているとはおもわなんだ
&TのイテレータとTのイテレータが別々になっているとはおもわなんだ
729デフォルトの名無しさん
2021/08/18(水) 21:54:22.03ID:8n3xPETQ まだ慣れてないからideに言われるがままに直してるな、、
730デフォルトの名無しさん
2021/08/18(水) 22:38:04.93ID:ErZJGc/A イテレータ回りはこのスライドが良いと思ったけど多少基礎知識ないときついかもしれんな
https://speakerdeck.com/optim/domination-of-the-rust-iterators
https://speakerdeck.com/optim/domination-of-the-rust-iterators
731デフォルトの名無しさん
2021/08/18(水) 23:13:44.45ID:KGSse8GZ >>728
そう考えるよりもムーブor借用と捉えるほうがいいかな
vec0.into_iter()だとムーブになるから値そのものが次々と来る。しかしその後にvec0は使えない。
vec0.iter()だと借用になるから値への参照が次々と来る。その後もvec0は使える。
(&vec0).into_iter()でも借用になるから値への参照が次々と来る。その後もvec0は使える。
そう考えるよりもムーブor借用と捉えるほうがいいかな
vec0.into_iter()だとムーブになるから値そのものが次々と来る。しかしその後にvec0は使えない。
vec0.iter()だと借用になるから値への参照が次々と来る。その後もvec0は使える。
(&vec0).into_iter()でも借用になるから値への参照が次々と来る。その後もvec0は使える。
732デフォルトの名無しさん
2021/08/19(木) 02:05:43.13ID:58T7qCMn733はちみつ餃子 ◆8X2XSCHEME
2021/08/19(木) 02:52:20.85ID:z/GAGLjl >>732
これは例がよくないな。
もう一段ほど関数呼出しを挟む構造になっていればより分かり易くなる気がする。
? 演算子はエラーだったときにそのエラー値を返り値として return する。
つまりその例の場合は do_something_that_might_fail が
エラー値を返したときは main から抜ける。
関数がエラーを出したときに上位にもエラーとして伝播させる機能。
unwrap は Result を剥がすが、エラー値だったときにはその場で panic する。
unwrap を書くというのは「エラー値が返されることはないことをプログラマとして保証する」
または「そのエラーに対して対処する方法はない、対処する気はない」という表明で、
assert 的な意味合いを含む。
エラーの対処を書くのが面倒だけど Result を剥がして型は合わせないといけない
というときに雑に unwrap することはあるんだけど、
多少なりとも汎用的なライブラリにするなら (事前条件が正しい限り) panic が
起こるのは好ましくはないので使い方は慎重に。
これは例がよくないな。
もう一段ほど関数呼出しを挟む構造になっていればより分かり易くなる気がする。
? 演算子はエラーだったときにそのエラー値を返り値として return する。
つまりその例の場合は do_something_that_might_fail が
エラー値を返したときは main から抜ける。
関数がエラーを出したときに上位にもエラーとして伝播させる機能。
unwrap は Result を剥がすが、エラー値だったときにはその場で panic する。
unwrap を書くというのは「エラー値が返されることはないことをプログラマとして保証する」
または「そのエラーに対して対処する方法はない、対処する気はない」という表明で、
assert 的な意味合いを含む。
エラーの対処を書くのが面倒だけど Result を剥がして型は合わせないといけない
というときに雑に unwrap することはあるんだけど、
多少なりとも汎用的なライブラリにするなら (事前条件が正しい限り) panic が
起こるのは好ましくはないので使い方は慎重に。
734デフォルトの名無しさん
2021/08/19(木) 03:04:22.69ID:KOsZ1Iay >>732
?演算子はほぼtry!マクロのsyntax sugar
言語自体に組み込んだ時にその適用範囲を広げた
try!マクロとは見やすく省略して書くと
Result型rに対してはtry!(r)がほぼmatch r { Ok(n) => n, Err(e) => return Err(e) }となる
つまり?演算子はOption型やResult型の尻につけてNoneやErrの時にreturnする
一方でunwrapはpanicして死ぬ
?演算子はほぼtry!マクロのsyntax sugar
言語自体に組み込んだ時にその適用範囲を広げた
try!マクロとは見やすく省略して書くと
Result型rに対してはtry!(r)がほぼmatch r { Ok(n) => n, Err(e) => return Err(e) }となる
つまり?演算子はOption型やResult型の尻につけてNoneやErrの時にreturnする
一方でunwrapはpanicして死ぬ
735デフォルトの名無しさん
2021/08/19(木) 06:51:23.03ID:3IqCrn23 ほぉ、なるへそ
noneとかへの振る舞いの遅延行為としての?op
ある関数を呼んだ関数自体でerrへの振る舞い決定すべきだと考えた場合は?opにする
とすると?op含んだ関数のcallerはmatchとかのタイプ別振る舞い定義をちょっとやかましめ書く必要ありだな
いまいちpanicの振る舞いが分からん
spawned threadが内部でパニくった場合その娘、息子スレッド(スレッドの下層スレッド)とそのスレッド自体にのみunwindが適用されるんだよな?(´・ω・`)
noneとかへの振る舞いの遅延行為としての?op
ある関数を呼んだ関数自体でerrへの振る舞い決定すべきだと考えた場合は?opにする
とすると?op含んだ関数のcallerはmatchとかのタイプ別振る舞い定義をちょっとやかましめ書く必要ありだな
いまいちpanicの振る舞いが分からん
spawned threadが内部でパニくった場合その娘、息子スレッド(スレッドの下層スレッド)とそのスレッド自体にのみunwindが適用されるんだよな?(´・ω・`)
736デフォルトの名無しさん
2021/08/19(木) 08:14:51.20ID:1vsNr98D 何でやねん(笑)
737デフォルトの名無しさん
2021/08/19(木) 12:31:22.21ID:vGJ7k9jZ vec0.iter().filter(|&x| x == &1);
これの数字に&つけて型同じにしたら通るってのが納得できないな〜
比較がプリミティブ型の変数同士だったら自動的に数値として扱って欲しい
これの数字に&つけて型同じにしたら通るってのが納得できないな〜
比較がプリミティブ型の変数同士だったら自動的に数値として扱って欲しい
738デフォルトの名無しさん
2021/08/19(木) 13:09:24.52ID:5RRw/fpd >>737
それは強い静的型付けのメリット
異なる型同士の==が通るのは困る
といいたいところだけど
PartialEqトレイト次第で異なる型でも==してくれる場合もある
文字列など
でも整数は厳密でi32とi16ですら不許可
それは強い静的型付けのメリット
異なる型同士の==が通るのは困る
といいたいところだけど
PartialEqトレイト次第で異なる型でも==してくれる場合もある
文字列など
でも整数は厳密でi32とi16ですら不許可
739デフォルトの名無しさん
2021/08/19(木) 13:34:53.71ID:vGJ7k9jZ741デフォルトの名無しさん
2021/08/19(木) 14:53:02.41ID:qnkUxlpG &i32 + i32 の計算ができるようAddトレイトで実装されていて、結果をi32で返すようになってるからエラーにならないってことでしょ?
742デフォルトの名無しさん
2021/08/19(木) 14:59:15.22ID:OmSSsNQv >>741
そのとぉーり!
そのとぉーり!
743デフォルトの名無しさん
2021/08/19(木) 15:34:51.11ID:SriMwJau >>741
ご丁寧にi32+i32 i32+&i32 &i32+i32 &i32+&i32の4種類をカバーしてくれてるね
&&i32はサポートしていないため
vec0.iter().filter(|x| x+1==2)はコンパイルエラー
ご丁寧にi32+i32 i32+&i32 &i32+i32 &i32+&i32の4種類をカバーしてくれてるね
&&i32はサポートしていないため
vec0.iter().filter(|x| x+1==2)はコンパイルエラー
744デフォルトの名無しさん
2021/08/19(木) 16:37:43.70ID:gHMNbMrQ745デフォルトの名無しさん
2021/08/19(木) 16:44:47.80ID:hQY8lbBV746デフォルトの名無しさん
2021/08/19(木) 17:44:32.43ID:t/I60tUF そりゃ当たり前だろw
とことんダメなやつだな
とことんダメなやつだな
748デフォルトの名無しさん
2021/08/19(木) 21:41:29.08ID:vGJ7k9jZ749デフォルトの名無しさん
2021/08/19(木) 22:05:30.35ID:RF3Q0l8Y750デフォルトの名無しさん
2021/08/19(木) 22:29:20.97ID:c562wt5h String と &str が == で比較できるなら i32 と &i32 も比較できて良い気はする
単に impl がないだけだから pull req 送ったら取り込んで貰えるのでは
単に impl がないだけだから pull req 送ったら取り込んで貰えるのでは
751デフォルトの名無しさん
2021/08/19(木) 22:55:59.39ID:vGJ7k9jZ もう純粋に&1て、1の参照じゃんね
その意味がわからんし、存在意義がわからん
変数同士ならわかるけど、定数的に書いてるんだったらもうプリミティブ型だったら
中身で判断してくれよヽ(`Д´)ノウワァァァン
その意味がわからんし、存在意義がわからん
変数同士ならわかるけど、定数的に書いてるんだったらもうプリミティブ型だったら
中身で判断してくれよヽ(`Д´)ノウワァァァン
752デフォルトの名無しさん
2021/08/19(木) 23:28:13.13ID:2mmZi2HD753デフォルトの名無しさん
2021/08/19(木) 23:48:19.67ID:k/U3ouxt >>751
プリミティブのwrapper crateを作って自分の好きなように定義すれば万事解決
プリミティブのwrapper crateを作って自分の好きなように定義すれば万事解決
754デフォルトの名無しさん
2021/08/19(木) 23:58:39.37ID:A1SUdzrU そういや&1みたいなのって実際に使う場面あるの?
755デフォルトの名無しさん
2021/08/20(金) 00:03:22.90ID:o+L+NM8T 推奨する方法をやりやすく、推奨しない方法をやりにくく
Rustは他の言語に比べると特に後者についてよく考えられてる
Rustは他の言語に比べると特に後者についてよく考えられてる
756デフォルトの名無しさん
2021/08/20(金) 00:07:53.98ID:iQK+FWFq >>754
postgresクレートのquery()でparamsに数字を書きたいときとか
pub fn query<T>(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<Vec<Row>, Error>
where
T: ?Sized + ToStatement
postgresクレートのquery()でparamsに数字を書きたいときとか
pub fn query<T>(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<Vec<Row>, Error>
where
T: ?Sized + ToStatement
757デフォルトの名無しさん
2021/08/20(金) 01:09:30.92ID:W7hoDzmL >>752
*x == 1 と書けというのは分かるんだけど
impl PartialEq<String> for &str や impl Add<&i32> for i32 があるのに
impl PartialEq<&i32> for i32がないのは一貫性がないように思う
なんで実装されていないのだろうか
*x == 1 と書けというのは分かるんだけど
impl PartialEq<String> for &str や impl Add<&i32> for i32 があるのに
impl PartialEq<&i32> for i32がないのは一貫性がないように思う
なんで実装されていないのだろうか
758デフォルトの名無しさん
2021/08/20(金) 01:11:40.00ID:W7hoDzmL759デフォルトの名無しさん
2021/08/20(金) 01:12:10.07ID:hEbF/PXF rubyもpythonも見よう見まねで書けるんだけどなー
javaなんてC++とほとんど同じだから半日もあればマスターできる
でもrustだけは勉強しないと無理っぽい
難しいよ
javaなんてC++とほとんど同じだから半日もあればマスターできる
でもrustだけは勉強しないと無理っぽい
難しいよ
760デフォルトの名無しさん
2021/08/20(金) 01:34:49.41ID:qcewwL/9 >>757
実は整数と文字列ではそこの逆転現象が起きていて
Stringと&strの等号比較はOK
assert!("xyz".to_string() == "xyz")
しかしStringをmatch文でアームに&strだとコンパイル型エラーでNG
// assert!(match "xyz".to_string() { "xyz" => true, _ => false, });
&i32とi32の等号比較はコンパイル型エラーでNG
// assert!(&123 == 123);
しかし&i32をmatch文でアームにi32だと比較OK
assert!(match &123 { 123 => true, _ => false, });
実は整数と文字列ではそこの逆転現象が起きていて
Stringと&strの等号比較はOK
assert!("xyz".to_string() == "xyz")
しかしStringをmatch文でアームに&strだとコンパイル型エラーでNG
// assert!(match "xyz".to_string() { "xyz" => true, _ => false, });
&i32とi32の等号比較はコンパイル型エラーでNG
// assert!(&123 == 123);
しかし&i32をmatch文でアームにi32だと比較OK
assert!(match &123 { 123 => true, _ => false, });
761デフォルトの名無しさん
2021/08/20(金) 01:38:48.16ID:omEK/Sui オブジェクトの同一性 (メモリ上の同一の場所に配置されている) を判定したいときって
参照を == で比較しても駄目ですよね?
ポインタを取り出すのも恰好が悪いように思うんですが、
なんか定番の方法ってあります?
参照を == で比較しても駄目ですよね?
ポインタを取り出すのも恰好が悪いように思うんですが、
なんか定番の方法ってあります?
762デフォルトの名無しさん
2021/08/20(金) 01:44:35.28ID:qcewwL/9 >>754
消費(ムーブ)せずに参照で済ませるためにiter()を使うと当然 &1 が出てくる
let vec0 = vec![1, 2, 3, 4, 5, 6];
assert_eq!(Some(&1), vec0.iter().next());
assert_eq!(Some(1), vec0.into_iter().next());
これはVecだから消費するinto_iter()が使えば 1 に出来るけど
スライスだと消費という概念がないから必ず &1 が出てきてしまう
消費(ムーブ)せずに参照で済ませるためにiter()を使うと当然 &1 が出てくる
let vec0 = vec![1, 2, 3, 4, 5, 6];
assert_eq!(Some(&1), vec0.iter().next());
assert_eq!(Some(1), vec0.into_iter().next());
これはVecだから消費するinto_iter()が使えば 1 に出来るけど
スライスだと消費という概念がないから必ず &1 が出てきてしまう
763デフォルトの名無しさん
2021/08/20(金) 01:55:55.02ID:jENR+46K764デフォルトの名無しさん
2021/08/20(金) 02:30:09.57ID:qcewwL/9 こういうことかな
複数の参照もmut参照も生ポインタも当然すべて同じアドレスを指している
let mut i = 123;
let pi1 = &i;
let pi2 = &i;
println!("{:p}", pi1); // 0x7fffebf915a4
println!("{:p}", pi2); // 0x7fffebf915a4
let pi3 = &mut i;
println!("{:p}", pi3); // 0x7fffebf915a4
let rpi3r = pi3 as *mut i32; // 生ポインタ
println!("{:p}", rpi3); // 0x7fffebf915a4
生ポインタを使って書き換えると元の変数が書き換わるので確かにこれは変数の格納アドレス
unsafe {
println!("{}", *rpi3); // 123
*rpi3 = 456;
}
println!("{}", i); // 456
複数の参照もmut参照も生ポインタも当然すべて同じアドレスを指している
let mut i = 123;
let pi1 = &i;
let pi2 = &i;
println!("{:p}", pi1); // 0x7fffebf915a4
println!("{:p}", pi2); // 0x7fffebf915a4
let pi3 = &mut i;
println!("{:p}", pi3); // 0x7fffebf915a4
let rpi3r = pi3 as *mut i32; // 生ポインタ
println!("{:p}", rpi3); // 0x7fffebf915a4
生ポインタを使って書き換えると元の変数が書き換わるので確かにこれは変数の格納アドレス
unsafe {
println!("{}", *rpi3); // 123
*rpi3 = 456;
}
println!("{}", i); // 456
765デフォルトの名無しさん
2021/08/20(金) 02:32:13.12ID:0J8On0UY ptr::eqで
766デフォルトの名無しさん
2021/08/20(金) 10:16:46.67ID:Z3M3k8Ob メンテナンス性最悪の自己満足オナニー言語
767デフォルトの名無しさん
2021/08/20(金) 11:41:07.99ID:0Iuc7w1s768デフォルトの名無しさん
2021/08/20(金) 13:42:55.60ID:ZqTwz4dI ポインタ関連の問題が所有権と参照で絶対に発生しないってのはデカイよね
769デフォルトの名無しさん
2021/08/20(金) 13:59:09.33ID:lR6AxyIv 将来の苦痛を先に解消できるのが良いのにな、不具合も絞り込みやすい
メンテナンス性悪いってどの辺言ってんのか聞いてみたい
メンテナンス性悪いってどの辺言ってんのか聞いてみたい
770デフォルトの名無しさん
2021/08/20(金) 14:18:54.33ID:nkJxp5PO 一年ぶりに触るソースを大規模改修しても、コンパイル通せばほぼ動く安心感ある
他言語(特に動的型言語)だと相当テストを作り込まない限り、このメンテナンス性は得られない印象
他言語(特に動的型言語)だと相当テストを作り込まない限り、このメンテナンス性は得られない印象
771デフォルトの名無しさん
2021/08/20(金) 14:28:37.40ID:y1HLeTwS データ設計を少し考えさせられることによって
メモリ安全性を得ただけでなく見通しも良くなったw
メモリ安全性を得ただけでなく見通しも良くなったw
772デフォルトの名無しさん
2021/08/20(金) 15:07:52.58ID:No4kn/Ah 潜在的にバグの原因となる変数の扱いすると
コンパイラが怒るのは安心できる
コンパイラが怒るのは安心できる
773デフォルトの名無しさん
2021/08/20(金) 15:24:51.42ID:W7hoDzmL >>768
絶対に発生しないは言い過ぎ
絶対に発生しないは言い過ぎ
774デフォルトの名無しさん
2021/08/20(金) 15:31:54.88ID:sJeXN42B 繰り返しでiter()を使ったりinto_iter()を使ったり、ループを使ったり、高階を使ったり。。
そして文字列が複数あったり、更にそれをマクロにされると、それで書き直しが必要だったり
多くの言語でも初心者と上級者で当然、コードの美麗さに違いが出るが余りにも差があり過ぎ
たった「一年ぶり」でコンパイルが通らない言語なんてあるだろうけど、そんな話じゃない
そして文字列が複数あったり、更にそれをマクロにされると、それで書き直しが必要だったり
多くの言語でも初心者と上級者で当然、コードの美麗さに違いが出るが余りにも差があり過ぎ
たった「一年ぶり」でコンパイルが通らない言語なんてあるだろうけど、そんな話じゃない
775デフォルトの名無しさん
2021/08/20(金) 16:06:16.17ID:c/gVhnyt イテレータなんてどの言語にもあるし困るようなことか?
無理やり導入で汚い言語よりもRustは綺麗に洗練されていて書きやすい
無理やり導入で汚い言語よりもRustは綺麗に洗練されていて書きやすい
776デフォルトの名無しさん
2021/08/20(金) 16:12:21.41ID:BL1Grv4c 同じようなことなのに人によって書き方が全然違うからクソって言いたいんじゃないの?
777デフォルトの名無しさん
2021/08/20(金) 17:10:02.79ID:H8grjHSU 何が何故問題なのか説明できないイチャモンなんかほっとけ
778デフォルトの名無しさん
2021/08/20(金) 20:06:41.30ID:W7hoDzmL 文字列が複数種類あることが嬉しい人のための言語
嬉しくない人は別の言語を使うべき
嬉しくない人は別の言語を使うべき
779デフォルトの名無しさん
2021/08/20(金) 20:28:27.92ID:TearUC8B >>778
例えばいわゆるスクリプト言語などはいずれもRustのString型相当のものしかないため非効率でメモリ食い散らかす状態になっていますね
Rustはそれに加えて部分を指し示すだけの文字列スライス&str型を持っているので無駄なアロケーションを防いで効率の良いコードを書けるようになっていますね
例えばいわゆるスクリプト言語などはいずれもRustのString型相当のものしかないため非効率でメモリ食い散らかす状態になっていますね
Rustはそれに加えて部分を指し示すだけの文字列スライス&str型を持っているので無駄なアロケーションを防いで効率の良いコードを書けるようになっていますね
780デフォルトの名無しさん
2021/08/20(金) 21:05:31.52ID:ma1oO0u7 >>774
> 繰り返しでiter()を使ったりinto_iter()を使ったり、ループを使ったり、高階を使ったり。
あなたはちょっと無知すぎます。
まず高階関数とも言われるmap()やfilter()等を用いるにはイテレータが必須ですから同じことを指しています。
どちらかを選ぶようなものではありません。
次にRustのforループもイテレータ必須で内部でイテレータを作ってforループを回していますから同じことです。
forループ方式と高階関数方式の2種類で書けてしまうじゃないか!と言いたいのでしょうが、これは他のプログラミング言語でも同じで2種類あります。
> 繰り返しでiter()を使ったりinto_iter()を使ったり、ループを使ったり、高階を使ったり。
あなたはちょっと無知すぎます。
まず高階関数とも言われるmap()やfilter()等を用いるにはイテレータが必須ですから同じことを指しています。
どちらかを選ぶようなものではありません。
次にRustのforループもイテレータ必須で内部でイテレータを作ってforループを回していますから同じことです。
forループ方式と高階関数方式の2種類で書けてしまうじゃないか!と言いたいのでしょうが、これは他のプログラミング言語でも同じで2種類あります。
781デフォルトの名無しさん
2021/08/20(金) 21:07:42.14ID:EDzGRqES 内包表記なる書き方がある言語もあるらしいねw
782デフォルトの名無しさん
2021/08/20(金) 21:38:29.08ID:6XnQ3Oqv 繰り返しでiter()を使ったりinto_iter()を使ったりと複数のやり方があるのはおかしいとの御指摘だが
into_iter()は値のイテレータ
iter()は参照のイテレータ
同じものに対して適用しても別のイテレータが得られる
into_iter()は値のイテレータ
iter()は参照のイテレータ
同じものに対して適用しても別のイテレータが得られる
783デフォルトの名無しさん
2021/08/20(金) 21:47:24.73ID:pKmgqbo7 少し前までは荒らし以外は結構いいスレだったが
近頃はC++スレでダベってた暇人たちが引っ越して来ちゃってゴミスレ化しつつあるね
近頃はC++スレでダベってた暇人たちが引っ越して来ちゃってゴミスレ化しつつあるね
784デフォルトの名無しさん
2021/08/20(金) 22:24:24.81ID:ZqTwz4dI >>782
これ、同じメソッドにするのではなくて、イテレータにするのはiter()で共通にして、
参照する場合には、別のメソッドにしたほうがいいんじゃないのかなと思う
例えば
iter() ← 値
iter().ref() ← 参照
とか
これ、同じメソッドにするのではなくて、イテレータにするのはiter()で共通にして、
参照する場合には、別のメソッドにしたほうがいいんじゃないのかなと思う
例えば
iter() ← 値
iter().ref() ← 参照
とか
785デフォルトの名無しさん
2021/08/20(金) 22:50:20.88ID:hEbF/PXF なんで配列にイテレータないんや!
配列を使うな! vecを使えということなのか
そういえばC++でもvector使えとか言われてたな
もっと配列にも愛を!
ところでvecより配列の方がうれしいことってある?
実は配列いらない子なんじゃないかと思い始めた
配列を使うな! vecを使えということなのか
そういえばC++でもvector使えとか言われてたな
もっと配列にも愛を!
ところでvecより配列の方がうれしいことってある?
実は配列いらない子なんじゃないかと思い始めた
786デフォルトの名無しさん
2021/08/20(金) 23:02:42.83ID:Dd/EBaxX >>784
それはiterのシグネチャがメソッドチェーンするかどうかで変わってしまうから
今のRustの型システムでは表現不能だと思う
プログラマ視点でも、後続する関数呼び出しがその手前に影響するってのはかなりわかりにくいのでは?
それはiterのシグネチャがメソッドチェーンするかどうかで変わってしまうから
今のRustの型システムでは表現不能だと思う
プログラマ視点でも、後続する関数呼び出しがその手前に影響するってのはかなりわかりにくいのでは?
787デフォルトの名無しさん
2021/08/20(金) 23:22:41.88ID:tipMusVW >>785
スタックとかヒープとかアロケーションとか気にならない用途ならRust使わなくてもいいと思うの
スタックとかヒープとかアロケーションとか気にならない用途ならRust使わなくてもいいと思うの
788デフォルトの名無しさん
2021/08/20(金) 23:47:01.90ID:Omw4vOgK789デフォルトの名無しさん
2021/08/20(金) 23:47:19.51ID:iQK+FWFq >>785
> Rust 1.53からは配列型に対して直接IntoIteratorトレイトが実装されるようになり、配列をそのままループに使うことが出来るようになりました。
https://tech-blog.optim.co.jp/entry/2021/06/18/080000
> Rust 1.53からは配列型に対して直接IntoIteratorトレイトが実装されるようになり、配列をそのままループに使うことが出来るようになりました。
https://tech-blog.optim.co.jp/entry/2021/06/18/080000
790デフォルトの名無しさん
2021/08/20(金) 23:54:51.56ID:hEbF/PXF >>787
いやいや、もちろん配列との比較なんだから、アロケーションの発生しない処理の話だよ
スタックを気にするなら、むしろヒープに置いた方がいいし
(キャッシュミスヒットの話じゃなくて、スタックオーバーフローの話ね)
いやいや、もちろん配列との比較なんだから、アロケーションの発生しない処理の話だよ
スタックを気にするなら、むしろヒープに置いた方がいいし
(キャッシュミスヒットの話じゃなくて、スタックオーバーフローの話ね)
791デフォルトの名無しさん
2021/08/20(金) 23:55:03.84ID:Dd/EBaxX >>788
それだとinto_iterとは意味変わっちゃってるのでは
intoで元のコレクションのコピーが作られて、それをイテレートするってことでしょ?
コピーを作らず所有権を奪って値をイテレートする方法がなくなってしまう
それだとinto_iterとは意味変わっちゃってるのでは
intoで元のコレクションのコピーが作られて、それをイテレートするってことでしょ?
コピーを作らず所有権を奪って値をイテレートする方法がなくなってしまう
792デフォルトの名無しさん
2021/08/20(金) 23:56:59.11ID:hEbF/PXF793デフォルトの名無しさん
2021/08/21(土) 01:58:33.16ID:kcBD0DB/ >>784
iter().cloned() とか使えば良いのでは
iter().cloned() とか使えば良いのでは
794デフォルトの名無しさん
2021/08/21(土) 05:48:08.14ID:lXSuJ2vU hoge.iter()だと参照でhoge.iter().fuga()だとhogeの所有権ぶんどる、みたいなのは無理な気がする
795デフォルトの名無しさん
2021/08/21(土) 06:24:06.23ID:kvS3AY0X796デフォルトの名無しさん
2021/08/21(土) 09:34:58.66ID:v7gED8U+ >>791
Cow使えばできるという話じゃないよ
lazyに所有権を取得するような機能を持った型を追加すれば
今の型システムでも表現できないってことはないんじゃないかって話
そういう型を追加することを型システムの変更と言うのであれば
今の型システムでは表現できないてのに同意するよ
Cow使えばできるという話じゃないよ
lazyに所有権を取得するような機能を持った型を追加すれば
今の型システムでも表現できないってことはないんじゃないかって話
そういう型を追加することを型システムの変更と言うのであれば
今の型システムでは表現できないてのに同意するよ
797デフォルトの名無しさん
2021/08/21(土) 09:43:26.29ID:KTz5aeQ/ >>795
アロケーションが発生するのは伸長するときだけでしょ
伸長するような用途だったら、そもそも配列使えないし
>一方で配列は必ず固定長でスタックに置かれます
だめじゃん。スタックオーバーフロー考慮するならvecの方がいいじゃん
まあ、自分も組み込み以外でスタックフレームのサイズなんて考慮したことないけど
アロケーションが発生するのは伸長するときだけでしょ
伸長するような用途だったら、そもそも配列使えないし
>一方で配列は必ず固定長でスタックに置かれます
だめじゃん。スタックオーバーフロー考慮するならvecの方がいいじゃん
まあ、自分も組み込み以外でスタックフレームのサイズなんて考慮したことないけど
798デフォルトの名無しさん
2021/08/21(土) 09:50:40.59ID:KTz5aeQ/799デフォルトの名無しさん
2021/08/21(土) 10:08:08.47ID:/0ZvMIRv >>797
> アロケーションが発生するのは伸長するときだけでしょ
いいえ。
Vecの実体は必ずヒープにアロケーションされます。
Vec自体は(指定しなければ)スタック上で、ヒープへのポインタや長さなどで構成されて固定長です。
Stringも内部はVec<u8>なので同様です。
> アロケーションが発生するのは伸長するときだけでしょ
いいえ。
Vecの実体は必ずヒープにアロケーションされます。
Vec自体は(指定しなければ)スタック上で、ヒープへのポインタや長さなどで構成されて固定長です。
Stringも内部はVec<u8>なので同様です。
800デフォルトの名無しさん
2021/08/21(土) 10:12:53.88ID:KTz5aeQ/801デフォルトの名無しさん
2021/08/21(土) 10:22:22.66ID:HwKH2mPW802デフォルトの名無しさん
2021/08/21(土) 10:31:43.28ID:KTz5aeQ/ >>801
>Rustではガベージコレクションは起きない
ヒープを使ってるんだから起きないわけないだろ
>スタック上のデータはその関数を終える時に消滅する
Vecの中身だって関数を終えるときに解放されるでしょ
されないんだっけ?
そもそもの話は配列を使ってるところをVecにしても問題なくね?ってことなんだけど
どこが問題になるかの例を示してもらえたら、わかりやすい
>Rustではガベージコレクションは起きない
ヒープを使ってるんだから起きないわけないだろ
>スタック上のデータはその関数を終える時に消滅する
Vecの中身だって関数を終えるときに解放されるでしょ
されないんだっけ?
そもそもの話は配列を使ってるところをVecにしても問題なくね?ってことなんだけど
どこが問題になるかの例を示してもらえたら、わかりやすい
803デフォルトの名無しさん
2021/08/21(土) 10:58:14.92ID:Hi//C77Q rustにはガベージコレクションがないんだぜ・・・
804デフォルトの名無しさん
2021/08/21(土) 11:04:35.75ID:eqU3IJp1 デストラクタ的な機構で後始末するのはガベージコレクションとは普通言わない
805デフォルトの名無しさん
2021/08/21(土) 11:09:11.24ID:JLDZmydZ Cでもひーぷをつかうとがべーじこれくしょんがおきるの?
806デフォルトの名無しさん
2021/08/21(土) 11:11:34.22ID:6mCMrQuL ヒープへのメモリアロケーションはコストが高いから避けたいんでしょ
807デフォルトの名無しさん
2021/08/21(土) 11:25:28.41ID:ozkLLafu >>802
RustにGCはない
Vecの中身(配列相当部分)はスタック上ではなくヒープ上なので関数を終えるときに解放されない
Vec自体が消える時に解放される
Vec自体(ポインタと長さなど)はスタック上にあれば関数を終える時に消える
もちろんVec自体を関数の返り値として返すことは出来る
受け取った上位の関数でVecの中身を使える
例えば
fn main() {
let mut v: Vec<i32> = make_i32_vec_from_args();
v.push(999);
println!("{:?}", v);
}
fn make_i32_vec_from_args() -> Vec<i32> {
let mut v = Vec::new();
std::env::args().skip(1).map(|s| s.parse::<i32>().unwrap()).for_each(|n| v.push(n));
v
}
$ cargo run 111 222 333
[111, 222, 333, 999]
RustにGCはない
Vecの中身(配列相当部分)はスタック上ではなくヒープ上なので関数を終えるときに解放されない
Vec自体が消える時に解放される
Vec自体(ポインタと長さなど)はスタック上にあれば関数を終える時に消える
もちろんVec自体を関数の返り値として返すことは出来る
受け取った上位の関数でVecの中身を使える
例えば
fn main() {
let mut v: Vec<i32> = make_i32_vec_from_args();
v.push(999);
println!("{:?}", v);
}
fn make_i32_vec_from_args() -> Vec<i32> {
let mut v = Vec::new();
std::env::args().skip(1).map(|s| s.parse::<i32>().unwrap()).for_each(|n| v.push(n));
v
}
$ cargo run 111 222 333
[111, 222, 333, 999]
808デフォルトの名無しさん
2021/08/21(土) 11:42:53.96ID:3jqa2oM2 そういや何でalloca()無いの?
809デフォルトの名無しさん
2021/08/21(土) 12:23:12.36ID:kcBD0DB/ >>795
Box<[T; N]> のように配列がヒープに置かれる場合もある
Box<[T; N]> のように配列がヒープに置かれる場合もある
810デフォルトの名無しさん
2021/08/21(土) 12:35:23.13ID:5zDPvhJy >>809
それはBoxだからであって、そんなこと言い出したら整数だってヒープに置かれうる
しかし普通に「整数型はスタックに置かれる」と言われる時は、Boxを使わない場合を意味している
Boxを使えばヒープに置かれるのは自明だからだ
したがって、整数や配列やVecの管理データ部分はそのままだとスタックに置かれるがVecのデータ実体は常にヒープに置かれる、で良い
それはBoxだからであって、そんなこと言い出したら整数だってヒープに置かれうる
しかし普通に「整数型はスタックに置かれる」と言われる時は、Boxを使わない場合を意味している
Boxを使えばヒープに置かれるのは自明だからだ
したがって、整数や配列やVecの管理データ部分はそのままだとスタックに置かれるがVecのデータ実体は常にヒープに置かれる、で良い
811デフォルトの名無しさん
2021/08/21(土) 13:25:00.39ID:KTz5aeQ/ うーん、なんだかなー
みんなヒープのことを無限にバイトを吐き出す魔法の箱かなんかだと思ってない?
>>805
>Cでもひーぷをつかうとがべーじこれくしょんがおきるの?
当然
Cのmalloc/freeやC++のnew/deleteでもガベージコレクションは発生する
wikipediaの「ヒープ領域」がよくまとってるよ
いくつかの理由からfree/deleteのガベージコレクションはJavaやC#のガベージコレクションよりも超高速だ
それでも、組み込みの世界ではガベージコレクションのせいでリアルタイム性が失われることを嫌がって、
ヒープを使わなかったりする
じゃあ、組み込みでは動的なメモリをどうするかっていうと、リンクドリストのノードをメモリブロックに
見立てて、メモリ管理システムにしたりする
これだと取得も解放も定数時間のコストだからね
>>807
すまん、例をみてますます配列なくても困らない気がしてきた
配列でできて、Vecにできないことはないの?
みんなヒープのことを無限にバイトを吐き出す魔法の箱かなんかだと思ってない?
>>805
>Cでもひーぷをつかうとがべーじこれくしょんがおきるの?
当然
Cのmalloc/freeやC++のnew/deleteでもガベージコレクションは発生する
wikipediaの「ヒープ領域」がよくまとってるよ
いくつかの理由からfree/deleteのガベージコレクションはJavaやC#のガベージコレクションよりも超高速だ
それでも、組み込みの世界ではガベージコレクションのせいでリアルタイム性が失われることを嫌がって、
ヒープを使わなかったりする
じゃあ、組み込みでは動的なメモリをどうするかっていうと、リンクドリストのノードをメモリブロックに
見立てて、メモリ管理システムにしたりする
これだと取得も解放も定数時間のコストだからね
>>807
すまん、例をみてますます配列なくても困らない気がしてきた
配列でできて、Vecにできないことはないの?
812デフォルトの名無しさん
2021/08/21(土) 13:35:03.05ID:+9L1DmAB >>811
Rustにはガベージコレクションはありません
おっしゃる通りヒープからの取得も解放も定数時間のコストで行なわれ更にガベージが溜まることはありません
Rustでは生存期間や所有権に貸し借りが明白になっているため、使用中のものが解放されたり、解放済みが使われたり、使用済みが解放されなかったりは起きません
Rustにはガベージコレクションはありません
おっしゃる通りヒープからの取得も解放も定数時間のコストで行なわれ更にガベージが溜まることはありません
Rustでは生存期間や所有権に貸し借りが明白になっているため、使用中のものが解放されたり、解放済みが使われたり、使用済みが解放されなかったりは起きません
813デフォルトの名無しさん
2021/08/21(土) 13:50:09.86ID:KTz5aeQ/ >>812
>ヒープからの取得も解放も定数時間のコストで行なわれ
これってどういう原理? 本当に定数ならそれもうヒープじゃないんじゃ
ヒープツリーを辿る処理も未使用ノードを結合する処理も定数時間って
ありえないと思うんだけど
>ヒープからの取得も解放も定数時間のコストで行なわれ
これってどういう原理? 本当に定数ならそれもうヒープじゃないんじゃ
ヒープツリーを辿る処理も未使用ノードを結合する処理も定数時間って
ありえないと思うんだけど
814デフォルトの名無しさん
2021/08/21(土) 14:16:15.10ID:G8x/1s0B もしかしてmalloc/freeのヒープメモリ管理のことをこの人はガベージコレクションと呼んでいるのかも
そのためRustにガベージコレクションがないことを理解できていないような感じ?
そのためRustにガベージコレクションがないことを理解できていないような感じ?
815デフォルトの名無しさん
2021/08/21(土) 14:22:08.01ID:KTz5aeQ/ 調べた
・rustのヒープはフリーリストアロケータじゃない
(サイズごとのメモリスラブをさらに分割して使う)
・取得・解放は定数時間じゃない
(メモリスラブ全体が未使用になったときに、デフラグして別サイズのスラブとして利用可能になる)
→これ実質ガベージコレクション処理じゃん
・当然デフラグは発生するが、大して問題にならない
→そうだろうね。C++でさえアロケータ書いたことない
・問題になるならアロケータを自作することも可能(デフォルトはjemalloc)
だそうだ。
ヒープはヒープ構造じゃないのか……
・rustのヒープはフリーリストアロケータじゃない
(サイズごとのメモリスラブをさらに分割して使う)
・取得・解放は定数時間じゃない
(メモリスラブ全体が未使用になったときに、デフラグして別サイズのスラブとして利用可能になる)
→これ実質ガベージコレクション処理じゃん
・当然デフラグは発生するが、大して問題にならない
→そうだろうね。C++でさえアロケータ書いたことない
・問題になるならアロケータを自作することも可能(デフォルトはjemalloc)
だそうだ。
ヒープはヒープ構造じゃないのか……
816デフォルトの名無しさん
2021/08/21(土) 14:36:21.13ID:KTz5aeQ/ >>814
>もしかしてmalloc/freeのヒープメモリ管理のことをこの人はガベージコレクションと呼んでいるのかも
freeの中にもガベージコレクション処理があるんだよという話
javaと違ってマーク&スイープ処理いらないから早いけどね
>そのためRustにガベージコレクションがないことを理解できていないような感じ?
そんなことはわかってる
今は処理コストの話をしてる
サイズが変わらないVecと配列(配列なのでもちろん固定長)でそこまで優位の差があるのかと訊いた
そこでVecはヒープを使う(からダメだ)という答えが返ってきたので、
ヒープを使うとなぜダメなんだ? ガベージコレクションのオーバーヘッドを気にしてるのか?と
そうするとrustはガベージコレクションありませんと言われた
じゃあ、結局のところヒープを使うとなぜダメなんだ?
>もしかしてmalloc/freeのヒープメモリ管理のことをこの人はガベージコレクションと呼んでいるのかも
freeの中にもガベージコレクション処理があるんだよという話
javaと違ってマーク&スイープ処理いらないから早いけどね
>そのためRustにガベージコレクションがないことを理解できていないような感じ?
そんなことはわかってる
今は処理コストの話をしてる
サイズが変わらないVecと配列(配列なのでもちろん固定長)でそこまで優位の差があるのかと訊いた
そこでVecはヒープを使う(からダメだ)という答えが返ってきたので、
ヒープを使うとなぜダメなんだ? ガベージコレクションのオーバーヘッドを気にしてるのか?と
そうするとrustはガベージコレクションありませんと言われた
じゃあ、結局のところヒープを使うとなぜダメなんだ?
817デフォルトの名無しさん
2021/08/21(土) 14:43:58.08ID:3jqa2oM2 勝手に定義した「ガベージコレクション」なんか議論するだけ時間の無駄
818デフォルトの名無しさん
2021/08/21(土) 14:48:02.99ID:HlQuVij0819デフォルトの名無しさん
2021/08/21(土) 14:50:34.09ID:KTz5aeQ/ >>818
辞書が絶対とは言いたくないがwikipediaの「ヒープ領域」見て
辞書が絶対とは言いたくないがwikipediaの「ヒープ領域」見て
820デフォルトの名無しさん
2021/08/21(土) 14:52:48.65ID:Hi//C77Q 自分でfreeしたものをGCと呼ぶとは強者が現れたな
821デフォルトの名無しさん
2021/08/21(土) 14:53:06.41ID:O7+p4qIy それこそwikipediaの「ガベージコレクション」見てもらった方がいいのでは。
822デフォルトの名無しさん
2021/08/21(土) 14:53:37.02ID:6mCMrQuL もうジェマロクはデフォルトじゃないよ
823デフォルトの名無しさん
2021/08/21(土) 14:58:27.12ID:Hi//C77Q そういやこんな記事があったよ
実装言語を「Go」から「Rust」に変更、ゲーマー向けチャットアプリ「Discord」の課題とは
ttps://atmarkit.itmedia.co.jp/ait/articles/2002/10/news038.html
> 平均すれば高速に動作していたものの、数分ごとに平均応答時間が急に大きくなり、
> ユーザーエクスペリエンスを損なっていた。調査したところ、
> これはGoの中核機能であるメモリモデルとガベージコレクタ(GC)に起因することが分かった。
> Rustではガベージコレクションが不要だ。
> 同社がRead StatesサービスをRustで実装しようと考えたのはこれが理由だ。
> Rustを使えば、Goで実装した場合に生じた平均応答時間の急増は見られないだろう。
実装言語を「Go」から「Rust」に変更、ゲーマー向けチャットアプリ「Discord」の課題とは
ttps://atmarkit.itmedia.co.jp/ait/articles/2002/10/news038.html
> 平均すれば高速に動作していたものの、数分ごとに平均応答時間が急に大きくなり、
> ユーザーエクスペリエンスを損なっていた。調査したところ、
> これはGoの中核機能であるメモリモデルとガベージコレクタ(GC)に起因することが分かった。
> Rustではガベージコレクションが不要だ。
> 同社がRead StatesサービスをRustで実装しようと考えたのはこれが理由だ。
> Rustを使えば、Goで実装した場合に生じた平均応答時間の急増は見られないだろう。
824デフォルトの名無しさん
2021/08/21(土) 15:02:21.85ID:KTz5aeQ/825デフォルトの名無しさん
2021/08/21(土) 15:02:56.01ID:watXYiN6 >>819
https://ja.wikipedia.org/wiki/%E3%83%8E%E3%83%BC%E3%83%88:%E3%83%92%E3%83%BC%E3%83%97%E9%A0%98%E5%9F%9F
> 7月15日(土)12:22の版で記述いただいた内容のうち、「ガベージコレクション」という部分だけ誤りと思われるので、7月19日(水)02:32の版で消させていただきました
せやな。
https://ja.wikipedia.org/wiki/%E3%83%8E%E3%83%BC%E3%83%88:%E3%83%92%E3%83%BC%E3%83%97%E9%A0%98%E5%9F%9F
> 7月15日(土)12:22の版で記述いただいた内容のうち、「ガベージコレクション」という部分だけ誤りと思われるので、7月19日(水)02:32の版で消させていただきました
せやな。
826デフォルトの名無しさん
2021/08/21(土) 15:10:24.32ID:hSZ/tOwO >>824
まずはプログラミング言語におけるガベージコレクションとは何かを理解して
次にRustではそのガベージコレクションがないことを理解して
その上で何を質問したいのかを整理してはいかがでしょうか?
それを終えてからでないとあなただけ用語の定義が異なったままでは話が進みません
まずはプログラミング言語におけるガベージコレクションとは何かを理解して
次にRustではそのガベージコレクションがないことを理解して
その上で何を質問したいのかを整理してはいかがでしょうか?
それを終えてからでないとあなただけ用語の定義が異なったままでは話が進みません
827デフォルトの名無しさん
2021/08/21(土) 15:10:57.04ID:IZ1Oj5x4 ガベコレは普通javaとかpyのコンパイラやらインタプリタがreference counterをオブジェクトに勝手に付随させる事を想定するけどな
Vec arr処理コストの違いに関してはbuffer使わないんだからarrayの方が基本的には糞みたいに早いと思うがな
そこらosとかによって最適化図られるからオブジェクト生成のとき以外は決定的な違いあんまなさそうだが
要素数をコンパイルタイムに決定(これのアルゴにもよるが)出来るなら普通はシンプル配列の方が速いよね
goはparallel threadingみたいな部分で変なgc実装してて大量に独立の計算量ハード問題導入するからねそこらへんがドイヒーなんだろうな
俺は好きだけど(´・ω・`)
Vec arr処理コストの違いに関してはbuffer使わないんだからarrayの方が基本的には糞みたいに早いと思うがな
そこらosとかによって最適化図られるからオブジェクト生成のとき以外は決定的な違いあんまなさそうだが
要素数をコンパイルタイムに決定(これのアルゴにもよるが)出来るなら普通はシンプル配列の方が速いよね
goはparallel threadingみたいな部分で変なgc実装してて大量に独立の計算量ハード問題導入するからねそこらへんがドイヒーなんだろうな
俺は好きだけど(´・ω・`)
828デフォルトの名無しさん
2021/08/21(土) 16:18:04.16ID:iwjgeVKb829デフォルトの名無しさん
2021/08/21(土) 16:29:59.01ID:0b1Dm8dh コンパクションとガベージコレクションの区別がついてない
世の中のガベージコレクターがコンパクションもやってるからといって
コンパクションのみを指してガベージコレクションとは呼ばない
世の中のガベージコレクターがコンパクションもやってるからといって
コンパクションのみを指してガベージコレクションとは呼ばない
830デフォルトの名無しさん
2021/08/21(土) 16:33:27.85ID:Ay6lvOn8 ふりだしに戻る >>787
831デフォルトの名無しさん
2021/08/21(土) 16:37:39.49ID:KTz5aeQ/ >>828
それの何が問題?
stringの実装はヒープだけど問題ないよね?
こういう使い方をすると配列より100倍くらい遅いとか、メモリリークするからVec止めて配列使えとか
そういう注意点ある?
もちろんループの中でVec::newするとオーバーヘッドでかいとか、
そういうわざとらしいのはなしにして
あえていうなら初期化の記述量がちょっと増える、とか?
それの何が問題?
stringの実装はヒープだけど問題ないよね?
こういう使い方をすると配列より100倍くらい遅いとか、メモリリークするからVec止めて配列使えとか
そういう注意点ある?
もちろんループの中でVec::newするとオーバーヘッドでかいとか、
そういうわざとらしいのはなしにして
あえていうなら初期化の記述量がちょっと増える、とか?
832デフォルトの名無しさん
2021/08/21(土) 16:59:15.86ID:dJkGQ7Qm833デフォルトの名無しさん
2021/08/21(土) 17:06:03.36ID:Hi//C77Q >>829
HDDの頃はよく使ってたHDD最適化と容量を増やすみたいなソフトを思い出した
HDDのデフラグ → メモリコンパクション
HDDにある不要なキャッシュの削除 → ガベージコレクション
こんな感じに似てるな
HDDの頃はよく使ってたHDD最適化と容量を増やすみたいなソフトを思い出した
HDDのデフラグ → メモリコンパクション
HDDにある不要なキャッシュの削除 → ガベージコレクション
こんな感じに似てるな
834デフォルトの名無しさん
2021/08/21(土) 17:16:16.64ID:eqU3IJp1 ヒープがヒープ構造じゃないのかとか言ってるから本当に何も知らなかったのだろう
オレオレ用語使われると混乱するからとりあえずmalloc動画くらいみて勉強してきてほしい
オレオレ用語使われると混乱するからとりあえずmalloc動画くらいみて勉強してきてほしい
835デフォルトの名無しさん
2021/08/21(土) 17:26:30.08ID:KTz5aeQ/836デフォルトの名無しさん
2021/08/21(土) 17:30:07.73ID:pF+sRbnf837デフォルトの名無しさん
2021/08/21(土) 17:31:33.62ID:KTz5aeQ/ >>836
そうなの? じゃあ結論として配列はVecに置き換えても問題ないってこと?
そうなの? じゃあ結論として配列はVecに置き換えても問題ないってこと?
838デフォルトの名無しさん
2021/08/21(土) 17:52:04.92ID:eqU3IJp1 Vecは固定長配列(型[u8; 32]とかで表されるやつ)を置き換える用途としては使えないが, 逆に言えばそれだけ
839デフォルトの名無しさん
2021/08/21(土) 18:26:53.45ID:Hi//C77Q むしろ配列なんてクレート使わないとコンパイル時点で数値が決まってないと使えないから
ほとんど出番がないんだから、どこに悩む必要があるというのか
ほとんど出番がないんだから、どこに悩む必要があるというのか
840デフォルトの名無しさん
2021/08/21(土) 18:30:22.30ID:AgJApIsV >>835
>Vecはヒープ使ってるからダメって言われて、何がダメか説明してくれって言ってるだけなんだけどなー
あなたの妄想ではないですか?
スレを読みましたが、
Vecはヒープ使ってるからダメと言われた書き込みが見当たりません。
>Vecはヒープ使ってるからダメって言われて、何がダメか説明してくれって言ってるだけなんだけどなー
あなたの妄想ではないですか?
スレを読みましたが、
Vecはヒープ使ってるからダメと言われた書き込みが見当たりません。
841デフォルトの名無しさん
2021/08/21(土) 18:31:04.95ID:3jqa2oM2 ヒープは悪であるということをハッキリと言う
842デフォルトの名無しさん
2021/08/21(土) 18:41:19.82ID:tswurJ+7 Linux のデフォルトではスタックの大きさは 8 メガが上限じゃなかったっけ?
(Windows だともっと小さかったはず)
大きさが固定 (コンパイル時に確定する) でかつ十分に小さく寿命が短いなら配列をスタックにおく
のは性能的に有利 (確保と解放のコストが小さい) だが、大きさを見積もれないときにスタックに置くと
スタックが足りないときにどうにもできないで即死するしかない。
大きさのわからない配列はスタックに置くべきではないというのが世の常識というもの。
少なくとも高レイヤのアプリケーションでは。
(Windows だともっと小さかったはず)
大きさが固定 (コンパイル時に確定する) でかつ十分に小さく寿命が短いなら配列をスタックにおく
のは性能的に有利 (確保と解放のコストが小さい) だが、大きさを見積もれないときにスタックに置くと
スタックが足りないときにどうにもできないで即死するしかない。
大きさのわからない配列はスタックに置くべきではないというのが世の常識というもの。
少なくとも高レイヤのアプリケーションでは。
843デフォルトの名無しさん
2021/08/21(土) 20:16:15.20ID:3jqa2oM2 仮想メモリなんだからスタック8GBに設定すればいいんじゃないの?
844デフォルトの名無しさん
2021/08/21(土) 20:43:23.20ID:7GAoG1Iq Rustのメモリ安全性はボローチェッカーによって担保されているが、
Nimと比較してRustはタイプ量が多い事により限りなく低い生産性と
C++のような高い難読性、超巨大なバイナリ生成性能を兼ね備えています
Nimはバージョン1.5.1でRustのボローチェッカーに似た「View types」が実装されれば、
GC無しでView types参照の有効性を検証することによってメモリ安全性を保証しつつ
限りなく抑え込まれたタイプ量で高速化したCのソースコードを吐き出せます
Nimソースコード ==nimコンパイラ==> Cソースコード ==Cコンパイラ==> バイナリ
なので、nimコンパイラが通った時点でメモリ安全性が担保されませんか?
Nimの実験的特徴
著者: アンドレアス・ルンプ
バージョン: 1.5.1
http://nim-lang.github.io/Nim/manual_experimental.html
Nimは限りなく抑え込まれたタイプ量で高い生産性とPythonのような高い可読性を実現し
ているにもかかわらず、Cのソースコードを吐き出せるのでC言語でリモートワークされ
ている方は割り振られた仕事が早く終わっても終わってないふりをして怠けることができる
「怠け者とはこうあるべきだ!」と言うとても大事な事を Nim は我々に教えてくれます
Nimと比較してRustはタイプ量が多い事により限りなく低い生産性と
C++のような高い難読性、超巨大なバイナリ生成性能を兼ね備えています
Nimはバージョン1.5.1でRustのボローチェッカーに似た「View types」が実装されれば、
GC無しでView types参照の有効性を検証することによってメモリ安全性を保証しつつ
限りなく抑え込まれたタイプ量で高速化したCのソースコードを吐き出せます
Nimソースコード ==nimコンパイラ==> Cソースコード ==Cコンパイラ==> バイナリ
なので、nimコンパイラが通った時点でメモリ安全性が担保されませんか?
Nimの実験的特徴
著者: アンドレアス・ルンプ
バージョン: 1.5.1
http://nim-lang.github.io/Nim/manual_experimental.html
Nimは限りなく抑え込まれたタイプ量で高い生産性とPythonのような高い可読性を実現し
ているにもかかわらず、Cのソースコードを吐き出せるのでC言語でリモートワークされ
ている方は割り振られた仕事が早く終わっても終わってないふりをして怠けることができる
「怠け者とはこうあるべきだ!」と言うとても大事な事を Nim は我々に教えてくれます
845デフォルトの名無しさん
2021/08/21(土) 20:47:51.35ID:6mCMrQuL Nimは知らんがパイソンが読みやすいなんて
846デフォルトの名無しさん
2021/08/21(土) 20:53:42.26ID:Z4f8T8IW pythonが特別読みやすいとは思わんが、pythonで読みづらいコード書くやつが
何で実装しても読みやすいものを書くことはないだろう。
何で実装しても読みやすいものを書くことはないだろう。
847デフォルトの名無しさん
2021/08/21(土) 20:55:25.62ID:6DBrqemS >>844
Pythonはたまたま外部ライブラリ充実などで普及していますが、あまりよろしくない言語です。
そのためPythonで開発したいという人はいないです。
なので「Pythonのような高い可読性を実現している」と宣伝されても逆効果。
Pythonはたまたま外部ライブラリ充実などで普及していますが、あまりよろしくない言語です。
そのためPythonで開発したいという人はいないです。
なので「Pythonのような高い可読性を実現している」と宣伝されても逆効果。
848デフォルトの名無しさん
2021/08/21(土) 20:58:33.68ID:O7+p4qIy >>844の人は関係ないスレに迷惑かけて、nimユーザーのイメージダウンが目的なんだろうか。
849デフォルトの名無しさん
2021/08/21(土) 21:35:33.43ID:PyG7lKVy 積極的にPython使おうとは思わんなぁ。インタプリタ系はRuby使っているわ
Luaも結構良い感じだと思う
Luaも結構良い感じだと思う
850デフォルトの名無しさん
2021/08/21(土) 21:54:02.20ID:tswurJ+7 うん。 プログラマは Python をそんなに気に入ってない場合は多いと思う。
ただ現代ではプログラミングするのはプログラマとは限らない。
Python は元々はコンポーネントを組み合わせる、いわゆるグルー言語として設計されていて、
エンドユーザ向けの性質を持っている。 BASIC 系と似た立場かな。
このくらいに制限されていたほうがかえって使いやすいという場合は確かにある。
必要なコンポーネントが出そろっている状況で上位のロジックを組み立てる分には
Python も便利なこともあるにせよ、言語としての出来はそんなに良くない。
ただ現代ではプログラミングするのはプログラマとは限らない。
Python は元々はコンポーネントを組み合わせる、いわゆるグルー言語として設計されていて、
エンドユーザ向けの性質を持っている。 BASIC 系と似た立場かな。
このくらいに制限されていたほうがかえって使いやすいという場合は確かにある。
必要なコンポーネントが出そろっている状況で上位のロジックを組み立てる分には
Python も便利なこともあるにせよ、言語としての出来はそんなに良くない。
851デフォルトの名無しさん
2021/08/21(土) 21:59:07.63ID:7GAoG1Iq >>845
>Nimは知らんがパイソンが読みやすいなんて
Pythonは構文にインデントを組み込むことによってざっと眺めた時に人間が読みやすい
一般的には上記の事をPythonは高い可読性があると表現されています
この事は「Pythonは可読性の高い言語」ググれば約 265,000 件出てきます
他の言語と可読性は同じだろって意見の人もいますが少数派ですね
>Nimは知らんがパイソンが読みやすいなんて
Pythonは構文にインデントを組み込むことによってざっと眺めた時に人間が読みやすい
一般的には上記の事をPythonは高い可読性があると表現されています
この事は「Pythonは可読性の高い言語」ググれば約 265,000 件出てきます
他の言語と可読性は同じだろって意見の人もいますが少数派ですね
852ハノン ◆QZaw55cn4c
2021/08/21(土) 22:21:31.89 >>851
https://mevius.5ch.net/test/read.cgi/tech/1587276362/963
「javascriptは可読性の高い言語」で検索すると約 334,000 件
https://mevius.5ch.net/test/read.cgi/tech/1587276362/963
「javascriptは可読性の高い言語」で検索すると約 334,000 件
853デフォルトの名無しさん
2021/08/21(土) 22:31:37.65ID:7PPLxZL+ 元の文脈的に
nimも構文にインデントを組み込んでるからpythonが出てきただけでそういう議論がしたいんじゃないと思う
nimも構文にインデントを組み込んでるからpythonが出てきただけでそういう議論がしたいんじゃないと思う
854デフォルトの名無しさん
2021/08/21(土) 22:36:10.82ID:7GAoG1Iq >>852
>「javascriptは可読性の高い言語」で検索すると約 334,000 件
単に検索件数が多いだけで、上位10件の表示内容を読んでも
「javascriptは可読性の高い言語」と言う内容のページは1つも見つかりません
対して「Pythonは可読性の高い言語」は上位10件の内5件見つかりました
>「javascriptは可読性の高い言語」で検索すると約 334,000 件
単に検索件数が多いだけで、上位10件の表示内容を読んでも
「javascriptは可読性の高い言語」と言う内容のページは1つも見つかりません
対して「Pythonは可読性の高い言語」は上位10件の内5件見つかりました
855デフォルトの名無しさん
2021/08/21(土) 22:41:14.03ID:7GAoG1Iq >>853
おっしゃる通りです(/ω\)
おっしゃる通りです(/ω\)
856デフォルトの名無しさん
2021/08/21(土) 22:56:47.50ID:lXSuJ2vU ただのコピペ荒らし
まったくRustもNimも関係ないスレでも見るし
まったくRustもNimも関係ないスレでも見るし
857デフォルトの名無しさん
2021/08/21(土) 23:00:47.35ID:YSvCkW+D Rust Tourだけやっていても作業の流れが身につかなさそうなので、写経を始めました
そこでまず出くわしたのがTokioのバージョンの壁で、バージョンによって動いたり動かなかったり差がありました
クレートの無難なバージョンがどれか、クレート同士の無難な食い合わせはどれか、など、どうやって知れば良いのですか?
そこでまず出くわしたのがTokioのバージョンの壁で、バージョンによって動いたり動かなかったり差がありました
クレートの無難なバージョンがどれか、クレート同士の無難な食い合わせはどれか、など、どうやって知れば良いのですか?
858デフォルトの名無しさん
2021/08/21(土) 23:07:06.11ID:7GAoG1Iq >>857
Nimの写経を始めましょう
Nimの写経を始めましょう
859デフォルトの名無しさん
2021/08/21(土) 23:07:52.34ID:kcBD0DB/ 写経なら写し元と同じバージョンにそろえるのがよいのでは
860デフォルトの名無しさん
2021/08/21(土) 23:24:51.23ID:7GAoG1Iq >>859
>写経なら写し元と同じバージョンにそろえるのがよいのでは
Nimのバージョン 1.5.1を写経しましょう
Nimの実験的特徴
著者: アンドレアス・ルンプ
バージョン: 1.5.1
http://nim-lang.github.io/Nim/manual_experimental.html
>写経なら写し元と同じバージョンにそろえるのがよいのでは
Nimのバージョン 1.5.1を写経しましょう
Nimの実験的特徴
著者: アンドレアス・ルンプ
バージョン: 1.5.1
http://nim-lang.github.io/Nim/manual_experimental.html
861デフォルトの名無しさん
2021/08/21(土) 23:48:46.37ID:PyG7lKVy 組み込み系ではMicroPythonが流行っているらしいが全く魅力を感じないw
862デフォルトの名無しさん
2021/08/21(土) 23:53:13.51ID:+zMEbJ+6 Nimを調べてみたのだが
Rustよりも高機能な点を見つけられなかった
もし有るならば書いてください
無ければ去ってください
Rustよりも高機能な点を見つけられなかった
もし有るならば書いてください
無ければ去ってください
863デフォルトの名無しさん
2021/08/22(日) 02:15:33.57ID:0Cz6ueFz >>862
>Nimを調べてみたのだがRustよりも高機能な点を見つけられなかった
>もし有るならば書いてください
>無ければ去ってください
そんな寂しい事言わないでかまってよ〜(´;︵;`)
行末のセミコロンが必要ない
タイプ数がもりもり減ります。
Rust にはもちろん必要です。
main が要らない
スクリプト言語感覚でいきなりコードを書けます。
Rust は main が必要です。
>Nimキチガイ
いつもみんなによく言われます
いや〜照れますね〜v(=^0^=)v
>Nimを調べてみたのだがRustよりも高機能な点を見つけられなかった
>もし有るならば書いてください
>無ければ去ってください
そんな寂しい事言わないでかまってよ〜(´;︵;`)
行末のセミコロンが必要ない
タイプ数がもりもり減ります。
Rust にはもちろん必要です。
main が要らない
スクリプト言語感覚でいきなりコードを書けます。
Rust は main が必要です。
>Nimキチガイ
いつもみんなによく言われます
いや〜照れますね〜v(=^0^=)v
864デフォルトの名無しさん
2021/08/22(日) 02:16:39.23ID:KEfgBimj >>863
nimのスレ立ててそっちでやってよ
nimのスレ立ててそっちでやってよ
865デフォルトの名無しさん
2021/08/22(日) 02:32:40.46ID:w5XnK8W7866デフォルトの名無しさん
2021/08/22(日) 02:33:23.15ID:j+Q/a+4n 構うな
さっさとNG
さっさとNG
867デフォルトの名無しさん
2021/08/22(日) 02:35:27.65ID:0Cz6ueFz >>863
>nimのスレ立ててそっちでやってよ
そんな寂しい事言わないでかまってよ〜(´;︵;`)
Nim は標準出力への文字列出力が楽
Nim では echo で改行付きの出力ができます。shell と同じですね。通常は改行付きで出力することの方が多いでしょ。
Nim はしょっちゅうやることは簡単にできるようになっています。
そんな Nim の echo は可変引数で値を受け取り型が何なんだろうとお構いなしに出力できます。
let n = 10
let str = "HOGE"
echo "Number: ", n, " String: ", str
一方 Rust は
let n = 10;
let str = "HOGE";
println!("Number: {} String: {}", n, str);
なんかよく判らんマクロでいちいちびっくりさせなきゃいけないです。よく使うものが冗長だとゲンナリします。
変数を直接ぶち込むことも出来ませんしね。
let n = 10
echo n
普通出来るでしょこんなもん・・・。ところが Rust は出来ない。
let n = 10;
println!(n); <- エラー
println!("{}", n); <- 毎度これを書かされる
うざいっす。
>nimのスレ立ててそっちでやってよ
そんな寂しい事言わないでかまってよ〜(´;︵;`)
Nim は標準出力への文字列出力が楽
Nim では echo で改行付きの出力ができます。shell と同じですね。通常は改行付きで出力することの方が多いでしょ。
Nim はしょっちゅうやることは簡単にできるようになっています。
そんな Nim の echo は可変引数で値を受け取り型が何なんだろうとお構いなしに出力できます。
let n = 10
let str = "HOGE"
echo "Number: ", n, " String: ", str
一方 Rust は
let n = 10;
let str = "HOGE";
println!("Number: {} String: {}", n, str);
なんかよく判らんマクロでいちいちびっくりさせなきゃいけないです。よく使うものが冗長だとゲンナリします。
変数を直接ぶち込むことも出来ませんしね。
let n = 10
echo n
普通出来るでしょこんなもん・・・。ところが Rust は出来ない。
let n = 10;
println!(n); <- エラー
println!("{}", n); <- 毎度これを書かされる
うざいっす。
868デフォルトの名無しさん
2021/08/22(日) 02:38:26.87ID:0Cz6ueFz >>865
そんな寂しい事言わないでかまってよ〜(´;︵;`)
NimはC の関数を気軽に持ってくる
たった一行足すだけで C の関数を使うことが出来るようになります。
proc printf*(format: cstring) {.header: "<stdio.h>", importc: "printf", varargs.}
let n = 10
let str = "HOGE"
printf "Number: %d String: %s\n", n, str
どうですこれ?C の資産を気軽に使うことができるんです。SWIG 等の鬱陶しいラッパーを使うこと無くです。
Rust の場合はご多分にもれずラッパー行きで超絶面倒くさいです。比較用に書きたいんですが結構な文章量になるのでやめます。
そんな寂しい事言わないでかまってよ〜(´;︵;`)
NimはC の関数を気軽に持ってくる
たった一行足すだけで C の関数を使うことが出来るようになります。
proc printf*(format: cstring) {.header: "<stdio.h>", importc: "printf", varargs.}
let n = 10
let str = "HOGE"
printf "Number: %d String: %s\n", n, str
どうですこれ?C の資産を気軽に使うことができるんです。SWIG 等の鬱陶しいラッパーを使うこと無くです。
Rust の場合はご多分にもれずラッパー行きで超絶面倒くさいです。比較用に書きたいんですが結構な文章量になるのでやめます。
869デフォルトの名無しさん
2021/08/22(日) 02:44:19.98ID:0Cz6ueFz >>866
そんな寂しい事言わないでかまってよ〜(´;︵;`)
Nimはmut mut しなくて良い
Rust はまともな変数を使おうとすると mut mut しないといけません。デフォルトだと再代入できませんから。
普通再代入しまくりますよね?定数ライクに使いたい機会なんて殆どないですよね?なのに mut を毎度書かされます。
let n:int = 10
let mut m: int = 10
Nim ならこうですよ。
let n = 10 # immutable
var m = 10 # mutable
素敵。
そんな寂しい事言わないでかまってよ〜(´;︵;`)
Nimはmut mut しなくて良い
Rust はまともな変数を使おうとすると mut mut しないといけません。デフォルトだと再代入できませんから。
普通再代入しまくりますよね?定数ライクに使いたい機会なんて殆どないですよね?なのに mut を毎度書かされます。
let n:int = 10
let mut m: int = 10
Nim ならこうですよ。
let n = 10 # immutable
var m = 10 # mutable
素敵。
870デフォルトの名無しさん
2021/08/22(日) 02:55:06.51ID:0Cz6ueFz >>862
Nim所有者・借用なんてもんでイライラしない
Rust には C のポインタが可愛く見えるレベルで高くそびえ立つ鉄壁の初心者ガード、悪夢の"所有者・借用"の概念が存在します。
プログラムに慣れた人間ですら混乱に陥れ、書いている最中に精神力と人生の貴重な時間をガンガン削ってくれる究極の嫌がらせです。
Rust は変数のコピーしちゃうと元のやつが使えなくなるクソ仕様なのです。書き手にメリットなんて一切無い。C++の悪しきメモリ管理の呪いを持ち込んで来てその中でもさらに悪い部分をデフォルトにした感じです。
struct Point {
x: i32,
y: i32,
}
fn Print(p: Point) {
println!("x = {}, y = {}", p.x, p.y);
}
fn main() {
let mut a: Point = Point{ x: 10, y: 15 };
Print(a);
// エラー!
println!("x = {}, y = {}", a.x, a.y);
}
Print(a) で1回コピーされているのでその後使うと死にます。ウソでしょ?と思うでしょ?ホントです。
そしてプリミティブ型ならOKと言う Java に似たダブスタの呪いもオマケで付いてます。
おかげさまで関数はほぼ全て明示的に参照渡しをするハメになります。
「だったらデフォルトそうしとけよ! & をイチイチ書かせんなやワレ!」と思わないのってある種の才能だと思います
Nim所有者・借用なんてもんでイライラしない
Rust には C のポインタが可愛く見えるレベルで高くそびえ立つ鉄壁の初心者ガード、悪夢の"所有者・借用"の概念が存在します。
プログラムに慣れた人間ですら混乱に陥れ、書いている最中に精神力と人生の貴重な時間をガンガン削ってくれる究極の嫌がらせです。
Rust は変数のコピーしちゃうと元のやつが使えなくなるクソ仕様なのです。書き手にメリットなんて一切無い。C++の悪しきメモリ管理の呪いを持ち込んで来てその中でもさらに悪い部分をデフォルトにした感じです。
struct Point {
x: i32,
y: i32,
}
fn Print(p: Point) {
println!("x = {}, y = {}", p.x, p.y);
}
fn main() {
let mut a: Point = Point{ x: 10, y: 15 };
Print(a);
// エラー!
println!("x = {}, y = {}", a.x, a.y);
}
Print(a) で1回コピーされているのでその後使うと死にます。ウソでしょ?と思うでしょ?ホントです。
そしてプリミティブ型ならOKと言う Java に似たダブスタの呪いもオマケで付いてます。
おかげさまで関数はほぼ全て明示的に参照渡しをするハメになります。
「だったらデフォルトそうしとけよ! & をイチイチ書かせんなやワレ!」と思わないのってある種の才能だと思います
871デフォルトの名無しさん
2021/08/22(日) 02:59:07.86ID:0Cz6ueFz >>862
struct Point {
x: i32,
y: i32,
}
fn Print(p: &Point) {
println!("x = {}, y = {}", p.x, p.y);
}
fn main() {
let mut a: Point = Point{ x: 10, y: 15 };
Print(&a);
println!("x = {}, y = {}", a.x, a.y);
}
これだとまぁエラーにはなりません。が、参照だからといってこんなことやったら死にます。
fn Print(p: &Point) {
println!("x = {}, y = {}", p.x, p.y);
p.x = 10; <- die
}
イミュータブルだからですって。はぁ・・・。
struct Point {
x: i32,
y: i32,
}
fn Print(p: &Point) {
println!("x = {}, y = {}", p.x, p.y);
}
fn main() {
let mut a: Point = Point{ x: 10, y: 15 };
Print(&a);
println!("x = {}, y = {}", a.x, a.y);
}
これだとまぁエラーにはなりません。が、参照だからといってこんなことやったら死にます。
fn Print(p: &Point) {
println!("x = {}, y = {}", p.x, p.y);
p.x = 10; <- die
}
イミュータブルだからですって。はぁ・・・。
872デフォルトの名無しさん
2021/08/22(日) 03:01:25.00ID:0Cz6ueFz >>862
だからこう書けですって。
fn Print(p: &mut Point) {
println!("x = {}, y = {}", p.x, p.y);
p.x = 100;
}
fn main() {
let mut a: Point = Point{ x: 10, y: 15 };
Print(&mut a);
println!("x = {}, y = {}", a.x, a.y);
}
はい来た。mut mut mut mut mut mut mut mut mut ああぁぁああぁ〜〜〜!!!
なんでよく使う方を面倒臭くしたがるんですか、この言語を作っている方々は。
その他又貸しの呪いやらなにやら超盛り沢山ですし。もうね私とはセンスが全く合わないです。
ぬぅぅうぅうぉぉおぉおぁぁあぁあああ!!!!!Rustよ!もうお前には頼まん!malloc と free を俺によこせうぉるぅぁあ!!こんな訳のわからんものに付き合わされるんだったら自分でメモリ管理した方がマシだわ!!!
とよくみんな発狂しませんよね。我慢強いですね。馬鹿じゃないの。
とっても良い子である Nim にはこんな呪いある"ワケ"がないです。
だからこう書けですって。
fn Print(p: &mut Point) {
println!("x = {}, y = {}", p.x, p.y);
p.x = 100;
}
fn main() {
let mut a: Point = Point{ x: 10, y: 15 };
Print(&mut a);
println!("x = {}, y = {}", a.x, a.y);
}
はい来た。mut mut mut mut mut mut mut mut mut ああぁぁああぁ〜〜〜!!!
なんでよく使う方を面倒臭くしたがるんですか、この言語を作っている方々は。
その他又貸しの呪いやらなにやら超盛り沢山ですし。もうね私とはセンスが全く合わないです。
ぬぅぅうぅうぉぉおぉおぁぁあぁあああ!!!!!Rustよ!もうお前には頼まん!malloc と free を俺によこせうぉるぅぁあ!!こんな訳のわからんものに付き合わされるんだったら自分でメモリ管理した方がマシだわ!!!
とよくみんな発狂しませんよね。我慢強いですね。馬鹿じゃないの。
とっても良い子である Nim にはこんな呪いある"ワケ"がないです。
873デフォルトの名無しさん
2021/08/22(日) 03:06:14.74ID:0Cz6ueFz >>862
type Point = object
x: int
y: int
proc print(this: Point) =
echo "x = ", this.x, ", y = ", this.y
var p = Point(x: 10, y: 15)
p.print()
echo "x = ", p.x, ", y = ", p.y
まぁ普通はこうですよね・・・。Rust がぶっ飛んで異常なだけです。ありえないです。
ちなみに Nim の場合 print(p) と p.print() は書き方が違うだけで意味は同じです。
type Point = object
x: int
y: int
proc print(this: Point) =
echo "x = ", this.x, ", y = ", this.y
var p = Point(x: 10, y: 15)
p.print()
echo "x = ", p.x, ", y = ", p.y
まぁ普通はこうですよね・・・。Rust がぶっ飛んで異常なだけです。ありえないです。
ちなみに Nim の場合 print(p) と p.print() は書き方が違うだけで意味は同じです。
874デフォルトの名無しさん
2021/08/22(日) 03:09:40.85ID:0Cz6ueFz >>862
参照で渡す場合はこうなります。
type Point = object
x: int
y: int
proc print(this: ref Point) =
echo "x = ", this.x, ", y = ", this.y
this.x = 100
var p = Point.new
p.x = 10
p.y = 15
p.print()
echo "x = ", p.x, ", y = ", p.y
new で Point object を作成すると参照のオブジェクトが出来ます。これを渡すために print 側の引数には ref をつけてあげます。new 関数でメンバに値を割り当てることは出来ないので後から渡してやります。
つっても上のやつはあくまで Rust と似せて書いたらこうなるよって話でこんな書き方しません。
参照で渡す場合はこうなります。
type Point = object
x: int
y: int
proc print(this: ref Point) =
echo "x = ", this.x, ", y = ", this.y
this.x = 100
var p = Point.new
p.x = 10
p.y = 15
p.print()
echo "x = ", p.x, ", y = ", p.y
new で Point object を作成すると参照のオブジェクトが出来ます。これを渡すために print 側の引数には ref をつけてあげます。new 関数でメンバに値を割り当てることは出来ないので後から渡してやります。
つっても上のやつはあくまで Rust と似せて書いたらこうなるよって話でこんな書き方しません。
875デフォルトの名無しさん
2021/08/22(日) 03:11:53.65ID:0Cz6ueFz >>862
普通オブジェクトなんて参照だろ、って事で Nim では以下のように書くのが慣例化しています。
type
Point = ref PointObj
PointObj = object
x: int
y: int
proc print(this: Point) =
echo "x = ", this.x, ", y = ", this.y
this.x = 100
var p = Point(x: 10, y: 15)
p.print()
echo "x = ", p.x, ", y = ", p.y
オブジェクトとそのリファレンスを同時に定義して、通常使わない方のオブジェクト側にサフィックスをつけておくと、まぁ素のオブジェクトも作りたきゃ作れるし、って話です。
自分は正直リファレンスだけで良いので更に手を抜いてこう書きますけどね。
type
Point = ref object
x: int
y: int
普通オブジェクトなんて参照だろ、って事で Nim では以下のように書くのが慣例化しています。
type
Point = ref PointObj
PointObj = object
x: int
y: int
proc print(this: Point) =
echo "x = ", this.x, ", y = ", this.y
this.x = 100
var p = Point(x: 10, y: 15)
p.print()
echo "x = ", p.x, ", y = ", p.y
オブジェクトとそのリファレンスを同時に定義して、通常使わない方のオブジェクト側にサフィックスをつけておくと、まぁ素のオブジェクトも作りたきゃ作れるし、って話です。
自分は正直リファレンスだけで良いので更に手を抜いてこう書きますけどね。
type
Point = ref object
x: int
y: int
876デフォルトの名無しさん
2021/08/22(日) 03:16:29.28ID:0Cz6ueFz >>862
パターンマッチ?case でしょ?
Nim も case でそれっぽく書けます。
複式パターン
fn main() {
let x = 1;
match x {
1 | 2 => println!("1 | 2"),
3 => println!("3"),
_ => println!("other"),
}
}
let x = 1
case x
of 1, 2: echo "1 | 2"
of 3: echo "3"
else: echo "other"
パターンマッチ?case でしょ?
Nim も case でそれっぽく書けます。
複式パターン
fn main() {
let x = 1;
match x {
1 | 2 => println!("1 | 2"),
3 => println!("3"),
_ => println!("other"),
}
}
let x = 1
case x
of 1, 2: echo "1 | 2"
of 3: echo "3"
else: echo "other"
877デフォルトの名無しさん
2021/08/22(日) 03:20:10.82ID:0Cz6ueFz >>862
範囲
fn main() {
let x = 1;
match x {
1...5 => println!("1...5"),
_ => println!("other"),
};
}
let x = 1
case x
of 1..5: echo "1..5"
else: echo "other"
範囲
fn main() {
let x = 1;
match x {
1...5 => println!("1...5"),
_ => println!("other"),
};
}
let x = 1
case x
of 1..5: echo "1..5"
else: echo "other"
878デフォルトの名無しさん
2021/08/22(日) 03:23:05.87ID:0Cz6ueFz >>862
case の返りを受け取る
fn main() {
let x = 1;
let s = match x {
1 => "one",
2 => "two",
_ => "other",
};
println!("{}", s)
}
let x = 1
let s = case x
of 1: "one"
of 2: "two"
else: "other"
echo s
case の返りを受け取る
fn main() {
let x = 1;
let s = match x {
1 => "one",
2 => "two",
_ => "other",
};
println!("{}", s)
}
let x = 1
let s = case x
of 1: "one"
of 2: "two"
else: "other"
echo s
879デフォルトの名無しさん
2021/08/22(日) 03:24:44.35ID:0Cz6ueFz880デフォルトの名無しさん
2021/08/22(日) 03:26:55.98ID:0Cz6ueFz >>862
仕様バグがない
Rust の以下の挙動は全く理解ができません。
fn main() {
let x = 'x';
let c = 'c';
match c {
// x: c c: c
x => println!("x: {} c: {}", x, c),
}
// x: x
println!("x: {}", x)
}
普通 x にマッチすると思わないでしょこれ。
さらにその直後 x が 'c' に変わってるとか予想だにしませんよ。
まぁ普通はこんな書き方しないと思いますがこんな調子ではどこでどうハマるか予測不可能です恐ろしすぎます。
Nim はこんな書き方そもそも出来ません。
仕様バグがない
Rust の以下の挙動は全く理解ができません。
fn main() {
let x = 'x';
let c = 'c';
match c {
// x: c c: c
x => println!("x: {} c: {}", x, c),
}
// x: x
println!("x: {}", x)
}
普通 x にマッチすると思わないでしょこれ。
さらにその直後 x が 'c' に変わってるとか予想だにしませんよ。
まぁ普通はこんな書き方しないと思いますがこんな調子ではどこでどうハマるか予測不可能です恐ろしすぎます。
Nim はこんな書き方そもそも出来ません。
881デフォルトの名無しさん
2021/08/22(日) 03:31:02.98ID:0Cz6ueFz >>862
コンパイラがケチくさくない
nim c -r hoge
これで hoge.nim をコンパイルします。
拡張子なんて指定する必要ありません。
-r で実行もします。
Rust の場合
rustc hoge <- ダメ
コンパイルと同時に実行しようと思ったら
rustc hoge.rs && ./hoge
うーん・・・
コンパイラがケチくさくない
nim c -r hoge
これで hoge.nim をコンパイルします。
拡張子なんて指定する必要ありません。
-r で実行もします。
Rust の場合
rustc hoge <- ダメ
コンパイルと同時に実行しようと思ったら
rustc hoge.rs && ./hoge
うーん・・・
882デフォルトの名無しさん
2021/08/22(日) 03:36:37.77ID:0Cz6ueFz >>862
実行速度・メモリ使用量・ファイルサイズが小さい
Rust と比べて Nim の実効速度はどっこいかむしろ速いです。
Rust はこんだけイライラする書き方を強制されるにも関わらずたいして速くないとかもう哀れすぎます。
コンパイル後のファイルサイズは話にならないレベルで比べ物になりません。
fizzbuzz の例(FizzBuzz を無駄にベンチマークしてみた By Nim、golang、Rust、Crystal、その他 - 強まっていこう)で言うと
項目 Nim Rust
実行速度 0.37s 0.44s
ファイルサイズ 82K 3.4M
メモリ 356K 900K
こんな感じです。
実行速度・メモリ使用量・ファイルサイズが小さい
Rust と比べて Nim の実効速度はどっこいかむしろ速いです。
Rust はこんだけイライラする書き方を強制されるにも関わらずたいして速くないとかもう哀れすぎます。
コンパイル後のファイルサイズは話にならないレベルで比べ物になりません。
fizzbuzz の例(FizzBuzz を無駄にベンチマークしてみた By Nim、golang、Rust、Crystal、その他 - 強まっていこう)で言うと
項目 Nim Rust
実行速度 0.37s 0.44s
ファイルサイズ 82K 3.4M
メモリ 356K 900K
こんな感じです。
883デフォルトの名無しさん
2021/08/22(日) 03:40:59.41ID:EcXIWh+x >>882
無知がやるとそうなるわな
無知がやるとそうなるわな
884デフォルトの名無しさん
2021/08/22(日) 08:37:49.63ID:0Cz6ueFz >>883
>無知がやるとそうなるわな
バカ丸出し
Nimは標準実装されたnimコンパイラが強力なマクロで
最適化されたCのソースコードを吐き出して、Cコンパイラ
で極小バイナリまで生成するから、コンパイルするだけで
後はプログラマがする仕事が無いので怠けててもいい
Rustは標準実装されたコンパイラでコンパイルするだけでは
超巨大なバイナリを生成するので、最適化せれたチューニング
を施して小さなバイナリを生成しなければならないから
プログラマの仕事が増えて怠けられない
>無知がやるとそうなるわな
バカ丸出し
Nimは標準実装されたnimコンパイラが強力なマクロで
最適化されたCのソースコードを吐き出して、Cコンパイラ
で極小バイナリまで生成するから、コンパイルするだけで
後はプログラマがする仕事が無いので怠けててもいい
Rustは標準実装されたコンパイラでコンパイルするだけでは
超巨大なバイナリを生成するので、最適化せれたチューニング
を施して小さなバイナリを生成しなければならないから
プログラマの仕事が増えて怠けられない
885デフォルトの名無しさん
2021/08/22(日) 08:40:06.97ID:BRNN665g >>884
仕組みすら理解してないのか
仕組みすら理解してないのか
886デフォルトの名無しさん
2021/08/22(日) 08:43:57.27ID:c6eQFYhO887デフォルトの名無しさん
2021/08/22(日) 08:57:00.52ID:QorwbXcj rustスレでnim nim言ってる奴荒らしだろ
888デフォルトの名無しさん
2021/08/22(日) 09:00:12.62ID:0Cz6ueFz >>862
マクロのシンタックスを別で覚える必要がない
Rust のマクロは構文が全く変わってしまいます。
そしてそれは脳が全力で受付を拒否する素敵な仕上がりとなっております。
公式で自ら「マクロベースのコードの欠点は、組み込みルールの少なさに
由来するそのコードの理解のしづらさです。」と言いのけちゃう代物で
「なんじゃそりゃ」と言う言葉しか出ません。
Nim は構文がそのまま使えます。なので強力なマクロを使いこなすための
障壁の低さは比べ物になりません。
マクロのシンタックスを別で覚える必要がない
Rust のマクロは構文が全く変わってしまいます。
そしてそれは脳が全力で受付を拒否する素敵な仕上がりとなっております。
公式で自ら「マクロベースのコードの欠点は、組み込みルールの少なさに
由来するそのコードの理解のしづらさです。」と言いのけちゃう代物で
「なんじゃそりゃ」と言う言葉しか出ません。
Nim は構文がそのまま使えます。なので強力なマクロを使いこなすための
障壁の低さは比べ物になりません。
889デフォルトの名無しさん
2021/08/22(日) 09:19:59.80ID:k4RSCji3 次世代言語22 Go Nim Rust Swift Kotlin TypeScript
https://mevius.5ch.net/test/read.cgi/tech/1629590343/
https://mevius.5ch.net/test/read.cgi/tech/1629590343/
890デフォルトの名無しさん
2021/08/22(日) 09:21:24.81ID:k4RSCji3891デフォルトの名無しさん
2021/08/22(日) 09:49:19.77ID:sxhQ+hXZ 実際rustって色々リンクするから、最小バイナリでかいよな
でも、それで困ったことってあるか?
俺はない
でも、それで困ったことってあるか?
俺はない
892デフォルトの名無しさん
2021/08/22(日) 09:53:06.17ID:DrnSGK6Q893デフォルトの名無しさん
2021/08/22(日) 10:05:41.39ID:qkR4Cuiq Rustは他に比べれば最小のバイナリでしょ、コンパイラ/リンカーが長い年数を掛けて最適化されたCより大きいが。
一番不満なのが公式はビルドが速いというがそんなに早くない事だけ。それ以外は従来のC/C++(C++17/20/23
なんかを除く)より圧倒的に安全だし、明示的であるからこそタイプ量が多い。
Nimに比べて大きいというのはRustのコンパイラがまだCを吐き出してた頃から最適化されていないから、Nimと
いうかGCCやClangに比べ、ほんの少し大きくなる。リンクするものが大きければバイナリが大きくなるのは
当然でGoなんかはまさにそれでしょ、goroutineを共有ライブラリに押し込めることは出来ないから
一番不満なのが公式はビルドが速いというがそんなに早くない事だけ。それ以外は従来のC/C++(C++17/20/23
なんかを除く)より圧倒的に安全だし、明示的であるからこそタイプ量が多い。
Nimに比べて大きいというのはRustのコンパイラがまだCを吐き出してた頃から最適化されていないから、Nimと
いうかGCCやClangに比べ、ほんの少し大きくなる。リンクするものが大きければバイナリが大きくなるのは
当然でGoなんかはまさにそれでしょ、goroutineを共有ライブラリに押し込めることは出来ないから
894デフォルトの名無しさん
2021/08/22(日) 10:06:16.71ID:sxhQ+hXZ >>892
まあ、ユーザコード自体のサイズがでかいわけじゃないのは同意
まあ、ユーザコード自体のサイズがでかいわけじゃないのは同意
895デフォルトの名無しさん
2021/08/22(日) 10:17:01.78ID:qkR4Cuiq もう1つ不満がある事は、Rustならメモリーリークしないと言う奴がいる事、公式も明言してる通り
グローバルの循環参照を作成してしまえば簡単にリークするのに、意識高い系のコード書かないやつが
メモリーリークしないんだと他の言語も触ったことの無い初心者に力説する事。盛大にリークしてて
正常に動いてるプログラムを直すのは大変・・・
ま、これは言語のせいじゃないけどね、他は凄い良く出来てる、Linuxカーネルに採用されるような
他の言語(第3の言語)は当分出てこないだろうと思うほど
グローバルの循環参照を作成してしまえば簡単にリークするのに、意識高い系のコード書かないやつが
メモリーリークしないんだと他の言語も触ったことの無い初心者に力説する事。盛大にリークしてて
正常に動いてるプログラムを直すのは大変・・・
ま、これは言語のせいじゃないけどね、他は凄い良く出来てる、Linuxカーネルに採用されるような
他の言語(第3の言語)は当分出てこないだろうと思うほど
896デフォルトの名無しさん
2021/08/22(日) 10:35:44.30ID:FTtcJrTl Rustのメモリ安全性は、メモリリークしない、ではないからな。
897デフォルトの名無しさん
2021/08/22(日) 10:40:22.74ID:VB7b1YKz898デフォルトの名無しさん
2021/08/22(日) 10:42:20.85ID:sxhQ+hXZ900デフォルトの名無しさん
2021/08/22(日) 10:54:43.87ID:j+Q/a+4n >>895は分かってる人だろう
ちゃんと読んでるか?
ちゃんと読んでるか?
901デフォルトの名無しさん
2021/08/22(日) 11:49:45.30ID:PExPKGEq ビット全探索する関数作ったヽ(´ー`)ノ
fn bit_search<T: Copy>(vec: &Vec<T>) -> Vec<Vec<T>> {
let mut tmp_vec: Vec<Vec<T>> = Vec::new();
for i in 0..(1 << vec.len()) {
let mut slist = (0..vec.len())
.filter(|it| i & (1 << it) != 0)
.map(|it| vec[it]).collect();
tmp_vec.push(slist);
}
return tmp_vec;
}
使い方
let vec0 = bit_search(&(0..5).collect());
など
fn bit_search<T: Copy>(vec: &Vec<T>) -> Vec<Vec<T>> {
let mut tmp_vec: Vec<Vec<T>> = Vec::new();
for i in 0..(1 << vec.len()) {
let mut slist = (0..vec.len())
.filter(|it| i & (1 << it) != 0)
.map(|it| vec[it]).collect();
tmp_vec.push(slist);
}
return tmp_vec;
}
使い方
let vec0 = bit_search(&(0..5).collect());
など
902デフォルトの名無しさん
2021/08/22(日) 12:16:08.62ID:0Cz6ueFz >>862
Rust の良いところ
さすがに Rust を批判ばかりしていては公平性に欠ける報道となり官邸から怒られます。
Rust にも良いところはあります。
fn <- 短い!
proc <- 長い!
これはメリットですよ。タイプが2回ずつ減るのは素敵なことです。
しっかしこれだけ馬鹿げた冗長さを押し付けてくる言語のくせして、
何故ここだけすっきりしているのやらさっぱり意味がわからないです。
あ、結局ディスってもうた・・・。
Rust の良いところ
さすがに Rust を批判ばかりしていては公平性に欠ける報道となり官邸から怒られます。
Rust にも良いところはあります。
fn <- 短い!
proc <- 長い!
これはメリットですよ。タイプが2回ずつ減るのは素敵なことです。
しっかしこれだけ馬鹿げた冗長さを押し付けてくる言語のくせして、
何故ここだけすっきりしているのやらさっぱり意味がわからないです。
あ、結局ディスってもうた・・・。
903デフォルトの名無しさん
2021/08/22(日) 12:22:55.13ID:pVXVequb904デフォルトの名無しさん
2021/08/22(日) 12:30:03.84ID:zDmwJZXZ この仕組みを教えて下さい
もしかして2bit+1byte=2bytesってこと?
> > Option<Option<T>> has layout [0..1][0..1]<u8> , i.e., be of size 3
>
> False. Thanks to @eddyb’s work, the compiler will collapse the discriminant of the first option into the second. Thus, mem::size_of::<Option<Option<u8>>>() == 2.
もしかして2bit+1byte=2bytesってこと?
> > Option<Option<T>> has layout [0..1][0..1]<u8> , i.e., be of size 3
>
> False. Thanks to @eddyb’s work, the compiler will collapse the discriminant of the first option into the second. Thus, mem::size_of::<Option<Option<u8>>>() == 2.
905デフォルトの名無しさん
2021/08/22(日) 12:37:43.49ID:vEK5NNFF >>895
他の言語に比べれば循環参照を作るハードルはかなり高いでしょ
現実的な用途でborrow checkerに引っかからないような循環参照を作って
リーク以外は機能的に問題ないコードを書くのは初心者には難しいと思う
他の言語に比べれば循環参照を作るハードルはかなり高いでしょ
現実的な用途でborrow checkerに引っかからないような循環参照を作って
リーク以外は機能的に問題ないコードを書くのは初心者には難しいと思う
906デフォルトの名無しさん
2021/08/22(日) 12:55:40.93ID:QorwbXcj さすがにマルチポストは荒らし以外の何物でもないな
907デフォルトの名無しさん
2021/08/22(日) 13:03:58.26ID:sxhQ+hXZ >>904
the compiler will collapse the discriminant of the first option into the second.
って言ってるから
Option<Option<u8>>はOption<u8>に変換されるってことじゃない?
the compiler will collapse the discriminant of the first option into the second.
って言ってるから
Option<Option<u8>>はOption<u8>に変換されるってことじゃない?
908デフォルトの名無しさん
2021/08/22(日) 13:18:58.50ID:cSh20jP2909デフォルトの名無しさん
2021/08/22(日) 13:46:33.46ID:j+Q/a+4n >>904
Optionで9回包んでもsizeは2のままだったのでそういうわけではなさそう
None, Some(_), Some(Some(_)) の3バリアントがあるのと同じようなレイアウトになる模様
↓はOption<Option<Option<u8>>>の例
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=31c195fa7390041e3a2d7ce9ff1417f2
Optionで9回包んでもsizeは2のままだったのでそういうわけではなさそう
None, Some(_), Some(Some(_)) の3バリアントがあるのと同じようなレイアウトになる模様
↓はOption<Option<Option<u8>>>の例
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=31c195fa7390041e3a2d7ce9ff1417f2
910デフォルトの名無しさん
2021/08/22(日) 14:20:53.63ID:sxhQ+hXZ 909のコードを借りて確かめてみたら
<Option<Option<Option<u8>>>>(&Some(Some(None)));
と<Option<u8>>(&Some(None))が
<Option<Option<Option<u8>>>>(&Some(Some(Some(0))));
と<Option<u8>>(&Some(0))が同じ結果になったよ
1byte目が00の場合None、00以外の場合Some
<Option<Option<Option<u8>>>>(&Some(None))みたいに
OptionとSomeのレイヤの数が違うと1byte目の結果が違うみたい
1byte目でどのレイヤのSome/Noneか区別してるのかな
<Option<Option<Option<u8>>>>(&Some(Some(None)));
と<Option<u8>>(&Some(None))が
<Option<Option<Option<u8>>>>(&Some(Some(Some(0))));
と<Option<u8>>(&Some(0))が同じ結果になったよ
1byte目が00の場合None、00以外の場合Some
<Option<Option<Option<u8>>>>(&Some(None))みたいに
OptionとSomeのレイヤの数が違うと1byte目の結果が違うみたい
1byte目でどのレイヤのSome/Noneか区別してるのかな
911デフォルトの名無しさん
2021/08/22(日) 14:35:04.66ID:vEK5NNFF [0..=3]<u8>になってるね
nightlyで#[rustc_layout(…)]を使うと確認できる
#![feature(rustc_attrs)]
#[rustc_layout(abi, size, debug)]
type Foo = Option<Option<Option<u8>>>;
nightlyで#[rustc_layout(…)]を使うと確認できる
#![feature(rustc_attrs)]
#[rustc_layout(abi, size, debug)]
type Foo = Option<Option<Option<u8>>>;
912デフォルトの名無しさん
2021/08/22(日) 15:31:41.81ID:PExPKGEq Itertoolsが便利すぎて今までの自分が可愛そうすぎる(´・ω・`)
913デフォルトの名無しさん
2021/08/22(日) 17:33:05.93ID:0Cz6ueFz >>862
技術書典に出会っていなかったら俺はNimをさわってないと思う
背景
俺たち「そろそろ技術書典に参戦するか」
俺たち「何書く?」
俺たち「マイナー言語を触ってみよう。言語選択は早い者勝ちね」
ワイ「(マイナーの定義はさておき)Nimでオナシャス」
ワイ「(アドカレあるし、記事まとめておくかぁ...)」
Nimとは?
Nim は アンドレアス・ランプフ氏によって設計・開発された命令型、マルチパラダイム、
コンパイル言語という特徴を持つプログラミング言語です。
アンドレアス・ランプフ氏は3DICC社に所属するエンジニアです。彼はNim開発以前に様々
な言語を触っていたようです。が、どの言語も満足せず、自身で作成することにしたようです。
それがNimプロジェクトの始まりで、2005年頃のようでした。
当初NimはNimrod(旧約聖書の登場人物)という名前でしたが、マーケティング上の理由から
2014年12月29日にリリースされたバージョン 0.10.2 からNimに変更されました。
技術書典に出会っていなかったら俺はNimをさわってないと思う
背景
俺たち「そろそろ技術書典に参戦するか」
俺たち「何書く?」
俺たち「マイナー言語を触ってみよう。言語選択は早い者勝ちね」
ワイ「(マイナーの定義はさておき)Nimでオナシャス」
ワイ「(アドカレあるし、記事まとめておくかぁ...)」
Nimとは?
Nim は アンドレアス・ランプフ氏によって設計・開発された命令型、マルチパラダイム、
コンパイル言語という特徴を持つプログラミング言語です。
アンドレアス・ランプフ氏は3DICC社に所属するエンジニアです。彼はNim開発以前に様々
な言語を触っていたようです。が、どの言語も満足せず、自身で作成することにしたようです。
それがNimプロジェクトの始まりで、2005年頃のようでした。
当初NimはNimrod(旧約聖書の登場人物)という名前でしたが、マーケティング上の理由から
2014年12月29日にリリースされたバージョン 0.10.2 からNimに変更されました。
914デフォルトの名無しさん
2021/08/22(日) 18:20:04.94ID:qHvaNpwK 結局rustもC++を遥かに超える型地獄なんだな
915デフォルトの名無しさん
2021/08/22(日) 18:47:16.61ID:eu6eNh6V こんだけ型がっちがちに固められた言語触っちゃったら他の言語に戻れない
PythonとかPythonとか
PythonとかPythonとか
916デフォルトの名無しさん
2021/08/22(日) 19:10:19.80ID:E7wqFzW/ 型地獄って何?
917デフォルトの名無しさん
2021/08/22(日) 19:11:44.78ID:CqI7brJQ 二度と出られぬかーたーじーごーくーーー
918デフォルトの名無しさん
2021/08/22(日) 19:15:51.20ID:+34cYDX+ 実行時にバグるよりコンパイルエラーでコンパイル出来ない方が遥かに優れていると思ってるけど, そう思わないと型が辛くなるだろうなぁ
919デフォルトの名無しさん
2021/08/22(日) 19:27:07.94ID:PExPKGEq JavaScriptで組んでたときに、文字の数字を数値型に変換したくて、
"10" + 0
みたいにしてたことを思い出した
"10" + 0
みたいにしてたことを思い出した
920デフォルトの名無しさん
2021/08/22(日) 20:28:11.75ID:O/1WEaVf C++でしんどいの型の部分じゃないけどな
921デフォルトの名無しさん
2021/08/22(日) 20:45:47.91ID:JES5Vdct >>919
JSようしらんけどこれって"100"にならないんだ?
JSようしらんけどこれって"100"にならないんだ?
922デフォルトの名無しさん
2021/08/22(日) 21:02:27.49ID:0Cz6ueFz >>862
Nimの特徴
直感的でわかりやすいシンタックス
公式サイトの記載からNimの特徴を見てみましょう。
以下は公式サイトに掲載されているNimのコード例です。
Nimの最初の特徴して挙げられているのが、そのシンタックスで、曰く「直感的でわかりやすい」とのことです。
Python(のインデントを含めた多くの特徴)やPascalを参考にしているらしいので似ていると思いますが、シンプルですね。
import strformat
type
Person = object
name*: string # Field is exported using `*`.
age: Natural # Natural type ensures the age is positive.
var people = [
Person(name: "John", age: 45),
Person(name: "Kate", age: 30)
]
for person in people:
# Type-safe string interpolation.
echo(fmt"{person.name} is {person.age} years old")
Nimの特徴
直感的でわかりやすいシンタックス
公式サイトの記載からNimの特徴を見てみましょう。
以下は公式サイトに掲載されているNimのコード例です。
Nimの最初の特徴して挙げられているのが、そのシンタックスで、曰く「直感的でわかりやすい」とのことです。
Python(のインデントを含めた多くの特徴)やPascalを参考にしているらしいので似ていると思いますが、シンプルですね。
import strformat
type
Person = object
name*: string # Field is exported using `*`.
age: Natural # Natural type ensures the age is positive.
var people = [
Person(name: "John", age: 45),
Person(name: "Kate", age: 30)
]
for person in people:
# Type-safe string interpolation.
echo(fmt"{person.name} is {person.age} years old")
923デフォルトの名無しさん
2021/08/22(日) 21:06:05.83ID:0Cz6ueFz >>862
Nimの特徴
直感的でわかりやすいシンタックス
公式サイトの記載からNimの特徴を見てみましょう。
以下は公式サイトに掲載されているNimのコード例です。
Nimの最初の特徴して挙げられているのが、そのシンタックスで、曰く「直感的でわかりやすい」とのことです。
Python(のインデントを含めた多くの特徴)やPascalを参考にしているらしいので似ていると思いますが、シンプルですね。
import strformat
type
Person = object
name*: string # Field is exported using `*`.
age: Natural # Natural type ensures the age is positive.
var people = [
Person(name: "John", age: 45),
Person(name: "Kate", age: 30)
]
for person in people:
# Type-safe string interpolation.
echo(fmt"{person.name} is {person.age} years old")
Nimの特徴
直感的でわかりやすいシンタックス
公式サイトの記載からNimの特徴を見てみましょう。
以下は公式サイトに掲載されているNimのコード例です。
Nimの最初の特徴して挙げられているのが、そのシンタックスで、曰く「直感的でわかりやすい」とのことです。
Python(のインデントを含めた多くの特徴)やPascalを参考にしているらしいので似ていると思いますが、シンプルですね。
import strformat
type
Person = object
name*: string # Field is exported using `*`.
age: Natural # Natural type ensures the age is positive.
var people = [
Person(name: "John", age: 45),
Person(name: "Kate", age: 30)
]
for person in people:
# Type-safe string interpolation.
echo(fmt"{person.name} is {person.age} years old")
924デフォルトの名無しさん
2021/08/22(日) 22:37:49.54ID:Wmq9vv9f RustにはGCないから云々言われるけどメモリ以外のリソースもRAIIとムーブセマンティクスの力でいい感じに扱えるのは良いよね
他の言語だと with 式などでスコープ抜けたら解放は出来るけど
クロージャにキャプチャされる場合など長時間生き残るようなケースをちゃんと扱えたりするのだろうか
他の言語だと with 式などでスコープ抜けたら解放は出来るけど
クロージャにキャプチャされる場合など長時間生き残るようなケースをちゃんと扱えたりするのだろうか
925デフォルトの名無しさん
2021/08/23(月) 00:06:22.12ID:q1PbYAS3 >>921
"100"になるよ
"100"になるよ
926デフォルトの名無しさん
2021/08/23(月) 00:25:43.80ID:WImWpxqb >>898
JavaはグローバルのGCがあるから意味が違うよ。リークしているように見えるがプログラムが正常に
終了をすればGCが起こる(だからJavaは停止時にフリーズしたようになるプログラムが多数)
>>905
ハードルは高くないよ。循環参照をWeak<T>でなくRc<T>で書いてしまえば普通にリークする
リファレンスカウントになっているのだから当たり前だけどね
https://doc.rust-jp.rs/book-ja/ch15-06-reference-cycles.html
JavaはグローバルのGCがあるから意味が違うよ。リークしているように見えるがプログラムが正常に
終了をすればGCが起こる(だからJavaは停止時にフリーズしたようになるプログラムが多数)
>>905
ハードルは高くないよ。循環参照をWeak<T>でなくRc<T>で書いてしまえば普通にリークする
リファレンスカウントになっているのだから当たり前だけどね
https://doc.rust-jp.rs/book-ja/ch15-06-reference-cycles.html
927デフォルトの名無しさん
2021/08/23(月) 01:03:20.75ID:LyXSTYiq GC言語にも弱参照はあるのでまともなプログラマーならば強循環参照は作らない
RustはGCが無しでメモリ安全性を保証できる言語であるとともにメモリリークも避けることができる言語
RustはGCが無しでメモリ安全性を保証できる言語であるとともにメモリリークも避けることができる言語
928デフォルトの名無しさん
2021/08/23(月) 01:18:03.41ID:9dmEVPj+ GCは強循環参照も問題なく回収できるんだよ
929デフォルトの名無しさん
2021/08/23(月) 01:30:55.93ID:gt/OOSS+ >>928
GCは方式の異なる段階があって
弱参照を使う循環参照なら強参照カウンタだけで回収できる
強参照のみの循環参照までも回収する方式は様々あるけどいずれも重い
だからGC言語にも弱参照があって賢い配慮あるプログラマーが使えるようになっている
GCは方式の異なる段階があって
弱参照を使う循環参照なら強参照カウンタだけで回収できる
強参照のみの循環参照までも回収する方式は様々あるけどいずれも重い
だからGC言語にも弱参照があって賢い配慮あるプログラマーが使えるようになっている
930デフォルトの名無しさん
2021/08/23(月) 02:08:47.17ID:mUiDivSN >>926
その日本語訳に書いてる通り
「循環参照は簡単にできることではありませんが、不可能というわけでもありません。 Rc<T>値を含むRefCell<T>値があるなどの内部可変性と参照カウントのある型がネストして組み合わさっていたら、 循環していないことを保証しなければなりません;」
RefCell<Rc<T>>を使いこなせるのに循環参照で盛大にリークさせる人も
Rc<T>をWeak<T>に直すのが大変っていう人も
かなりの激レアさんだと思う(個人の感想)
その日本語訳に書いてる通り
「循環参照は簡単にできることではありませんが、不可能というわけでもありません。 Rc<T>値を含むRefCell<T>値があるなどの内部可変性と参照カウントのある型がネストして組み合わさっていたら、 循環していないことを保証しなければなりません;」
RefCell<Rc<T>>を使いこなせるのに循環参照で盛大にリークさせる人も
Rc<T>をWeak<T>に直すのが大変っていう人も
かなりの激レアさんだと思う(個人の感想)
931デフォルトの名無しさん
2021/08/23(月) 08:54:29.06ID:7vUkULmy >>929
誤り
GC言語の弱参照は強循環参照対策ではなく、キャッシュなどで長寿命のオブジェクトがGCを妨げることを避ける目的で使用される
だから例えば、ウインドウはボタンを管理しボタンは自身がクリックされたことをウインドウに通知する、ただしボタンが動的に追加削除されることはない、
といったような互いに寿命が一致する循環参照が生じるケースでは弱参照は普通使用しない
マークアンドスイープは十分に高速なので、参照カウンタをGCと併用するのはあまり一般的ではない
誤り
GC言語の弱参照は強循環参照対策ではなく、キャッシュなどで長寿命のオブジェクトがGCを妨げることを避ける目的で使用される
だから例えば、ウインドウはボタンを管理しボタンは自身がクリックされたことをウインドウに通知する、ただしボタンが動的に追加削除されることはない、
といったような互いに寿命が一致する循環参照が生じるケースでは弱参照は普通使用しない
マークアンドスイープは十分に高速なので、参照カウンタをGCと併用するのはあまり一般的ではない
932デフォルトの名無しさん
2021/08/23(月) 08:57:57.29ID:ksTslrDC ネストしたstructの奥深いところにひっそりRcが隠れてたら
知らない間に循環参照になってることもあるかもしれない
知らない間に循環参照になってることもあるかもしれない
933931
2021/08/23(月) 09:17:05.48ID:7vUkULmy 念のため補足しておくが、寿命が一致しない循環参照の場合は弱参照を使わなければならないというわけではない
ウインドウとボタンの例でいうと、普通に考えてボタンが動的に削除されようとしていることをウインドウが知らないわけないから、そのタイミングでウインドウが持つボタンへの参照を削除すればいいだけだ
GC言語で弱参照が必要とされるのは極めて特殊なケースに限られており、ほとんど使用されることはない
ウインドウとボタンの例でいうと、普通に考えてボタンが動的に削除されようとしていることをウインドウが知らないわけないから、そのタイミングでウインドウが持つボタンへの参照を削除すればいいだけだ
GC言語で弱参照が必要とされるのは極めて特殊なケースに限られており、ほとんど使用されることはない
934デフォルトの名無しさん
2021/08/23(月) 09:53:29.91ID:IzWPiInz >>933
特殊なケースではないと思う
GC言語でも何らかのツリー構造をあつかうことはよくあって
その時に親から子へは普通に強参照でも子から親へは弱参照の方が有利だよね
弱参照を使っていれば一部のサブツリーを捨てた時に循環参照ではなくなる
これはGC言語だけではなくRustでも同様で、サブツリーを捨てたらそのトップへの強参照が消えて連鎖的にサブツリーが回収されますよね?
特殊なケースではないと思う
GC言語でも何らかのツリー構造をあつかうことはよくあって
その時に親から子へは普通に強参照でも子から親へは弱参照の方が有利だよね
弱参照を使っていれば一部のサブツリーを捨てた時に循環参照ではなくなる
これはGC言語だけではなくRustでも同様で、サブツリーを捨てたらそのトップへの強参照が消えて連鎖的にサブツリーが回収されますよね?
935デフォルトの名無しさん
2021/08/23(月) 10:15:02.98ID:6chE64yn936デフォルトの名無しさん
2021/08/23(月) 10:25:19.17ID:9/DhhYFq937デフォルトの名無しさん
2021/08/23(月) 10:28:37.19ID:6chE64yn ちなみにGC言語は常に強参照を使うことを前提に最適化されているので、必要もないのに弱参照を多用すると確実に遅くなるよ
Javaだと弱参照それ自体がヒープアロケーションされるオブジェクトだったりするので、とんでもなく非効率だ
Javaだと弱参照それ自体がヒープアロケーションされるオブジェクトだったりするので、とんでもなく非効率だ
938デフォルトの名無しさん
2021/08/23(月) 10:36:03.26ID:ZbJNhF7k >>937
Rustでは弱参照を使うデメリットありますか?
Rustでは弱参照を使うデメリットありますか?
939デフォルトの名無しさん
2021/08/23(月) 10:50:20.08ID:6chE64yn940デフォルトの名無しさん
2021/08/23(月) 11:23:41.21ID:XXiZs56E これまでRust書いている時にトレーシングGCが欲しくなったことはありますか?
それはどのようなプログラムを書いている時ですか?
それはどのようなプログラムを書いている時ですか?
941デフォルトの名無しさん
2021/08/23(月) 11:40:32.83ID:ueMbvV/8942デフォルトの名無しさん
2021/08/23(月) 13:03:00.15ID:mUiDivSN PythonやSwiftの自動参照カウント方式はGCとは呼ばない派がいるんだね
Rustの場合は弱参照を使うかどうかに関わらず
生存期間を常に意識してコーディングする必要がある
どちらを弱参照にすべきかは所有権を考えれば明白
Rustの場合は弱参照を使うかどうかに関わらず
生存期間を常に意識してコーディングする必要がある
どちらを弱参照にすべきかは所有権を考えれば明白
943デフォルトの名無しさん
2021/08/23(月) 13:26:39.80ID:gvYYeNdp C++ スレでスマートポインタが GC かどうかという話題が出たことあるわ。
そこで現れた GC の定義としては大まかに
@ 十分に信頼してメモリ管理をまかせることが出来る能力がある
A メモリ管理を意識することなく利用できる
のいずれか (または両方) が上げられていて、
その上で信頼性の程度、意識するというのがどの程度のことを言うのかで
様々な線引きがある感じだった。
たとえば@については参照カウンタだと循環を解決できないが、
それはエッジケースでしかなくてたいした問題じゃないと考えるか
そうでないかは人によるが、いずれにしてもまかせるに足る能力で
考えるという考え方。
Aについてはメモリ管理を自動化する能力ではなく見せ方の問題だとする派閥。
スマートポインタは管理方法も管理内容も決まっていて
プログラマがそれを利用するという明示が含まれるので GC ではないという考え方もあるし、
管理の開始こそ明示的な宣言ではあるものの
直接的な管理は隠されているので GC だという主張もある。
どちらに線を引くかは異論があるにせよ、プログラマの側からどう「見えるか」という
抽象度の問題とする考え方。
そこで現れた GC の定義としては大まかに
@ 十分に信頼してメモリ管理をまかせることが出来る能力がある
A メモリ管理を意識することなく利用できる
のいずれか (または両方) が上げられていて、
その上で信頼性の程度、意識するというのがどの程度のことを言うのかで
様々な線引きがある感じだった。
たとえば@については参照カウンタだと循環を解決できないが、
それはエッジケースでしかなくてたいした問題じゃないと考えるか
そうでないかは人によるが、いずれにしてもまかせるに足る能力で
考えるという考え方。
Aについてはメモリ管理を自動化する能力ではなく見せ方の問題だとする派閥。
スマートポインタは管理方法も管理内容も決まっていて
プログラマがそれを利用するという明示が含まれるので GC ではないという考え方もあるし、
管理の開始こそ明示的な宣言ではあるものの
直接的な管理は隠されているので GC だという主張もある。
どちらに線を引くかは異論があるにせよ、プログラマの側からどう「見えるか」という
抽象度の問題とする考え方。
944デフォルトの名無しさん
2021/08/23(月) 13:46:29.34ID:VyqoTEns >>943
違うよ
GCの定義は明白で
「ガベージが生じて溜まっていってそれらをまとめてコレクションすること」
だからRustで例えばノードツリーのトップが何らか任意の方法でドロップとなった時
連鎖的にツリー全体が次々とRcの強参照カウント0となりツリー全体が解放されるのはGCではない
即座に消えてガベージは溜まって行ってないため
違うよ
GCの定義は明白で
「ガベージが生じて溜まっていってそれらをまとめてコレクションすること」
だからRustで例えばノードツリーのトップが何らか任意の方法でドロップとなった時
連鎖的にツリー全体が次々とRcの強参照カウント0となりツリー全体が解放されるのはGCではない
即座に消えてガベージは溜まって行ってないため
945デフォルトの名無しさん
2021/08/23(月) 14:21:58.28ID:cpmwRu6w946デフォルトの名無しさん
2021/08/23(月) 14:28:20.76ID:cpmwRu6w あ、すまん。LISPはマークアンドスイープで、その後に参照カウントが発明されてるわ。
947デフォルトの名無しさん
2021/08/23(月) 14:53:47.52ID:HA74v0pt >>945
参照カウント方式か否かは焦点ではなくて、ゴミがたまっていってまとめて処理することをgarbage collectionと呼ぶ。
RustのRc利用はゴミがたまっていかないのでGCと呼ばれていない。
参照カウント方式か否かは焦点ではなくて、ゴミがたまっていってまとめて処理することをgarbage collectionと呼ぶ。
RustのRc利用はゴミがたまっていかないのでGCと呼ばれていない。
948デフォルトの名無しさん
2021/08/23(月) 15:46:33.74ID:a+6ajIdY >>944
「溜まっていってそれらをまとめて」というのは間違いだな。
wikipediaの記載にある
「不要になった(メモリ)領域を自動的に解放する機能」
というのが正しい。
ポイントは「不要と判断」して「解放」というところ。溜まる必要もまとめて解放する必要も無い。
「溜まっていってそれらをまとめて」というのは間違いだな。
wikipediaの記載にある
「不要になった(メモリ)領域を自動的に解放する機能」
というのが正しい。
ポイントは「不要と判断」して「解放」というところ。溜まる必要もまとめて解放する必要も無い。
949デフォルトの名無しさん
2021/08/23(月) 16:12:57.05ID:gvYYeNdp 個人的には GC であるかそうでないかという議論はそれほど意味が感じられない。
GC という切り口からメモリ管理を見ることが出来るという切り口だと考えてる。
極論すれば C の自動変数も「スコープを抜けたら不要 (ということにする) と判断」して「解放」してるので
GC の一種と言えば一種とも見れるし、しかし参照 (ポインタ) が残ってるかもしれないし
それを経由してアクセスしたらワヤになるので (GC としては) 出来が良くねぇなぁってだけのこと。
GC という切り口からメモリ管理を見ることが出来るという切り口だと考えてる。
極論すれば C の自動変数も「スコープを抜けたら不要 (ということにする) と判断」して「解放」してるので
GC の一種と言えば一種とも見れるし、しかし参照 (ポインタ) が残ってるかもしれないし
それを経由してアクセスしたらワヤになるので (GC としては) 出来が良くねぇなぁってだけのこと。
950デフォルトの名無しさん
2021/08/23(月) 16:20:23.00ID:I6cNZKXd951デフォルトの名無しさん
2021/08/23(月) 16:26:13.36ID:7qCp8Y9u 即時解放はGCじゃないと思うわ
スマポも即時解放なのでGCじゃない派
スマポも即時解放なのでGCじゃない派
952デフォルトの名無しさん
2021/08/23(月) 16:27:26.84ID:7qCp8Y9u 逆に言うと解放のタイミングが基本的に制御できない、つまりIDisposableみたいなのが必要になるならGCという認識
953デフォルトの名無しさん
2021/08/23(月) 16:40:48.46ID:gvYYeNdp ほとんどの場合に参照が 0 になるより前にゴミになっているが
ゴミであることがわかるのがカウントが 0 になったときなんだ。
カウントが 0 になったときをゴミになったときだと定義づけるのは因果が逆転している。
ゴミであることがわかるのがカウントが 0 になったときなんだ。
カウントが 0 になったときをゴミになったときだと定義づけるのは因果が逆転している。
954デフォルトの名無しさん
2021/08/23(月) 16:59:28.87ID:2x1SlAHu それは言葉遊びだな
955デフォルトの名無しさん
2021/08/23(月) 17:08:30.56ID:vyeTxMra956デフォルトの名無しさん
2021/08/23(月) 17:39:51.03ID:gvYYeNdp >>955
小学生かwww 勝負してるわけじゃないだろ。
俺は GC とそうでないものを分ける意味があまりないという立場だ。
「即時」とそうでないものが GC かどうかを分ける境界だという主張に対して
実際には即時に近いものもあればそうでないものも中間もあってそのどこに
線を引けるのかは自明ではなく程度問題だと考えている。
小学生かwww 勝負してるわけじゃないだろ。
俺は GC とそうでないものを分ける意味があまりないという立場だ。
「即時」とそうでないものが GC かどうかを分ける境界だという主張に対して
実際には即時に近いものもあればそうでないものも中間もあってそのどこに
線を引けるのかは自明ではなく程度問題だと考えている。
957デフォルトの名無しさん
2021/08/23(月) 18:01:17.23ID:xSD6Fm/R >>948 その基準だとCの自動変数解放もGCになるね。
958デフォルトの名無しさん
2021/08/23(月) 18:04:49.13ID:fiEjE9/t 中間なんてあるか?
959デフォルトの名無しさん
2021/08/23(月) 18:20:07.16ID:ksTslrDC >>957
さすがにスタックフレームの移動は含まないんじゃないか
さすがにスタックフレームの移動は含まないんじゃないか
960デフォルトの名無しさん
2021/08/23(月) 18:29:19.97ID:OwFrNtUI >>959
関数を終える時点でゴミとなるので解放
だからRcと同じ即時解放タイプとなる
私は即時解放するならばGCでないと考える
だからRcやスタック変数はGCではない
つまりRustにはGCはないとの定説通り
関数を終える時点でゴミとなるので解放
だからRcと同じ即時解放タイプとなる
私は即時解放するならばGCでないと考える
だからRcやスタック変数はGCではない
つまりRustにはGCはないとの定説通り
961デフォルトの名無しさん
2021/08/23(月) 18:59:47.21ID:a+6ajIdY >>957
システムが不要と判断して開放しているならそうだが、実際には違う。
まだ必要(ポインタとかで参照されている)としている領域でもスコープから抜ければ削除されるから、「不要になった領域を削除する機能」とは言えない。
システムが不要と判断して開放しているならそうだが、実際には違う。
まだ必要(ポインタとかで参照されている)としている領域でもスコープから抜ければ削除されるから、「不要になった領域を削除する機能」とは言えない。
962デフォルトの名無しさん
2021/08/23(月) 19:39:34.81ID:cpmwRu6w963デフォルトの名無しさん
2021/08/23(月) 19:41:33.72ID:XXiZs56E まとめて処理しないとGCではないというのなら
GCのパラメーター変更して毎命令処理の度にGCが走るようにしたらGCではなくなるということ?
GCのパラメーター変更して毎命令処理の度にGCが走るようにしたらGCではなくなるということ?
964デフォルトの名無しさん
2021/08/23(月) 19:43:45.53ID:XXiZs56E 与太話はさておきただ単にGCと言うだけでは伝わりにくいから
トレーシングGCとかリファレンスカウント(GC)とか言った方がよいのでは
トレーシングGCとかリファレンスカウント(GC)とか言った方がよいのでは
965デフォルトの名無しさん
2021/08/23(月) 19:48:18.23ID:u6qceEgo966デフォルトの名無しさん
2021/08/23(月) 20:08:33.56ID:/6K8Gxc1 所有権を設定して、ブロックスコープを抜けた所有権のある変数はすべて開放とかよく考えたよね
967デフォルトの名無しさん
2021/08/23(月) 20:15:04.57ID:2vdDGXAS リファレンスカウントは、c++のスマートポインタみたいな循環参照でリークするのと、pythonみたいに循環参照してるゴミを後から回収するのがあるから、後者はリファレンスカウント(GC)と呼ぶべきということでしょ?
前者はGCではない
前者はGCではない
968デフォルトの名無しさん
2021/08/23(月) 21:23:06.49ID:uNBAsbKx 全く関係ない話するけど、
Rustは、可変参照型の変数を右辺に書いて、moveのソース側にすることは
可能?
それとも、moveのソース側は、普通の所有権がある可変変数でないとダメ?
Rustは、可変参照型の変数を右辺に書いて、moveのソース側にすることは
可能?
それとも、moveのソース側は、普通の所有権がある可変変数でないとダメ?
969デフォルトの名無しさん
2021/08/23(月) 21:41:50.19ID:mUiDivSN >>968
moveのソース側って?
ownedの引数にmutable borrowは渡せない
fn foo(mut i: i32){…}
let x = 42;
foo(&mut x); // error
moveのソース側って?
ownedの引数にmutable borrowは渡せない
fn foo(mut i: i32){…}
let x = 42;
foo(&mut x); // error
970デフォルトの名無しさん
2021/08/23(月) 21:49:03.56ID:uNBAsbKx >>969
let x = 構造体名{初期化メンバの列};
let y = x;
と書いた場合、x の内容がy に moveされるけど、
let mut x = 構造体名{初期化メンバの列};
let z = &mut x;
let y = *z;
とすることは可能?
let x = 構造体名{初期化メンバの列};
let y = x;
と書いた場合、x の内容がy に moveされるけど、
let mut x = 構造体名{初期化メンバの列};
let z = &mut x;
let y = *z;
とすることは可能?
971デフォルトの名無しさん
2021/08/23(月) 22:02:36.97ID:mUiDivSN972デフォルトの名無しさん
2021/08/23(月) 23:33:12.95ID:7m4C54nZ GCという言葉がそこまで細かく使わなきゃいけない言葉になってることに意味がない気がする
973デフォルトの名無しさん
2021/08/23(月) 23:50:41.85ID:uNBAsbKx >>971
Copyって、Cloneじゃなくて POD 的な場合に単純コピーされるというやつの事?
Copyって、Cloneじゃなくて POD 的な場合に単純コピーされるというやつの事?
974デフォルトの名無しさん
2021/08/23(月) 23:57:23.53ID:z0XKxUto975デフォルトの名無しさん
2021/08/24(火) 00:18:52.33ID:MkJE9y3A >>973
Copy はトレイトだがそれ自体はただのマーカーでしかなく特に実装しなければならないメソッドはない。
Copy が実装された型はムーブの文脈でコピーになる (所有権を奪わない)。
https://doc.rust-lang.org/std/marker/trait.Copy.html
clone を (必要な文脈では) 自動で呼ぶってだけ。
複製の仕方は Clone の実装のほうに従う。
Copy はトレイトだがそれ自体はただのマーカーでしかなく特に実装しなければならないメソッドはない。
Copy が実装された型はムーブの文脈でコピーになる (所有権を奪わない)。
https://doc.rust-lang.org/std/marker/trait.Copy.html
clone を (必要な文脈では) 自動で呼ぶってだけ。
複製の仕方は Clone の実装のほうに従う。
976デフォルトの名無しさん
2021/08/24(火) 00:33:59.68ID:MkJE9y3A >>974
ムーブの実態はビット単位のコピー。
ムーブ元は「今後絶対に使われない」という静的な強力な保証があるから
有効なオブジェクトはひとつだけなんだ。
ビットパターンの複製は作られるよ。
コピー (クローン) という用語は Rust 的にはあくまでも静的な所有権管理と紐付いていて
機械語レベルでデータが複製されるかどうかとは関係がない。
ムーブの実態はビット単位のコピー。
ムーブ元は「今後絶対に使われない」という静的な強力な保証があるから
有効なオブジェクトはひとつだけなんだ。
ビットパターンの複製は作られるよ。
コピー (クローン) という用語は Rust 的にはあくまでも静的な所有権管理と紐付いていて
機械語レベルでデータが複製されるかどうかとは関係がない。
977デフォルトの名無しさん
2021/08/24(火) 08:40:18.86ID:wPEcGzhk >>930
お互い個人の感想なので強くは言いませんが、公式に上がっている例を見ていただければ、たった数十行で
リーク構造を作れることは分かってもらえると思います。
あなたが言う通りにRc<T>の特性を知って使いこなしているのであれば別ですが、初心者が全て知っている事は
稀、レアというよりあり得ません。またRc<T>をWeak<T>に直すのが大変という話ではありませんよ。
データ構造上のリング構造や、ツリー上に出来てしまった循環参照を前提に(リークはするが)動いている依存
コードが多量にあるプログラムを影響を与えないように直すのが難しいという話です。これはRustではなくても
他の循環参照を明示的に破棄しないプログラムを書いてしまえば同じ事ですが。
Rustは大変に高パフォーマンスで、明示的な制御が効きますが>>895で言っているのは技術レベルが違う二者で
苦労する人が一定数発生する事でしょう。言語とはほぼ何の関係ありませんが
お互い個人の感想なので強くは言いませんが、公式に上がっている例を見ていただければ、たった数十行で
リーク構造を作れることは分かってもらえると思います。
あなたが言う通りにRc<T>の特性を知って使いこなしているのであれば別ですが、初心者が全て知っている事は
稀、レアというよりあり得ません。またRc<T>をWeak<T>に直すのが大変という話ではありませんよ。
データ構造上のリング構造や、ツリー上に出来てしまった循環参照を前提に(リークはするが)動いている依存
コードが多量にあるプログラムを影響を与えないように直すのが難しいという話です。これはRustではなくても
他の循環参照を明示的に破棄しないプログラムを書いてしまえば同じ事ですが。
Rustは大変に高パフォーマンスで、明示的な制御が効きますが>>895で言っているのは技術レベルが違う二者で
苦労する人が一定数発生する事でしょう。言語とはほぼ何の関係ありませんが
978デフォルトの名無しさん
2021/08/24(火) 08:45:48.38ID:wPEcGzhk まあ将来的にはコンパイラーがより賢く・早くなれば循環参照で増え続けるリークに対してコンパイルエラーにも
出来ると思うので、今は未だ、リークする可能性があろうとRustが良い言語だという認識は変わらない。
他の言語でも当然リークチェックは出来るが、GCを前提とするならコンパイルエラーが出ても、なぜエラーなのか
理解しずらいかもしれない。
出来ると思うので、今は未だ、リークする可能性があろうとRustが良い言語だという認識は変わらない。
他の言語でも当然リークチェックは出来るが、GCを前提とするならコンパイルエラーが出ても、なぜエラーなのか
理解しずらいかもしれない。
979デフォルトの名無しさん
2021/08/24(火) 08:48:26.31ID:GKvpHEIf 行数の問題ではなく、Rcを使って独自のデータ構造を作るスキルがあるのに循環参照だけ知らない初心者、というのはレアということでは
まぁそれはそれとして直すのが難しいケースがあるのは同意
まぁそれはそれとして直すのが難しいケースがあるのは同意
980デフォルトの名無しさん
2021/08/24(火) 09:23:53.65ID:OGtUhL4y ・Rustで循環参照が起きるにはRc利用が必須
・Rc利用者は循環参照の存在もそれを避けるWeakの存在も知っている
・したがってRustでメモリリークを生じさせる者はレアケース
・Weak(弱参照)を適切に上手く用いて循環参照を避けるのが大変な場合もあるが全ての言語で共通の問題でありRustの問題点ではない
・Rc利用者は循環参照の存在もそれを避けるWeakの存在も知っている
・したがってRustでメモリリークを生じさせる者はレアケース
・Weak(弱参照)を適切に上手く用いて循環参照を避けるのが大変な場合もあるが全ての言語で共通の問題でありRustの問題点ではない
981デフォルトの名無しさん
2021/08/24(火) 12:45:30.39ID:PednkAUi982デフォルトの名無しさん
2021/08/24(火) 15:09:04.48ID:KCG/N/Sb rustってどうやって二重開放のリスク防いでるの?全然ピンとこない
983デフォルトの名無しさん
2021/08/24(火) 15:50:18.44ID:tu56M8w7 ownershipが1つしかない状態を維持しつつownershipが0になったら(確実に)解放する感じ
ownershipはどこかの変数が直接的or間接的に保有してて
同じリソースに複数のownershipが発生しないように
代入とか関数の受け渡しでmoveしたりborrowしたりする
少し逸れるけど解放処理を必要としないデータはCopy可能な場合が多い
ownershipは「所有権」て訳されるけど意味的には「解放権」とか「解放責任」に近いかも
ownershipはどこかの変数が直接的or間接的に保有してて
同じリソースに複数のownershipが発生しないように
代入とか関数の受け渡しでmoveしたりborrowしたりする
少し逸れるけど解放処理を必要としないデータはCopy可能な場合が多い
ownershipは「所有権」て訳されるけど意味的には「解放権」とか「解放責任」に近いかも
984デフォルトの名無しさん
2021/08/24(火) 16:38:09.46ID:Cd1Pd2YU >>977
公式の見解を個人の感想と一緒にするなよ
公式の見解を個人の感想と一緒にするなよ
985デフォルトの名無しさん
2021/08/24(火) 17:46:18.00ID:uCQTu6bl Rustで循環参照作るの簡単とか言ってるやつは100%エアプだからほっといてやれ
他言語での経験をあたかもRustで経験したかのように語りたかったんだろう
他言語での経験をあたかもRustで経験したかのように語りたかったんだろう
986デフォルトの名無しさん
2021/08/24(火) 18:15:27.00ID:otdRB8MX >>985
メモリリークの原因になるかどうかを別にすれば、循環参照自体は普通に簡単に生じるだろう
メモリリークの原因になるかどうかを別にすれば、循環参照自体は普通に簡単に生じるだろう
987デフォルトの名無しさん
2021/08/24(火) 18:45:16.53ID:tu56M8w7 unsafeでポインタ使えば簡単だろうけどライフタイムのある参照の循環は大変そう
'a > 'bと 'b > 'aを両立は不可能に見えるけど何か抜け道あるのかな
'a > 'bと 'b > 'aを両立は不可能に見えるけど何か抜け道あるのかな
988デフォルトの名無しさん
2021/08/24(火) 18:55:37.63ID:SZKxopPy 循環参照どころか連結リストも荷が重い
989デフォルトの名無しさん
2021/08/24(火) 19:43:21.83ID:KCG/N/Sb >>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使ってもエラーにならないじゃないか
990デフォルトの名無しさん
2021/08/24(火) 19:58:14.02ID:Mn5s1DvN 何の話? C?
991デフォルトの名無しさん
2021/08/24(火) 20:39:00.27ID:972JwtmU >>980
>Rustで循環参照が起きるにはRc利用が必須
RcだけじゃなくRcとInterior Mutabilityが必須
(どちらか片方はmutableじゃないと循環させられないので)
>Weak(弱参照)を適切に上手く用いて循環参照を避けるのが大変な場合もあるが
Rustの場合は循環参照で意図通り動くコードを書くのに比べれば
弱参照に変更するのはすごく簡単
循環参照を修正してる例
https://github.com/DataDog/glommio/commit/677fe1dfbaf911245fbc5c3eef75532d08d784bf
https://github.com/KWARC/rust-libxml/commit/bd4b120b90b2568ca6d5bfaa368a200573b87d09
>Rustで循環参照が起きるにはRc利用が必須
RcだけじゃなくRcとInterior Mutabilityが必須
(どちらか片方はmutableじゃないと循環させられないので)
>Weak(弱参照)を適切に上手く用いて循環参照を避けるのが大変な場合もあるが
Rustの場合は循環参照で意図通り動くコードを書くのに比べれば
弱参照に変更するのはすごく簡単
循環参照を修正してる例
https://github.com/DataDog/glommio/commit/677fe1dfbaf911245fbc5c3eef75532d08d784bf
https://github.com/KWARC/rust-libxml/commit/bd4b120b90b2568ca6d5bfaa368a200573b87d09
992デフォルトの名無しさん
2021/08/24(火) 20:58:14.10ID:joymTvc2 すまんが、複数のファイルにソースを分割する練習教材みたいなものがあったら教えてくれんか?
993デフォルトの名無しさん
2021/08/24(火) 22:56:02.07ID:972JwtmU994デフォルトの名無しさん
2021/08/24(火) 23:03:55.04ID:PednkAUi >>992
「book」にもモジュールの章がある。
「book」にもモジュールの章がある。
995デフォルトの名無しさん
2021/08/24(火) 23:31:00.93ID:OsSSnb/8 >>987
RcとRefCell使えば数行
RcとRefCell使えば数行
996デフォルトの名無しさん
2021/08/24(火) 23:45:46.97ID:MkJE9y3A 循環によって現れるメモリリークは Rust が提供する「メモリ安全」を損なわないと定義されている。
Rust は循環参照を防がないし、メモリリークに対処するのはプログラマの責任。
Rust は循環参照を防がないし、メモリリークに対処するのはプログラマの責任。
997デフォルトの名無しさん
2021/08/25(水) 00:57:06.67ID:3XgQgETH998デフォルトの名無しさん
2021/08/25(水) 01:28:54.33ID:6n+Di1sM >>990
c
c
999デフォルトの名無しさん
2021/08/25(水) 01:29:12.12ID:6n+Di1sM うんこ
1000デフォルトの名無しさん
2021/08/25(水) 01:29:33.60ID:6n+Di1sM 1000ならここにいるやつら全員失職
10011001
Over 1000Thread このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 69日 1時間 5分 21秒
新しいスレッドを立ててください。
life time: 69日 1時間 5分 21秒
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を超えています。これ以上書き込みはできません。
ニュース
- 小野田紀美・経済安保担当相「何か気に入らないことがあればすぐに経済的威圧をする国への依存はリスク」 ★2 [Hitzeschleier★]
- 【中国局長】両国関係に「深刻な影響」 首相発言の撤回要求 [蚤の市★]
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか…★3 [BFU★]
- 【維新】吉村知事「中国人観光客だけに頼るビジネスモデル変えていかないといけない」「高市総理の発言は撤回する必要はない」 [Hitzeschleier★]
- 【STARTO ENTERTAINMENT】timelesz篠塚大輝『大きな古時計』替え歌一発ギャグ「今はもう動かない おじいさんにトドメ~♪」が波紋 [Ailuropoda melanoleuca★]
- 【社会】40代以上のおじさん・おばさんは叩いてオッケーという風潮はなぜ加速したのか [七波羅探題★]
- 【実況】博衣こよりのえちえち歌枠🧪
- 【高市速報】日本人の3割「中国への武力行使に踏み切る必要がある」ANN世論調査 [931948549]
- 外務省局長、よくわからないまま帰国へ [834922174]
- ラーメン屋「日高屋が安いせいで客が来ない!日高屋はもっと値上げしろ!」 [449534113]
- 中国外務省「日中関係の悪化は高市早苗首相が原因」と名指しで強く非難。キタ━(゚∀゚)━! [153490809]
- 【悲報】オックスフォード大学「日本で影響力のある人」ランキングを公表。1位西村博之氏、2位堀江貴文氏、3位高橋洋一氏 [566475398]
