Rust part8

■ このスレッドは過去ログ倉庫に格納されています
2020/01/24(金) 11:47:52.41ID:9oO1hUHl
Mozilla発のRust言語のスレ

公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust

Web上の実行環境
https://play.rust-lang.org

前スレ
Rust Part7
http://mevius.5ch.net/test/read.cgi/tech/1563114707/
2020/06/05(金) 12:32:15.42ID:lHXK6is7
Google Trends によれば、検索数の増加曲線はほぼ kotlinと同じ位。
ただし、kotlinは、2017/05に急激に上がってRustと重なりあった曲線になったのに対し、Rustは、2014/01に急激に上がった後、徐々に増えている感じ。
Rustはこの1年くらいでわずかに増加速度がKotlinより上がったが、それでもKotlinの曲線とほぼ重なった状態からは脱してはいない。
2020/06/05(金) 12:34:07.49ID:lHXK6is7
>>662
匿名性掲示板では何でも言えてしまうが、実績を見れば俺がちゃんとCやC++を使いこなしていることは分かる。
ただし、C++は一度学んでも仕様が大幅に変更されるので、細かいところを理解するのは時間が掛かるようになってきている。
Cはそんなことはなかったが。
2020/06/05(金) 12:58:47.64ID:AaIN4ymo
もしかして伝説のスーパーハカーさんですか!?
666デフォルトの名無しさん
垢版 |
2020/06/05(金) 13:22:50.72ID:YL2P8Olu
chronoつかってるんだけど、このyearってなんでi32なの?

https://docs.rs/chrono/0.4.11/chrono/offset/trait.TimeZone.html#method.ymd
fn ymd(&self, year: i32, month: u32, day: u32) -> Date<Self>
2020/06/05(金) 13:32:05.31ID:9qGH+5zI
>>664
仮に C や C++ を使いこなせているとして、
使いこなせている言語よりも使いこなせてない言語の方が難しいに決まってるじゃないの。
あなたはそうなんですねってだけ。
2020/06/05(金) 13:35:12.28ID:9qGH+5zI
>>666
符号付きなのがなんでってこと?
month や day はマイナスになる意味はないけど、
年はマイナス (紀元前) を扱いたいこともあるんじゃね。
知らんけど。
2020/06/05(金) 13:44:02.67ID:o7GNRsMO
合ってんじゃね?
知らんけど。
2020/06/05(金) 14:06:52.05ID:B8WhcAqO
C++の仕様が大幅に変更されたというのは
なんのことだ?
2020/06/05(金) 14:17:19.64ID:lHXK6is7
>>670
有る意味では僅かな修正であっても、基礎的な部分における修正は多大な影響を及ぼすことがある。
moveを出来るようにするために追加されたもろもろの事や、=を書かないタイプの{}
による初期化はそれに該当する。
なんでも無いようでいて、可読性を下げたり危険をもたらすことがある。
2020/06/05(金) 14:41:22.49ID:rO0o1lhv
>>662
Cほどシンプルな言語もないだろ。それと簡単に使いこなせるかは別問題。
2020/06/05(金) 14:48:48.89ID:B8WhcAqO
>>671
それ仕様の変更なの?
2020/06/05(金) 14:55:26.22ID:vEUs2R05
>>666
そこに書いとるやん
This assumes the proleptic Gregorian calendar, with the year 0 being 1 BCE.

つまり-1は2 BC
2020/06/05(金) 15:08:35.22ID:8BtILZXI
Cのプリプロセッサやパーサーを書くと全然シンプルじゃないことが分かる
2020/06/05(金) 15:11:02.16ID:lHXK6is7
>>675
それは、使う側にはシンプルそうに見えるCも実は細かく見るとシンプルではないということであって、使う側目線で既に複雑なものはそれ以前の問題他。
2020/06/05(金) 15:43:45.14ID:9qGH+5zI
依存先より寿命が長くなってはいけないなんていうのは C でも当たり前のことだろ。
Rust のライフタイムはライフタイムを簡単に「表現 (したものをチェック)」する言語機能であって、
C でプログラマがやってる (はずの) ライフタイムの管理より複雑ということはない。

Rust なら処理系がチェックしてくれることを
C ではプログラマがやってたんだぞ。
C で出来てたことが Rust ではやれないってのは言語のせいか?

Rust のライフタイムの管理は制約が厳しいとか面倒くさいとかいうなら話はわかるが、
複雑だとか学習難易度が高いというのは納得しかねる。
2020/06/05(金) 15:54:02.73ID:lHXK6is7
>>677
>Rust のライフタイムの管理は制約が厳しいとか面倒くさいとかいうなら話はわかるが、
>複雑だとか学習難易度が高いというのは納得しかねる。
一つあるとすれば、難しさは、ちゃんと本も読んでいるか、ネットに書かれている情報だけに頼っているかの違いに起因している可能性。
2020/06/05(金) 21:26:05.32ID:Py5zog1r
これにて、このスレがRust関連の本の作者の巣窟であることが証明されました。
2020/06/05(金) 21:32:24.36ID:cXh0Dvtv
だいぶ前からじつは言語系のスレはほとんどソレなんだな
宣伝してるやつは気付かれれないと思ってるだろうけど
2020/06/05(金) 21:49:15.38ID:Py5zog1r
>>618
2018/11/28の時点で、

https://www.infoworld.com/article/3324488/rust-language-is-too-hard-to-learn-and-use-says-user-survey.html
ユーザーの調査によると、Rust言語は習得も使用も難しい
Rustユーザーの調査では、メモリの安全性と正確性のためにこの言語の非常に宣伝されている機能に困難と不満を感じています
Rust言語チームが実施したRustユーザーコミュニティの新しい調査では、言語とその使用への関心が高まっていますが、プロジェクトが利点として宣伝しているいくつかのRust機能に対するユーザーの不満も示されています。
Rustの習得が難しいのはなぜですか?ユーザーは、Rustの最も特徴的な2つの機能(寿命と所有権/借用システム)は、「トリッキー」、「非常に難しい」、または「まだ得られない」ものであると報告しました。
その他の質問は、Rustを続行するための課題を中心に展開されました。Rustの使用をやめた人の約半分は、わずか1か月後にそうしました。Rustを使用していない最も一般的な理由は、「威圧的すぎる、習得が難しい、または複雑すぎる」(25%)、
2020/06/05(金) 22:00:56.76ID:Py5zog1r
Rust言語は、学んだり使ったりするのが難しすぎるということが、ユーザーに対する調査で分かった。
--Rustユーザーに対する調査では、安全性と正確性のために言語が非常にうるさく押し付けてくる特長により困難と欲求不満を感じていることが分かった。

Rust language is too hard to learn and use, says user survey
A survey of Rust users finds difficulty and frustration with the language’s highly touted features for memory safety and correctness.

tout = 押し売りする, うるさく勧誘する, 客引きする
(tout for custom うるさく注文を求める.)
・切符をプレミア付きで売る, ダフ屋をやる.
・うるさく勧める.
・ほめちぎる.
2020/06/05(金) 22:04:18.63ID:Py5zog1r
誤:安全性と正確性のために言語が非常にうるさく押し付けてくる特長
誤:安全性と正確性のために言語が非常にうるさく押し付けてくる機構(機能)
2020/06/05(金) 23:15:24.59ID:9qGH+5zI
>>674
へー。 西暦にゼロ年っていうのは無いのか。
685デフォルトの名無しさん
垢版 |
2020/06/06(土) 04:00:23.67ID:Vvt5YBJp
この言語廃れてきそうな気がした。
だってみんなが触るって未来が想像できないもん
2020/06/06(土) 04:10:18.67ID:Oxqgflbz
みんなが触る言語なんて世の中に存在するか?
687デフォルトの名無しさん
垢版 |
2020/06/06(土) 05:29:47.06ID:i8tpraSw
Rustを使ったことはないけどC++は既存の資源で堅実に作るのに対して
Rustは一人のスーパープログラマが複雑高度なライブラリやモジュールを一点突破で書くのに使われそうなイメージ
2020/06/06(土) 09:51:25.89ID:9F/1KVDa
まあScalaと同じ道を辿るだろうね
あっちはビッグウェア系でそれなりに採用されてたから被害が甚大だったけど、
Rustに関してはそういうビジネス的な得意分野は今のところ無いのが救いか
2020/06/06(土) 15:58:34.19ID:HBMrgMqa
>>687
ところがスーパープログラマは、C++でもメモリー関連のバグで詰んで挫折したりすることはないんだな、これが。
2020/06/06(土) 17:06:05.01ID:58RXXUUu
>>687
Rust の偉大さのひとつには crates.io の存在がある。
資源の利用という意味じゃ Rust はかなり積極的だぞ。
2020/06/06(土) 17:17:15.77ID:P/b6XOwm
C++は標準のライブラリリポジトリと標準のビルドツールがあればなぁ、と思う。
野良のは乱立してるけど、結局ほしいライブラリはなかったりするし…。
2020/06/06(土) 17:37:45.92ID:wqdan8fc
>>688
MicrosoftもAppleも使っていくのに爆死したら
IT業界壊滅じゃね
2020/06/06(土) 18:11:03.05ID:58RXXUUu
>>691
各環境のパッケージマネージャに乗っかってることが多いからある意味では一等の地位ともいえる。
メジャーなものは apt-get とか pacman とかで一発で入るだろ。
694デフォルトの名無しさん
垢版 |
2020/06/06(土) 18:38:18.22ID:Vvt5YBJp
>>690
crates.ioがダメダメだから代替のサイトあるのってご存知でない?
2020/06/06(土) 18:42:21.81ID:nPYA670X
Webサイトの話をしてるわけじゃないだろ
2020/06/06(土) 18:56:38.50ID:7YMZq5d4
>>691
漏れは、Windows 10, WSL, Ubuntu 18.04 で、
anyenv(rbenv)で、Ruby をコンパイルするのに、build-essential を使っているけど

build-essential には、
gcc(GNU C compiler), g++(GNU C++ compiler), libc6-dev(GNU C Library), make などが入っています

パッケージ: build-essential
https://packages.ubuntu.com/ja/bionic/build-essential
2020/06/06(土) 19:37:13.44ID:P/b6XOwm
>>693
結局それってディストリビューション依存だからなぁ。
バージョンだって固定できないし、OSS拾ってきてコンパイルが通るようにするだけで試行錯誤が必要。

>>696
いや、頑張って環境構築すればなんとかなるのはその通りだけど、
別のソフトだとまた別の環境構築が必要になって辛いのです。
2020/06/06(土) 21:37:30.50ID:nFHIDUIo
Rustでプロキシーサーバー実装してみようと思ったんだけどTCPStreamとreqwest::headerの連携がうまくいかない
699696
垢版 |
2020/06/06(土) 22:21:08.03ID:7YMZq5d4
漏れは、日本人が作った、バージョンマネージャーのanyenv で、
rbenv, nodenv を使って、ruby 2.6.6, node 12.16.2 を入れた

環境構築が、各言語でバラバラになるのは面倒なので、
anyenv・asdf などを使えば?
2020/06/06(土) 23:04:13.04ID:nFHIDUIo
hyperのサンプルに答えがありました
2020/06/07(日) 00:03:49.64ID:uvQLWD0s
こんな書き込みを見つけた:
loop {
// 1. you finally understood lifetimes
// 2. you get compiler lifetime /borrow complaints
// 3. you feel stupid for taking hours to fix <5 LoC
}
2020/06/07(日) 00:19:04.85ID:uvQLWD0s
ループ {
// 1. あなたはついに lifetime を理解した。
// 2. あなたはコンパイラに lifetimeやborrow の苦情を複数個言われる。
// 3. 5行未満のコードを直すのに何時間もとられることにあなたは馬鹿馬鹿しさを感じる。
}
2020/06/07(日) 11:58:43.41ID:CPBtFfEp
コンパイラに緊縛されて未定義動作を踏まないという快感を得るプレイ
2020/06/07(日) 17:57:12.72ID:WIpxuhAg
Rsutって、早い話が、CやC++に、NULLバグ等々が発生しないようにするための補助機能がついた言語ってこと?
2020/06/07(日) 18:44:36.11ID:r/6oC92T
そうだね〜、で、俺様はNullチェックは忘れないしダングリングポインタなんて組み込まないのでC/C++で良いや
という俺様スパハカがゴミグラムを生み出してきたのでRustは必須
2020/06/07(日) 18:48:57.09ID:HzkE9Nko
>>704
書き方がC/C++の文化とはかけ離れているように感じるが。
2020/06/07(日) 19:46:37.12ID:WIpxuhAg
>>706
いや、言語誕生の思想を考えただけです。
言語誕生の思想をきちんと抑えないと、メリットとデメリットを正答に評価出来ないから
2020/06/07(日) 19:59:02.69ID:uZfe/Sta
どっちかというと「関数型C++」な印象
2020/06/07(日) 22:51:27.97ID:fhJ4vSsJ
Hindley-Milner 型推論を元にしているから考え方は ML 系統からの影響は大きいと思う。
2020/06/08(月) 02:06:14.90ID:jeqh3aBJ
C++の地獄をML(とアフィン型)の知見で楽にしようとした言語

Cの遺産を引き摺ったが故に煩雑だった前者の記法を捨てて後者のいいとこを貰ってきたので、記法が後者に似てるように見えはするけど、やってる事はそう大きく変わってはいない
2020/06/08(月) 10:53:34.76ID:KAmnJXdU
「C++ のメンバ関数の実態は this を暗黙に渡しているだけ」ってのを露骨にしたのも Rust の面白い部分だよね。
関数的な意味論を用いながらも構文糖としてのメソッド記法も用意することでオブジェクト指向的な表現が出来る。
2020/06/08(月) 13:11:59.47ID:LDYBA2kC
RustはC++ではゼロコストで出来ていたものが、出来なくなってしまっていることが多い。
2020/06/08(月) 13:14:25.82ID:KAmnJXdU
>>712
具体的には?
2020/06/08(月) 13:19:16.88ID:NanZmWBA
関数的な意味論ねぇ
表層的に一部それっぽいってだけでは?
2020/06/08(月) 13:28:01.70ID:KAmnJXdU
言語として純粋関数型に分類される Haskell ですら
オブジェクト指向のスタイルで構築されたライブラリは有るから……。
(そのためのフレームワークである lens はまあまあ人気。)

言語仕様での理屈がどうあれ最終的には使い方次第。
2020/06/08(月) 13:36:41.82ID:LDYBA2kC
>>713
言うと改善されるので言わない。
2020/06/08(月) 13:46:18.64ID:LDYBA2kC
memmove()すらunsafeなしではかけないし。
2020/06/08(月) 13:53:57.25ID:LDYBA2kC
RustではpChildがHeapにとられている時、次のようなループすら書けない。
CPerson *pChild=pPerson->pChild;
while(pChild != NULL) {
(pChildに対する処理);
pChild=pChild->pNext;
}
2020/06/08(月) 14:30:52.23ID:KAmnJXdU
>>718
こういう感じのこと?

#[derive(Default)]
struct Person {
pub childs: Box<[Person]>
}

fn main() {
let person : Person = Default::default();
let childs = person.childs;
for ref child in childs.iter() {
// child に対する処理
}
}
2020/06/08(月) 14:39:32.30ID:LDYBA2kC
>>719
Heap領域にある構造体の中に、さらにHeap領域にあるデータへの
参照を持つためにBox型のメンバが有る場合、後者のBoxは、unique_ptrなので
ローカル変数にmoveすることができないためコンパイルエラーになる。
なので、参照カウント方式のRcを使う必要がある。
2020/06/08(月) 14:44:31.30ID:LDYBA2kC
>>719 の場合だと personがスタック領域にあるが、もしそれがHeap領域に
あったとすると、
let childs = person.childs;
とするとエラーになるはずだ。
2020/06/08(月) 14:48:41.29ID:KAmnJXdU
>>721
ならない。



      (完)
2020/06/08(月) 14:53:38.92ID:faeMvMKI
チュートリアルも読まない難癖おじいちゃんの相手すんなし
2020/06/08(月) 14:56:15.14ID:LDYBA2kC
そもそも、
struct Person {
 pub child: Box<[Person]>
}
がおかしくて、正しくは、
struct Person {
 pub child: Box<Person>
 pub next: Box<Person>
}
だ。
2020/06/08(月) 14:56:44.39ID:LDYBA2kC
>>722
全く同じではないが、こっちの環境ではなったがな。
2020/06/08(月) 14:58:43.87ID:KAmnJXdU
後付けやめろよ。
C++ のどういうコードを Rust でどう書けて欲しい (そして実際にはどういうエラーになる) のかちゃんと書け。



いや、書くな。 (どうせ見当違いなので。)
2020/06/08(月) 15:03:12.27ID:LDYBA2kC
>>725
#[derive(Debug)]
struct TAaa {
  x: Box<i32>,
  y: i32
}
fn main() {
  let mut vec:Vec<TAaa> = Vec::new();
  vec.push( TAaa {
    x : Box::new(333),
    y : 444
  } );
  let   x  = vec[0].x; // error[E0507]: cannot move out of index of `std::vec::Vec<TAaa>`
  println!("{:#?}", x);
}
↑のように vec をHeapに確保した場合、エラーになる。
ところが、stackに確保した場合はエラーにならない。
実験済み。
2020/06/08(月) 15:04:31.00ID:LDYBA2kC
>>726
海外のサイトでも、RustはC/C++から単純移行ができ無い事が問題とされている。
FortranからCへは単純移行が出来たからCが普及したと書いてあった。
2020/06/08(月) 15:16:36.76ID:LDYBA2kC
>>726
後付ではない。
C++で、pChild、pNextと言えば、当然そういう構造体になる。
2020/06/08(月) 15:47:14.20ID:KAmnJXdU
>>727
型・寿命・所有権の条件が同じならヒープかスタックかというのは関係ない。
お前が結果的に違う条件で書いるだけ。

>>728
知らんがな。
同じように書けるんなら新しい言語を導入する意味ないだろ。
制約が厳しい替わりに問題点が検出されやすいのが Rust の利点なんだから、
その利点が要らんなら別に Rust を使わんでいいよ。
2020/06/08(月) 16:43:05.54ID:LDYBA2kC
>>730
>型・寿命・所有権の条件が同じならヒープかスタックかというのは関係ない。
>お前が結果的に違う条件で書いるだけ。
1.実験してみたところ、>>727でBoxをRcに変えてもエラーのままだった。
2.単純にTAaaをスタックに確保した場合、正常にコンパイルされた。
3.TAaaを以下のようにHeapに確保した場合も、正常にコンパイルされた:
fn main() {
let bbb = Box::new( TAaa {
x : Box::new(333),
y : 444
} );
println!( "bbb = {:#?}", bbb );
println!( "bbb.x = {:#?}", bbb.x );
println!( "let x = bbb.x;" );
let x = bbb.x;
println!( "x = {:#?}", x );
}
つまり、Vec<TAaa>の場合にだけエラーになる。
2020/06/08(月) 16:57:23.12ID:KAmnJXdU
>>731
ついでに言えば >>727 のエラーが出る行を

let ref x = vec[0].x;

とか

let x = vec.swap_remove(0);

とか

let x = vec[0].x.clone();

とかすることでもコンパイルは通る。
2020/06/08(月) 17:21:28.18ID:LDYBA2kC
>>732
>let x = vec.swap_remove(0);
let x = vec.swap_remove(0).x
のことかな?
2020/06/08(月) 17:33:12.05ID:7lLHeGo6
rustじゃ書けないおじさんのコードを添削する流れ、何度目だ
2020/06/08(月) 18:00:02.94ID:ZyH0cWN6
std::mem::take
2020/06/08(月) 18:06:13.25ID:KAmnJXdU
>>733
おっと、せやな。
.x が無くてもコンパイルは通ってしまうからミスったわ。
2020/06/08(月) 18:15:14.24ID:OI3JiiYN
ID真っ赤、お顔も真っ赤w
2020/06/08(月) 18:20:45.97ID:KAmnJXdU
>>734
ワイも初心者ではあるんよ。
The book (第二版の日本語訳の無料で読めるやつ) を読み終わって、試しに 500 行くらいのコードを書いてみたって程度。
本を読んでいる間はコードを書いてない。
手を動かすと理解しやすいという人も多いけど、
感覚でやってしまいがちで書いてある理屈をしっかり把握するのが疎かになる気がするから。

で、 The book を読めばこの程度には理解できるので理解できてないやつは単にアホという証明でもあるし、
逆に返答に詰るようなら俺がまだ入門級のことが理解できてない (どこが理解できていないか) ことがわかるので
練習の題材としてちょうどいいわという気持ちで相手してた。
2020/06/08(月) 18:37:00.38ID:LDYBA2kC
>>738
では、>>732
>let ref x = vec[0].x;
の borrow が合法かどうか、どうやってコンパイラが静的に解析しているか
アルゴリズムを説明してみてください。
2020/06/08(月) 21:16:08.81ID:KAmnJXdU
>>739
let ref というのは直接的には The book に出てこないと思うけど、
let もパターンマッチだということはタプルの項目で示されている。
たとえば let a = &1; と書いたら a には 1 の参照が入るし、
let &a = &1; と書いたら a は (参照を経由する) 値になる。

参照にマッチするのではなく値にマッチさせた上で参照が欲しいときに使うのが
ref であるということは match の説明の中にある。
つまりこの場合に let ref x = vec[0].x; というのは
let x = &(vec[0].x); と書くのと理屈は同じ。
741デフォルトの名無しさん
垢版 |
2020/06/08(月) 21:34:44.64ID:RC1s4U+D
公式で丁寧にしかも無料で公開されてる本もろくに読めないガイジたちがわらわらするスレになっちまったな
ちょっと名が知れ渡っただけでこんなことになんだから、一般的になったらとんでもないな
2020/06/08(月) 22:57:09.22ID:42GeKV2i
rust+wasmちょっとやってみたけど、単純な処理に記述だけが無駄に複雑になりすぎる
組み込みとかシステム系で使われそうだけど、一般的とか言う広く色々な使われ方はしないだろコレ
743デフォルトの名無しさん
垢版 |
2020/06/08(月) 23:32:06.17ID:RC1s4U+D
JSみたいに直接DOM触れて、直接実行できるなら普及するけど、現状のめんどくささならなぁ・・・
2020/06/09(火) 00:44:22.52ID:SETbyCsO
>>740
それは分かっている。
iとjがループ内で変化したような場合、
vec[i].x
からmutableで借用した場合、
vec[j].x
からimmutableで借用できるかどうかの判定をコンパイラが一般的に行うのが難しいんだよ。
だからそのアルゴリズムを理解しているのかと聞いている。
2020/06/09(火) 00:52:40.12ID:SETbyCsO
>>744
似た例で言えば、
dst[i]をmutableで借用した場合、src[i]をimmutableで借用しようとしたときに、
srcとdstが同じアドレスに被って無いかの判定が静的には物凄く難しいと
されているので、エラーになってしまうかも知れないというようなことを心配
しているんだよ。
2020/06/09(火) 01:01:34.80ID:SETbyCsO
>>745
もっとちゃんと書くと、
src[0]〜src[99]までに対して処理するような場合だと、src[i]をaに借用してから
f(a)、g(a)、h(a)に順番に渡して何か処理するようなことは出来ると思われるが、
ここに、dst[0]〜dst[99]も加わって、dst[j]をbにmutableで借用
しようとすると、mutableで借用した場合にimmutableでは借用できないというルールを
この場合にはコンパイラが静的には判断できなくなってコンパイル・エラーになって
しまう可能性を心配している。

つまり、コンパイルの借用チェッカは、予めよくあるパターンに対して特別な
処理を実装している場合には通るが、一般的には判断できるわけ無いので通らない
のではないかと考えられるんだよ。
2020/06/09(火) 08:06:27.82ID:5kLCq/P0
このページに唐突にRustの話が出てくるのウケるな
https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/Debugging_HTML
748デフォルトの名無しさん
垢版 |
2020/06/09(火) 08:13:44.15ID:H8Y2HqIE
let x = 5;
println!("{}", if 0 < x < 10 { "in" } else { "out" });
この比較方法ができない理由ってなんかある?例えば最適化に響く?とか
可読性も労力もこれ出来たほうがいいと思うんだけど
2020/06/09(火) 10:15:42.01ID:DLyUUrRW
最初の比較でBoolになってんのを整数と比較してるからじぇね?
特に可読性が上がるとも思わないし、むしろ老眼で見逃す勢が出るから&&挟んだ方が見やすいな
2020/06/09(火) 10:25:43.24ID:ORTIF4By
その書き方ができる言語は割と少数派な気がする
pythonではできるが
2020/06/09(火) 10:40:14.84ID:0Ox9n+fW
a < x > b
これを見て何がしたいのか直感的に理解できる人間は多数派ではないだろう
結局 lb < x < ub のパターンしか使わないんなら range で十分
2020/06/09(火) 10:58:25.83ID:hxMyXunA
>>744-746
こういう感じの話? (※ 構造体を介する意味がないのでこの例では省略)

fn bar(vec: &mut Vec<usize>, i: usize, j: usize) {
let ref x = vec[i];
let ref mut y = vec[j]; // エラー
println!("{:#?} {:#?}", x, y);
}

fn main() {
let mut vec: Vec<usize> = vec![1, 2, 3];
bar(&mut vec, 0, 1);
}

vec の所有権が貸し出されるので一律に出来ない。
可能性を心配する必要はないよ。
普通の借用ルールが適用されて確実に出来ない。 (unsafe を使わない限り。)
2020/06/09(火) 13:10:15.38ID:wU3msb4d
このスレで赤連投してんのこいつとこいつか???
https://twitter.com/YutakaAoki3
https://twitter.com/SFITB
https://twitter.com/5chan_nel (5ch newer account)
754デフォルトの名無しさん
垢版 |
2020/06/09(火) 14:37:23.22ID:H8Y2HqIE
しかもそいつら繋がってんのな、Rust大嫌いなのに隠してここでやりとりしてんのな
とりあえず二人とも気持ち悪いからミュート、ブロックした
https://qiita.com/Yutaka_Aoki
https://qiita.com/SFITB
2020/06/09(火) 14:41:22.18ID:1+p+UWLN
ここはrust信者しか書き込んだらいかんらしい
2020/06/09(火) 15:07:39.63ID:FNvqfpCR
少なくともMozillaのステマが〜とか言ってた頃よりだいぶましだと思うが。
2020/06/09(火) 15:54:45.21ID:1XBt8hKf
えぇ
どっから特定されたの
2020/06/09(火) 19:23:53.82ID:9Q2vOhVs
dropが飴玉みたいって批判?がちょっと面白かった。
その発想はなかった的な。
2020/06/09(火) 20:40:17.08ID:hxMyXunA
drop out とか drop off とかのニュアンスでしょ?
スコープから消えろという意味での drop であって、結果的に解体もするというのは実装側の都合だよな。
その型を利用する側の都合からするとただ消えろって話なので、drop という語をあてるのは Rust 的にはそこそこ妥当な選択だと思える。
やることが同じだから同じというのは抽象化を軽視する暴論だ。
2020/06/09(火) 23:30:17.61ID:dBtT67N+
linuxカーネルでキャッシュをドロップする、みたいなのが用法としては近いのかな。
2020/06/10(水) 01:57:37.96ID:EI8iQv9S
>>756
https://twitter.com/YutakaAoki3/status/1270069950581858309
同一人物説

dropって命名はかなり絶妙だと思う。
時点でscoped outから取ってoutとかがいいと思うけど、outだけだと抽象的すぎるからdropが一番いい
https://twitter.com/5chan_nel (5ch newer account)
2020/06/10(水) 02:51:12.39ID:Zbkl4OJ9
そもそもdropって表現使ってる言語なんかなかったっけ??
2020/06/10(水) 08:25:50.22ID:uVgELRDi
ネイティブが決めた名前をJapsが文句言うのは流石に草
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況