X



プログラミング言語 Rust 4【ワッチョイ】
0001デフォルトの名無しさん (ワッチョイ 83b3-KDL3)
垢版 |
2017/12/24(日) 18:27:01.98ID:EGydBhQv0
Mozilla発のプログラミング言語「Rust」のスレです

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

■ワッチョイ
スレ建て時、一行目に
!extend:on:vvvvv:1000:512
を入れること

■派生元スレ
プログラミング言語 Rust 4
https://mevius.5ch.net/test/read.cgi/tech/1507970294/
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
0092デフォルトの名無しさん (ワッチョイ bdb3-kj1m)
垢版 |
2018/03/18(日) 23:09:22.36ID:UNqGf23T0
does not live longエラー関係は自分が思ってるより広い視点で見た方が解決するんじゃないかなあ
Hito.konomi_no_mochiは参照なんだから、参照元としてVec<Mochi<'a>>を保持しないと駄目なんじゃね?
=>mochiがMapになってて分かりにくい
=>とりあえずcollectさせてVec<Mochi>持ったら動いた
みたいな。
https://play.rust-lang.org/?gist=6c9947e3584f1feb5bb14f07d27aa9c7&;version=stable
多分、頭の良い人ならもっと綺麗な説明と解法があるんだろうけど
0093デフォルトの名無しさん (ワッチョイ 2bb3-yeMC)
垢版 |
2018/03/19(月) 07:39:54.89ID:bmK7HIBH0
>>92
ありがとうございます
仮引数mのライフタイムはmain関数が抜けるまでだから通るということで合っていますか
またVecではなくIterator::Mapだと駄目な理由は、Iterator::Mapはcollectされるまでクロージャが実行されないから…とかでしょうか
0094デフォルトの名無しさん (ワッチョイ bdb3-kj1m)
垢版 |
2018/03/19(月) 13:44:00.51ID:aUxUFBJe0
>>93
仮引数mのライフタイムはクロージャ内なのは変わらないよ。>>92は仮引数を参照じゃなく消費してるから通る(>>92の&mじゃなくてmで良い)
クロージャが実行されないから、ではなく、mochiの値が消費されてるのにその参照を持たせようとしてるから駄目
試しに>>91のコードでmochi.map(|m| { 0 })とか書いて、mochiをprintln!に渡してみようとすると怒られるよ。もう使ってるって。

そこらへんの細かいルールを覚えるの大変だし、コンパイラもまだ分かりやすいエラーメッセージ吐いてくれないから、
・参照を使うときは、参照元をちゃんと生かしておくこと
・参照を使った構造体は、元の値を修飾(見方を変える、新しい機能を持たせる等)するようなパターンに限定すること
を守るようにした方がいいよ
0095デフォルトの名無しさん (ワッチョイ 2bb3-yeMC)
垢版 |
2018/03/19(月) 21:04:17.46ID:bmK7HIBH0
>>94
「消費したものの参照を持たせるのは駄目」と「消費しているから通る」はそれぞれはわかる気がするのですが、両方となると…
前者の「消費したもの」と後者(main関数中生き続けるMochiのベクトル)は別物だと思うのですが、
前者で駄目な理由は関数中生き続けるMochiがない(mapを呼び出しただけでは駄目)ということですか?
0096デフォルトの名無しさん (ワッチョイ bdb3-kj1m)
垢版 |
2018/03/19(月) 23:26:36.74ID:aUxUFBJe0
「消費されるので通る」じゃ言葉足らずでした。「参照じゃなくmoveして延命している」の方が通じるかも

>>91のコードを整理すると
1. HitoはMochiの参照を持ってるから、Hitoが有効なスコープ中はMochiも有効じゃないといけない
2. mochiはinto_iterで作られてるからMochi型を吐き出す、けど所有はしない
3. なのにmochizukiはmochi.map()で各要素への参照しか持たない
4. mochiから吐き出されたMochiの受け皿が無いんでエラーになる

これを解決するには
1を変えてHitoがMochiを所有するようにデータ構造を変える
2で作られたMochi型の値をしっかり保持する変数を用意する
の2種類くらいしか思いつかん。
Does Not Live Longエラーはライフタイムがどうのこうのと小手先で弄るより、
値の所有者を明快にしたり、データ構造を見直してみると案外素直に直せるのが経験則。
0097デフォルトの名無しさん (ワッチョイ abb6-ogOK)
垢版 |
2018/03/20(火) 13:21:28.84ID:RDB2KieC0
>>96
loop{
let (a, cond): (&str, bool) = get_too_many_str();
let m = Mochi{aji: a};
let h = Hito {m : &m};
if(cond){ break; }
}
// ここでhのvecが欲しい

この場合は、ムーブする(ループより長いライフライムの)変数がないので1の手法しかないということになりますか?
そこそこでかい文字列を扱っているので気を使っていたのですが、この場合Stringにすべきでしょうか
0098デフォルトの名無しさん (ワッチョイ bdb3-kj1m)
垢版 |
2018/03/20(火) 14:30:32.82ID:UUyTwokV0
大きい文字列を扱うから参照にしたいってのは普通にあるし分かるけど
Hitoが&MochiでなくMochiをメンバに持つようになっても文字列のコピーは行われないよ

自分なら>>97のget_too_many_str()が返す&strの元を誰が保持するのかをまず気にする
そこをしっかり把握してれば文字列のコピーは最低限になるはずだから
0100デフォルトの名無しさん (ワッチョイ 2bb3-yeMC)
垢版 |
2018/03/21(水) 11:43:51.64ID:cBTkQiaM0
&strの元もloop内の変数が持っています
hのvecを作るにはコピーは避けられないようですね…
&strからStringに変えたところhvec.push(h)してもエラーにはなりませんでしたが、
スコープを抜けたはずの変数が使える理由ってどこかに書いていますか?
0101デフォルトの名無しさん (ワッチョイ bdb3-kj1m)
垢版 |
2018/03/21(水) 14:53:30.44ID:9rI6JIRt0
そりゃloop内の変数hから、loop外のhvecに所有権が移動したから

頭の中に入れておける物なんて極わずかだし、場当たり的にdoes not live longエラーに対処するのは大変なので、
・値の所有者はどの変数であるべきか
・データ構造はどうあるべきか
という観点だけ念頭にいれて、「性能を稼ぐために参照を使おう」って考えを一旦外すとスッキリするよ
0106デフォルトの名無しさん (アウアウエー Sadf-Mqc2)
垢版 |
2018/04/15(日) 22:44:53.22ID:UX4y5Mn1a
てst
0108デフォルトの名無しさん (ワッチョイ a364-0hQO)
垢版 |
2018/05/08(火) 02:44:07.65ID:kruQSPFC0
別にアンチって訳じゃないけど、コンパイルが遅すぎる(特に最適化掛けた場合に)のはどうかと思う。
実行が速くてもその生成に時間が掛かれば無意味でしょう……。
0110デフォルトの名無しさん (ワッチョイ 1f97-q47z)
垢版 |
2018/05/08(火) 07:00:09.03ID:EnN/pyur0
逆なら理解できるけど
0112デフォルトの名無しさん (ワッチョイ 0bb3-XZ5U)
垢版 |
2018/05/08(火) 20:14:50.84ID:T0pMALEX0
rustcで単一ファイルだけコンパイルすると結構速いなと思った
cargoって警告無視のオプション(-Awarning)の有無でも一からビルドしようとしたりちょくちょくお粗末
0115デフォルトの名無しさん (JP 0Ha1-pXmg)
垢版 |
2018/05/23(水) 12:09:39.17ID:6kVmIohDH
ほとんどc++に見えるの俺だけ?
0116デフォルトの名無しさん (ワッチョイ 5523-/w+O)
垢版 |
2018/05/23(水) 12:29:18.87ID:4/oN1Bt60
みんな言ってる
0117デフォルトの名無しさん (ワッチョイ 89fa-9WOx)
垢版 |
2018/05/23(水) 23:15:50.94ID:Au5e7VGg0
確実にどんな人でも可能なネットで稼げる情報とか
念のためにのせておきます
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

C717P
0118デフォルトの名無しさん (JP 0Hcd-6rHD)
垢版 |
2018/05/28(月) 09:59:15.77ID:N9/pBFPWH
rustを始めたんだけど
分かりそうで分からなくて
イライラする

なんだこの言語
0120デフォルトの名無しさん (JP 0Hcd-6rHD)
垢版 |
2018/05/28(月) 11:14:23.86ID:N9/pBFPWH
actix_webでちょちょいとwebサービス作ろうと思っただけなんだが

externとuseみたいに、なんで同じようなものが2つ有るのとか

trait?、インプリすればいいだけならなんでこんな名前なんだとか
0121デフォルトの名無しさん (ワッチョイ 512d-MMi0)
垢版 |
2018/05/28(月) 11:44:10.53ID:4ZqBL5Re0
察するにJava経験者かね

externは外部ライブラリのモジュールを参照する宣言
modは自身のフォルダ以下のモジュールを参照する宣言
useはモジュールの要素(Struct or Trait)を取り込む宣言

pub use self::MyStruct; // 要素をexportしたり
use std::io::Error as IOError; // as で別名つけたり
use super::Result; // 上位の型を取り込んだり(mod.rs以外からだと同一フォルダのmod.rsを見にいくので注意)

肝はselfとsuperを使いこなすことかと
このあたりリファレンスに書いてあるんで落ち着いて読んでもらえばいいけど

インプリについては、Trait = Interface(Java)の理解でそれほど差し支えない気もするけど
(定数は同じ階層のmoduleに移す)
AssosiatedTypeがあるように"Traitはコンパイル時に解決できる"ものってのを
意識してればその内に腑に落ちるんじゃないかな

ただこんなこと言うと
「RustのTraitは厳密なtraitじゃない論争」(Wikipedia参照)が始まっちゃうかもしれないので
ゆるく受け流してほしいところ
0124デフォルトの名無しさん (JP 0Hcd-6rHD)
垢版 |
2018/05/28(月) 14:35:19.27ID:N9/pBFPWH
チュートリアルの和訳のところを読んでいるけど
誰が訳したんだろう。。。
0126デフォルトの名無しさん (JP 0Hcd-6rHD)
垢版 |
2018/05/28(月) 15:47:39.28ID:N9/pBFPWH
しばらくしたら言語仕様変わりそうだなあこれ
勉強していくべきなのかどうか迷う
0157デフォルトの名無しさん (アウウィフ FF85-mzC7)
垢版 |
2018/07/01(日) 15:40:20.37ID:ep584YMHF
秀丸
0158デフォルトの名無しさん (ワッチョイ 79b3-HrKv)
垢版 |
2018/07/01(日) 18:12:28.40ID:VIP13YQk0
禿丸ってなに?
0161デフォルトの名無しさん (ワッチョイ 45fa-2e90)
垢版 |
2018/07/04(水) 21:50:46.22ID:gFgZc5FG0
5PW
0162デフォルトの名無しさん (ブーイモ MM2b-0Xn2)
垢版 |
2018/07/05(木) 00:59:18.40ID:lJi2a9VDM
おーい、hgmr
0164デフォルトの名無しさん (ワッチョイ 12d5-YWSl)
垢版 |
2018/07/29(日) 02:13:01.57ID:QHCaZ13N0
まさか繋いでくれる人がいるとは思わなかった
0168デフォルトの名無しさん (ワッチョイ dfad-VZQ6)
垢版 |
2022/05/03(火) 15:19:34.90ID:FP7f4hyR0
Rの発音が難しい
0170デフォルトの名無しさん (ワッチョイ 7501-zStA)
垢版 |
2022/11/13(日) 22:46:23.74ID:gb51z1Py0
日本語の発音ってかイントネーションはみんなどっち?
ラスト(ミファファ=スタバ)
ラスト(ミドド=ベスト(着る方))
0172デフォルトの名無しさん (ワッチョイ 1f5f-MR5z)
垢版 |
2022/12/18(日) 17:46:12.72ID:fqk1SiW30
本スレ最近ひどいね
age
0173デフォルトの名無しさん (ワッチョイ d3c9-tb1I)
垢版 |
2023/01/09(月) 20:41:28.12ID:XnWHdmBW0
Rustの型って何を言ってるのか良う分からないくらい一気に複雑になるんだけど、改善の兆しってある?
filter(|x| ...).map.(|x| ...)ってやると戻り値がMap<Filter<...>>みたいに、情報量がほぼ増えないのに型の表記だけが増えてくのが見づらくてしゃあないんだが

「ここを関数に切り出しておきたい」ってのも難しくね?
impl Traitあるだろって言われるけど、自分ひとりでできた試しが無い
0174デフォルトの名無しさん (ワッチョイ 1301-nt2E)
垢版 |
2023/01/09(月) 22:31:09.52ID:ZXgjuOo50
>>173
.filter(|x| ...).map.(|x| …)とやったら
ざっくり言うと戻り値はIterator<Item=T>でowned, shared reference, mutable referenceの3種類
Map<Filter<...>>とかの詳細な型を知りたいと思うことは基本ないからそこまで困らない
デコレータとかコンポジション的なものとして理解しとけばいいと思う

関数に切り出すのはGC言語と比べると難しい
どの値の所有権をどの呼び出しレイヤーで保持すべきかを整理しながらリファクタリングする必要がある
ただある程度パターンがあるからそれが理解できるとそこまで難しくはない
0175デフォルトの名無しさん (ワッチョイ d3c9-c71v)
垢版 |
2023/01/11(水) 20:45:10.66ID:+OHiCBbi0
>>174
標準ライブラリでiteratorのメソッドならそうなんだろうな、って他言語でも溜め込んだ知識で何とかなるけどさ、
例えばwarpっていうWebフレームワークはリクエストの解決にfilterを使ってるんだけど、
https://docs.rs/warp/latest/warp/filters/index.html
↑ここからたどって、例えばリクエストのパスにマッチするフィルタを作成するwarp::filters::pathってのがあるんだけど、
こいつの戻り値が独自型のExactってやつなのね

warp作ってる人はここに様々な条件を追加できるようにしているんだけど、pathの戻り値にどう組み合わせられるかってのをどう探せるんだろっていつもなってる
他のcrateも、単機能で目的果たせるライブラリならまだいいけど、高階関数で機能組み合わせてねってやつはrustdoc見ても意味が分からなくなってる
0176デフォルトの名無しさん (ワッチョイ 1301-nt2E)
垢版 |
2023/01/11(水) 23:31:54.91ID:B6T7GQUU0
>>175
ExactがFilterだと分かれば別のFilterを組み合わせられることはわかるでしょ?

warpのFilterシステムを理解させるための解説ドキュメントが不足してるのと
他で類似の仕組みをあまり経験したことがないのが理由なんじゃないのかな?

型が入れ子の形でチェインされてる状態に慣れてないから
それがわかりにくさの原因のように感じるかもしれないけど
JavaやgoのReader/Writerみたいにデコレータ的に型を重ねていくのはそんな特殊なことじゃないよ
0178デフォルトの名無しさん (ワッチョイ dbda-xq+Q)
垢版 |
2023/01/12(木) 10:57:06.97ID:yHqsf2Vi0
関数単位で切り出す場合はimpl TraitやBox<dyn Trait>使った方が良いと思う
実装の詳細が型として露出してしまうのはよろしくないし
何より長い型を書き下すのはめんどくさい
0179デフォルトの名無しさん (ワッチョイ d3c9-tb1I)
垢版 |
2023/01/13(金) 00:49:21.00ID:Eg8x4Zf+0
>>176 いやExactがFilterかどうかが分からないんだ。自信が無い
https://docs.rs/warp/latest/warp/filters/path/struct.Exact.html
https://docs.rs/warp/latest/warp/trait.Filter.html
↑2つを見ても、ExactがFilterをimplしているとは書いてないんだ
知ってたらマジで教えてほしいんだが、どこ見ればいいの?

>>178 そう思うのは人情だが、じゃあどういう型の関数にすればいいのかって話
ググらずに分かる?俺は分からなかった
0180デフォルトの名無しさん (ワッチョイ 795f-H4iZ)
垢版 |
2023/01/13(金) 01:52:07.98ID:USdCnak/0
>>179
非公開の(だけど実装が漏れている)FilterBaseトレイトを介してFilterを実装してるんだね……
FilterBaseが公開されていればExactのblanket implementationsに出てくるはず

同じことは指摘されているが放置されている模様
https://github.com/seanmonstar/warp/issues/742
0182デフォルトの名無しさん (ワッチョイ 1301-nt2E)
垢版 |
2023/01/13(金) 21:03:44.68ID:4YqzJ2Gc0
Sealed TraitっていうユーザーにTraitを実装させないための一般的なパターンなんだけど
privateなTraitはドキュメントには現れないのでExactがFilterBaseを実装してることを確かめたければソースを見るしかない

でも関数や構造体の説明にFilterだよって書いてるんだからまずはそこからじゃないか?
path()「Create an exact match path segment Filter.」
Exact「A Filter matching an exact path segment.」
0183デフォルトの名無しさん (ワッチョイ eac9-KPE0)
垢版 |
2023/01/14(土) 03:14:01.24ID:4QhVLL220
いや型の説明がコメントにしか無いかったら疑うのが基本じゃないか…?
説明にある通りの使い方はできるけど、何故そう使えるのか分からない、となった上での話
前にもちらっと書いたところもそうなんだけど、impl Filterを返す関数のシグネチャも独力だと分からなかったんだよ。もっと情報の少ないクレートでやる必要が出てきたら詰んじゃう
0187デフォルトの名無しさん (ワッチョイ f6da-RqI+)
垢版 |
2023/01/29(日) 08:29:44.05ID:VTBemk9l0
意味合いとしては
> Yeet is a slang phrase meaning to throw with force
とのことらしい
https://internals.rust-lang.org/t/syntax-for-returning-early-with-an-error/14181
https://www.urbandictionary.com/define.php?term=Yeet

yeetの初出はここらしい
https://mobile.twitter.com/josh_triplett/status/1248658754976927750
命名に関するbikeshedを避けつつ機能を実験するために導入するみたいね
https://twitter.com/5chan_nel (5ch newer account)
0189デフォルトの名無しさん (ドコグロ MM49-+MOc)
垢版 |
2023/02/26(日) 21:57:18.73ID:vJeOsMT8M
新スレとして再利用と聞いてage
0190デフォルトの名無しさん (ワッチョイ 615f-+MOc)
垢版 |
2023/03/02(木) 01:57:12.70ID:9x7ptNRV0
ProviderとDemandってCOMのQueryInterface的な使い方もできるのかな
レスを投稿する


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