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/
6258
垢版 |
2020/02/06(木) 17:27:24.00ID:xuuHNC+j
>>59
ありがと
こんな感じの欲しかった
って言うかPDFだけ読んでたから思い付かなかったけど本家にあったのか
2020/02/06(木) 20:07:27.95ID:oYYwjpH2
手を動かしたいなら自転車本もあり
オライリーはちょっと古くなってるからなー
2020/02/06(木) 22:23:34.76ID:kEyn3Q9D
オライリー本の古くなってる箇所はEdition Guide読めば問題ないよ

多少古くてもOwnershipやLifetimeあたりの重要コンセプトをわかりやすく書いてるものがおすすめ
2020/02/06(木) 22:57:58.42ID:ui7lN2G4
>>58みたいに英語でいいならrustupでインストールしたら付いてくるdocとそのリンク先にあるやつ読んだほうが良いぞ。

// ランタイム持ってないからasync/awaitがゼロコスト理論斬新すぎる
2020/02/07(金) 16:10:10.85ID:Q1mDvO6J
自クレートの名前やバージョンを取得するマクロって無かったっけ?
2020/02/07(金) 16:23:48.41ID:BIRgOLIs
Rust のライブラリって検索できるようになってるじゃん?
あれって名前だけじゃなくて引数の型とかで検索できたりしないのかなぁ。
Haskell (GHC) の Hoogle みたいに
2020/02/07(金) 16:25:17.48ID:BIRgOLIs
>>67
あ、 Inparameters ってやつをクリックすれば出てくるのか。
2020/02/07(金) 16:30:12.12ID:aVy5/bny
>>66
これ?
https://doc.rust-lang.org/cargo/reference/environment-variables.html#environment-variables-cargo-sets-for-crates
2020/02/07(金) 16:36:53.27ID:Q1mDvO6J
>>69
それだ!ありがとう
2020/02/07(金) 16:54:52.66ID:BIRgOLIs
>>69
へー。
そのための専用のマクロってわけじゃなくて cargo が環境変数を設定してくれるって話なのね。
Cargo.toml を見ないとわかるはずもないからなんらかの連携があるのは当たり前といえば当たり前だけど。
2020/02/10(月) 11:00:28.83ID:V3dAq4mT
io::Errorとかってprintln!("{:?}", err )とかしても
Os { code: 13, kind: PermissionDenied, message: "Permission denied" }
みたいに出るだけで「どのファイル」かが分からないんですが、外部のクレートの関数から上のようなエラーが帰ってきた場合それが「どのファイル」によって起きてるのかというのはどうやって知れば良いんでしょうか?
2020/02/10(月) 18:06:05.22ID:cKG4UD69
>>72
自分が明示的にパスを渡してるケースじゃなければ
クレートの作者にファイルパスも入れてクレメンスするしかないかも
74デフォルトの名無しさん
垢版 |
2020/02/10(月) 20:19:23.72ID:vX14wve5
バイナリサイズはまだCの方が全然小さいけどRustはC以上になにが含まれてるの?
もちろん標準ライブラリとかは使ってないやつはバイナリに含まれないよね?
2020/02/10(月) 21:25:29.97ID:XC+zOH9l
>>74
明らかに大きいのはbacktrace用のデバッグシンボル。
これはstripすれば縮む。
それ以外はC側が共有ライブラリとしてどれだけ外に出してるかによるかと。
2020/02/10(月) 22:55:31.36ID:t0EW4OCb
メモリ管理がランタイムにあるしdrop checkerもあるからランタイムはデカイよ。
77デフォルトの名無しさん
垢版 |
2020/02/10(月) 23:49:02.35ID:vX14wve5
>>75
backtrace用のデバッグシンボルってreleaseでもついてくるの?

>>76
drop checkerってborrow checkerの書き間違え?borrow checkerってcompile-time以外でも走るのって一部の実装だけって認識だけど
ARCとか使うとランタイムとか増えるの分かるけど使ってないハロワだけのやつでもCより多いのが疑問
2020/02/11(火) 00:10:31.83ID:v/oRLdRM
https://www.reddit.com/r/rust/comments/bzdwru/hello_world_executable_size_268k_in_rustrelease/
79テトリス ◆SYKnw8OJpw
垢版 |
2020/02/11(火) 00:36:46.52ID:DhLQ/nua
Windows10のキャラクターがゴミ過ぎて無駄に苦労する
やっぱLinux使うしか無いんか?
でもゲームしたいからWindows環境が良いんだよな…
2020/02/11(火) 01:09:07.15ID:qG/miOyM
>>77
releaseでもデバッグシンボルはついてくる。
取って欲しいってIssueは立ってるけど
stripすればいいって感じなのか、あまり動きはない。
あとCのHelloWorldが小さいのはコードの大半が
libcにあるせいなのでは。
2020/02/11(火) 01:18:02.99ID:v/oRLdRM
バイナリサイズを小さくしたいならここを読む
https://github.com/johnthagen/min-sized-rust
2020/02/11(火) 18:54:33.07ID:Vv3Ln0ZS
組み込みで使おうなんて本気で考えてる奴はこんなところで聞いたりせんだろ。
2020/02/12(水) 12:54:11.29ID:F/O7jTJS
>>70
いえいえ
2020/02/17(月) 17:53:09.28ID:qpTD/rYC
cargo install mdbook

としたとき、依存するライブラリクレートも一斉にインストール (というかキャッシュみたいな扱い?) されたようです。
ローカルに入ったライブラリクレートのドキュメントから一斉に、網羅的に検索する仕組みはありますか?
標準ライブラリのドキュメントは名前や引数で検索できますが、それを手元に入っているライブラリ全てに拡大したようなものが欲しいです。
2020/02/17(月) 18:00:40.10ID:4asOCOmT
>>84
ビルド用の一時ディレクトリ以下に展開されただけで他から使えるようにはなってないよ
2020/02/17(月) 18:17:09.06ID:qpTD/rYC
>>85
そうなんですか。 Windows でやってるんですけど、
C:\Users\<ユーザー名>\.cargo\registry\src
に入っているのはビルド時の一時ファイル扱いという理解でいいんですかね?

他のプログラムをビルドしたときに必要になるライブラリクレートに共通するものが (このフォルダに) あったときでも
使いまわしはされないんでしょうか?
見かけ上は独立してるけど cargo が裏でうまいことやってくれるって感じなんでしょうか?

本当は Cargo book を読めばいいんでしょうけど、英語がわからなすぎて基本的な理念がよくわかってないです。
2020/02/17(月) 20:49:03.97ID:P9Oy3OK5
$ cargo doc --open
doc生成すればプロジェクトの依存クレートすべてWeb形式で検索できるけど
そういうことではない?
2020/02/17(月) 22:42:46.96ID:ksspevQp
>>84
cargo installはバイナリクレートをインストールするためのワンライナーなんで
ライブラリクレートをどうこうする為のものではないよ。
バイナリのビルドに成功したら.cargo\binにコピーしてゴミは削除する。
バイナリクレートのドキュメントを読みたいならそれ自身を読みに行くんだよ。
rustdocは開発者向けでユーザー向けじゃない。

mdbookのrustdocが読みたいなら単にソースコードをクローンして自分でcargo doc叩けばビルドしてくれるけど。
2020/02/18(火) 00:10:35.64ID:AiY0lHAj
構造体のメソッドでメンバ変数の値ひっぺがすのにstd::mem::take使うの面倒だな
9084
垢版 |
2020/02/18(火) 10:09:42.44ID:Nm2LYTxd
>>87
「そのプロジェクト (に依存する全ての)」ではなく「ローカルに残っている全ての」というつもりでした。

>>88
> cargo installはバイナリクレートをインストールするためのワンライナーなんで
> ライブラリクレートをどうこうする為のものではないよ。

「為のものではない」ということは察していたんですが、
ライブラリのソースコードは残っているので裏で Cargo が動くために情報を残してもいるのだろう
と考えて特定のプロジェクトに限定せず横断的な処理をする方法があるのかどうかということを考えていました。

バイナリクレートをアップデートするときのために残してあるだけなんですかね……?
とりあえず、プロジェクトごとに独立していると考えておきます。
2020/02/18(火) 10:18:22.88ID:dnK/GzEr
>>90
.cargoは全プロジェクト共通のキャッシュなので
プロジェクトまたいでも再利用はされる。
ただcargoコマンド自体はプロジェクト毎の操作しか提供しない、という感じ。
そういうツールを作ること自体は可能と思うけど。
9284
垢版 |
2020/02/18(火) 10:59:25.45ID:Nm2LYTxd
>>91
なるほど。
見かけ上はプロジェクトの独立性があるように抽象化されているという感じですね。

なるべくなら過去に使ったことのあるライブラリクレートから使えそうなものを
探した方がキャッシュ (?) の増大を抑えられるし、
よく使われるライブラリの方が信頼性が高いだろうというのが元々の動機でした。

ツールの使い方もおぼつかないので定番と言えるのがどのあたりなのかとかいった肌感覚もなくて、
実際のコードを色々と見て回るのにどういうやり方が良いのか模索しています。
2020/02/20(木) 05:16:24.39ID:xc5wKacK
https://ideone.com/6mGYO9

これの14行目15行目のところを10行目のところのように1つの文で書ける方法ってありますか?
2020/02/20(木) 19:48:24.79ID:s7d9UeaP
Haskell の default 宣言みたいなのは Rust にありますか?

たとえば関数 foo が返す値の型が a もしくは b の可能性があり、
関数 bar が受け取る値の型が a もしくは b のときに bar(foo()) という式で型が定まりません。
このときに a と b の間での優先度を決める方法があるかという質問です。

具体的な状況があるわけではなくて、言語機能を学ぶ中で生じた疑問です。
2020/02/20(木) 20:19:05.71ID:s7d9UeaP
>>93
こんな感じかな。

buf = buf.replace(ch, &<String as std::iter::FromIterator<&char>>::from_iter(&[' ', ch, ' ']));
2020/02/20(木) 20:57:27.42ID:xc5wKacK
>>95
thanks!
2020/02/20(木) 21:07:18.17ID:uEuAMc9c
俺だったらformat!(" {} ", ch)にするかforを[" ( ", " ) ", ...]で回すかな
2020/02/20(木) 21:09:56.45ID:NbeJLDuu
>>94
>たとえば関数 foo が返す値の型が a もしくは b の可能性があり

Rustで戻り値の型が1つに決まらない関数書ける?
2020/02/20(木) 21:27:49.34ID:ftgOjFn2
型が曖昧な時はだいたいターボフィッシュでなんとかなるやろ
2020/02/20(木) 21:55:52.56ID:nsHNq1aE
>>94
型が定まらない関数は定義不能。
aまたはbを返したいならenum c {a, b}にしてcで返すしかないかと。
2020/02/20(木) 22:48:30.93ID:OjLUij7y
>>94
rustはsum typeしかない。それだと実行時に型を評価する方法とunion typeがいる。
102デフォルトの名無しさん
垢版 |
2020/02/21(金) 01:30:08.71ID:8YUMmgA9
正直TypeScriptの1 | 2 の型記法欲しい
2020/02/21(金) 08:48:56.60ID:jEzn3g3M
>>94 って多分こういう事では?

trait X { ... }
impl a for X { ... }
impl b for X { ... }

fn foo<T: X>() -> T { ... }
fn bar<T: X>(_: T) { ... }

bar(foo())

Rust の文法詳しくないんで間違ってたらすまん
2020/02/21(金) 09:15:56.88ID:6JU7BGK2
>>103
もしそうならdyn Xで返せばいいね。
その場合は型がAかBかの評価は実行時になるけど
どちらにしてもAとBのどっちを優先する、みたいなのはないな。
10594
垢版 |
2020/02/21(金) 10:40:19.65ID:zBjm2h3y
>>103-104
近いですが a と b との関係がもっと無関係なもの (仮想関数を使えない) を考えていました。
コードにするならこんな感じです。

struct Foo {}
struct Bar {}
trait X<T> { fn foo(&self) -> T; }
trait Y<T> { fn bar(&self, T); }
impl X<Foo> for Foo { fn foo(&self) -> Foo {Foo{}} }
impl X<Bar> for Foo { fn foo(&self) -> Bar {Bar{}} }
impl Y<Foo> for Bar { fn bar(&self, _x: Foo){} }
impl Y<Bar> for Bar { fn bar(&self, _x: Bar){} }
fn main() { Bar{}.bar(Foo{}.foo()); }

いずれにせよ方法はなさそうですね。
型を明記すればよい話ではあるのですが、ふと疑問に思ってしまったもので。
106デフォルトの名無しさん
垢版 |
2020/02/21(金) 13:18:50.41ID:sx356ht7
いや、こちらも勉強になるよ。
2020/02/21(金) 15:11:57.88ID:RiyafmFC
型推論でどの型のメソッドを呼び出せばいいか決まらないときに
特定の型のメソッドを優先させるような記述方法があるかってことだったのか
>>99のエスパー力すごいな
2020/02/21(金) 15:21:44.11ID:RiyafmFC
ターボフィッシュで指定するか型指定した変数で一旦受けるかだね
https://play.rust-lang.org/?gist=3d288900b3f655687d0ba22cc37cbb23

逆にこのケースでdefaultの型が決まっちゃうのってちょっと怖い
10994
垢版 |
2020/02/21(金) 18:02:02.28ID:zBjm2h3y
Rust の型システム (Hindley-Milner) は ML 系言語で実績があるやつなので、
(型に関して) ML 系で出来ることはおおよそ出来るのではないかと思いつつ、
Rust 的には明記させたい場面かもな……みたいな気持ちでした。

やはり勝手に決まって欲しくないというのが Rust ユーザの感覚なんですね。

※ Haskell が ML 系と言えるかどうかは諸説あります
110デフォルトの名無しさん
垢版 |
2020/02/22(土) 01:53:24.77ID:eI8xgqVo
これ出来たらかっこいい見たいな型推論の活用ってある?
2020/02/22(土) 12:47:45.08ID:T3jMerUl
ファントムタイプは(名前が)かっこいい
2020/02/22(土) 16:08:52.19ID:5jIrjfcF
C++ をやってた感覚から言うと Rust の str::parse っていいよね。

C++ は返却値の側からの推論が無いから普通の関数 (メンバ関数) として parse みたいなものを書けない。
いや、書けるけど型が推論されないからいちいち型を明記しなけりゃならない。
昔は演算子でやる C++ のスタイルを上手い案だと思ってたけど、
普通に関数 (メソッド) でやれるもんならその方がいいわ。
2020/02/25(火) 12:01:50.32ID:35/v8OB/
異なる関連型を持つ複数のトレイトオブジェクトを1つのVecに入れるのはAnyとかを使わないと無理でしょうか?
2020/02/26(水) 07:52:56.79ID:Es0cXQkx
IntelliJのRustプラグイン、ここのところぶっ壊れてないですか?
2020/02/28(金) 06:03:14.29ID:4nSGV1YY
1.41.1
2020/02/28(金) 12:10:25.14ID:Pr6ovKv/
これは大失態だな
117デフォルトの名無しさん
垢版 |
2020/03/03(火) 21:00:42.72ID:aQWPV0PM
static TEST = &'static str = "test";

このTESTの文字列の最後の一文字だけを参照として&'static charで作ることってできる?
型レベルで一文字ってことを保証したいのとメモリ節約したい
2020/03/03(火) 21:53:23.53ID:NDXXif57
>>117
charは4byteで&strはutf-8でasciiの部分は1byteだから無理そう。
2020/03/03(火) 22:01:05.88ID:Bj/i6Nw/
charは4バイトでポインタ(参照)は8バイトだから節約するどころかむしろメモリ食ってるなwww
2020/03/03(火) 22:09:48.50ID:lzYVFoFM
charにする場合は’staticは無理なんじゃないかな
&strをsliceして1文字分にしたほうが素直だと思う

let x: &'static str = "test";
let y: &'static str = &x[x.len()-1..];
let z: &char = &x.chars().next_back().unwrap();
2020/03/03(火) 22:48:24.81ID:EQ8N775K
そこまでメモリ節約したいって組込系か何かか
2020/03/03(火) 23:11:15.82ID:VHyE3ijH
charでなくu8を使うシーンに思える
2020/03/03(火) 23:13:54.10ID:EQ8N775K
asciiと分かってるなら u8 だよね
どっかで u8 ベースの文字列操作ライブラリ見かけた気がする
2020/03/03(火) 23:14:25.42ID:YHPxp8LF
>>120
それだと最後の1文字が2バイト以上の時に死ぬから
結局全体をcharsするしかないような。
2020/03/03(火) 23:30:49.39ID:EQ8N775K
これだ
https://crates.io/crates/bstr
作者が有名人なので前にチェックしてた
126デフォルトの名無しさん
垢版 |
2020/03/04(水) 00:03:26.33ID:g8GJiSIM
おお、いっぱい回答くれた ありがとう
レス止まってたけど見てる人はいるんだね。

素直にsliceしようと思ったけど、
str.chars.last()
このlastって消費されないけどなんで?
型的には
fn last(self) -> Option<char>
だけどなんで消費されないか分かんない
&strみたいな元々消費不可能ならコンパイルエラーでると思ってたんだけど。
https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.last
2020/03/04(水) 00:12:13.85ID:/mNi51EN
消費されるのは&strじゃなくてそのイテレータだからね。
"abcd".chars()で得られるのは、{ String : source, index : 0 }みたいな形のChars型で、これがindexをインクリメントしながら文字を取得してくれる。
128デフォルトの名無しさん
垢版 |
2020/03/05(木) 00:35:43.70ID:cMoNZaaE
use std::fmt::{self, Display, Write};
このselfってどういう意味?
2020/03/05(木) 00:38:13.00ID:S5c20Dqb
>>128
use std::fmt;と同じ。
130デフォルトの名無しさん
垢版 |
2020/03/06(金) 00:28:35.73ID:s+8hbWLf
まさにこの質問と同じ状況でコンパイル出来ないんですけど、分かる人いますか?
https://stackoverflow.com/questions/46393890/mutable-borrow-in-loop
2020/03/06(金) 01:12:13.19ID:n2xpzai7
>>130
回答に書いてあるじゃん・・・
dostuff()やfixme()が受け取るselfに’aでlifetimeアノテーションをつける理由ないよね
132デフォルトの名無しさん
垢版 |
2020/03/06(金) 19:38:23.62ID:s+8hbWLf
>>131
ライブラリ側が同じデータ構造しててループで回したいけど同じエラーで出来ません
これって並列にループ回す可能性があるからシングルスレッドでも禁止されるんですか?
すみません、初心者で
2020/03/06(金) 21:38:26.09ID:n2xpzai7
>>132
ある値に対するmutable referenceは同時には1つしか存在できない
ってのはRustの基本ルールの1つ
この場合は並列に回す可能性があるかどうかは関係ない

Test構造体自体のライフタイムが’aで
dostuff()が&’a mut selfを取るなら
1回目のdostuff()呼び出し時にselfをmutableに借りてくるけど
Test構造体のライフタイムと同じだけ借りることになるから
2回目のdostuff()呼び出し時には1個目を借りたまま2個目を借りようとしてることになる
だからエラー
134デフォルトの名無しさん
垢版 |
2020/03/07(土) 13:13:11.28ID:e127m1PH
>>133
なるほど。
ライブラリ側なので修正できないんですが、AcとRefCell使って解決できる問題ですか?
2020/03/08(日) 08:35:20.95ID:MryPyRvf
>>134
どのライブラリのどのメソッド?
2020/03/08(日) 11:34:51.20ID:gavt1hh0
その構造体の意図が分からんので、あんまりアドバイスできない
単にライブラリ作者がrustに慣れていないだけなら、適切な形に直してもらうのがシンプルで合理的だし、
>>130のTest::fixme相当のメソッドは誰にも呼び出して欲しくないのかもしれないなら、使うべきじゃない
Test::dostuffを繰り返し呼び出したいだけならRefCellで何とかなる
2020/03/08(日) 11:38:51.13ID:gavt1hh0
Rustで型パズルみたいな状況になるのは、見落としている前提があったり、設計レベルで何か考慮が足りないことが原因な事が多いと個人的には思ってる
姑息な解決をしてたら余計にドツボにはまる
138デフォルトの名無しさん
垢版 |
2020/03/09(月) 04:03:43.73ID:FXqsuorv
>>135
>>136
このライブラリです。
https://github.com/fulmicoton/kuromoji-rs
https://github.com/fulmicoton/kuromoji-rs/blob/master/src/lib.rs#L246-L256

こういう風に使おうとしていて、Testと同じ状況です。
let mut tokenizer = kuromoji::Tokenizer::normal();
for s in ["Example", "Example2"].iter() {
tokenizer.tokenize_str(s);
}
2020/03/09(月) 06:35:47.93ID:wpD0c2Sy
>>138
Tokenizer自体は'aで定義されてないからTestとは状況違うんじゃない?
2020/03/09(月) 10:07:04.49ID:KfBbpF5w
コンパイラをだましても本質的な解決にはならん。
そろそろrustマンセーしてる輩も気づくころだろうね。
2020/03/09(月) 12:37:33.41ID:DOrcZre+
なんかトレイトの命名でなるべく名詞ではなく動詞を使う(WriterではなくWrite、ReaderではなくRead)みたいなのがオフィシャルの文書で有ったような気がするんだけど見つからない
そんな指針って無かったっけ?
2020/03/09(月) 12:52:18.51ID:lyteAeVl
>>141
オフィシャルにはapi-guidelinesだと思うけど特になさそう。
このissueで議論されてるけど特に結論はでてないし。
https://github.com/rust-lang/api-guidelines/issues/28
2020/03/09(月) 13:05:24.07ID:CscrLobz
>>141
話し合いしている様子は見つけた。
https://github.com/rust-lang/api-guidelines/issues/28
どちらを優先するという話ではなく、使い分けがあるっぽい。
2020/03/09(月) 21:11:10.09ID:tRF5zhFi
一年くらい前に挫折して最近また勉強し始めたんだけど参照周りの仕様変わった?
https://doc.rust-jp.rs/rust-by-example-ja/scope/borrow/freeze.html
これとかエラーにならないし
2020/03/09(月) 21:47:20.13ID:oO+VEyrl
>>144
昔は一度借用するとスコープアウトするまで借りっぱなしだったけど、今は使われなくなった時点で返すようになってる。
non lexical lifetimeというやつ。
英語版だとちゃんとエラーになるように修正されてるね。
https://doc.rust-lang.org/rust-by-example/scope/borrow/freeze.html
2020/03/09(月) 22:32:56.28ID:Wg77JZ2S
>>138
試しに触ってみた感じだけど、戻り値をVecに格納しようとすると怒られるよね。
で、よく見ると引数のtextはtokenizer自身と全く関係の無い寿命であって良いのに、tokenizerとtextの寿命が同じであるってシグネチャで言ってるから何かマズそう
多分もっと理解できる人も居るだろうけど、selfとtextの寿命を無関係にしたら動くってなんとなく分かる
pub fn tokenize_str<'s, 'a>(&'s mut self, mut text: &'a str) -> Vec<&'a str> {
ってやったら動くよ。省略ルールで
pub fn tokenize_str<'a>(&mut self, mut text: &'a str) -> Vec<&'a str> {
と同義。

俺の頭の中の理解じゃプルリク送れるほど明快に説明できないが、適当にローカルに落とすかgithubでforkして使っても良い
2020/03/09(月) 22:35:30.43ID:tRF5zhFi
>>145
non lexical lifetimeっていうのね。Rust日本語情報が少ないので助かるわ。thx
2020/03/09(月) 23:22:38.75ID:hlMkZByK
>>147
しかしそもそも借用によるフリーズって意味なくなってるから
そのページ全体書き直した方がいい感じ。
フリーズするならシャドーイングによるmut外しかな。
2020/03/10(火) 15:02:44.20ID:eonxFH18
>>138
Linderaってのがkuromoji-rsの後継らしいからそっち使えば?
https://qiita.com/mosuka/items/0fdaaf91f5530d427dc7
https://github.com/lindera-morphology/lindera

該当箇所のライフタイムは修正されてるのでtokenizerのインスタンスをループで使っても問題ない
https://docs.rs/lindera/0.3.4/src/lindera/tokenizer.rs.html#163-173

ただドキュメントは整備されてないし
ライブラリ自身のテストも通らない状態になってるから
本格的に使うなら自分でメンテするくらいの覚悟が必要かもしれん
150デフォルトの名無しさん
垢版 |
2020/03/10(火) 19:42:21.39ID:jwXWuMzy
>>149
ありがとうございます、後継なんてあったんですね。
最近出来たみたいですがそれほどメンテされてないみたいですしこの先不安なので素直にPython使うことにします。
日本関係依存のライブラリはRustユーザー少ないので確立されたものがないのが辛いですね...
2020/03/10(火) 19:58:15.03ID:uPXabSQ0
rustも字句解析も相当知ってなきゃそれ使うの無理だろ。。
2020/03/11(水) 18:46:16.77ID:TDIek7NK
vecのinto_iter呼んだらconsumeするって
fn into_iter(self) -> イテレータ {self}
こういうふうになってるってこと?
よく分かってない質問ですみません。
2020/03/11(水) 18:56:11.75ID:TDIek7NK
あ、consumeじゃないわこの場合
moveって言いたかった
2020/03/11(水) 19:43:34.97ID:TDIek7NK
自己解決?

https://doc.rust-lang.org/std/vec/struct.Vec.html#impl-IntoIterator
impl<T> IntoIterator for Vec<T>

こうなってるからそのまま self を返してるに違いない
よーわからんけどなんとなく納得
155デフォルトの名無しさん
垢版 |
2020/03/11(水) 19:46:02.45ID:vu1i9ieU
よく分からないのに納得してしまうのはよくない
2020/03/11(水) 20:15:44.69ID:aaR0sYBN
>>154
ソースで理解したいんならここ。

https://doc.rust-lang.org/src/alloc/vec.rs.html#1934-1952

Vecのポインタを使ってIntoIterを構築して、元のVecはforgetでメモリ管理対象から外してる。
157デフォルトの名無しさん
垢版 |
2020/03/11(水) 20:40:35.00ID:TDIek7NK
>>155 おっしゃるとおり
>>156 おおおお!!!
想像とは違ってunsafeの中であれこれしてた!
impl<T> IntoIterator for Vec<T> {
type Item = T;
type IntoIter = IntoIter<T>;
fn into_iter(mut self) -> IntoIter<T> {
unsafe {
let begin = self.as_mut_ptr();
let end = if mem::size_of::<T>() == 0 {
arith_offset(begin as *const i8, self.len() as isize) as *const T
} else {
begin.add(self.len()) as *const T
};
let cap = self.buf.capacity();
mem::forget(self);
IntoIter {
buf: NonNull::new_unchecked(begin),
phantom: PhantomData,
cap,
ptr: begin,
end,
}
}
}
}
いやあ勉強になります
2020/03/11(水) 22:03:42.73ID:JP1MFGqI
fn into_iter(mut self) -> IntoIter<T>

このmut selfのmutの使い方について
意味は理解してるんだけど公式で解説してる箇所ある?
159デフォルトの名無しさん
垢版 |
2020/03/11(水) 22:44:26.55ID:PgaAGaoo
なんでextern crate crate_name;ってuse crate_name;に統合されたの?
2020/03/11(水) 23:04:39.68ID:JP1MFGqI
>>159
RFCに書いてある理由はこの辺り
https://github.com/withoutboats/rfcs/blob/modules/0000-modules/motivation.md#underlying-problems
2020/03/12(木) 06:53:02.39ID:/EHADneN
serde, reqwestとかを使ってるだけの小さいツールなのに
targetディレクトリ以下がいつの間にか2GB以上喰ってて驚いた
無駄遣いしすぎだろ
162デフォルトの名無しさん
垢版 |
2020/03/12(木) 09:00:30.33ID:TSUJe0Rk
ぜろこすとおーばーへっど(笑)
■ このスレッドは過去ログ倉庫に格納されています