プログラミング言語 Rust 4【ワッチョイ】
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 extern crateは、includeとかload libraryぐらいの意味だと思えばいいと思うが、
「え、それ、Cargo.tomlにもう書いたやん」って思うのは当然の感覚だな しばらくしたら言語仕様変わりそうだなあこれ
勉強していくべきなのかどうか迷う 仕様の改定はc++のようにコンパイラのリリースとは別に2〜3年毎に定めることになってる
将来のコンパイラでも古い仕様を選択して使えるはず どんな言語でも利用者多ければライブラリーのトレンド変わっていって学び直しはあるし
言語仕様の変更だけ特別視する理由が分からん ver1.0になったし、firefoxに200kstepのソースがあるから始めるなら今でしょ ruby1.8から1.9とか
python2から3の変更とか
嫌じゃん
言語もライブラリも混在してぐちゃぐちゃ >>124
和訳は最新に追いついていないと思います、公式英文を確認したほうがいい Rustの場合仕様変更の影響を受ける記述はコンパイラがwarning(とsuggestion)出してくれるみたいだし
むしろライブラリのアップデートより楽なんじゃないかな やりたいことをするのに1日使って50%しかできなかった
自分には無理だこの言語 ここにまともなRustユーザいないのは年寄りしかいないからなのかなぁ slackかtwitterでコミュニケーションとれるので5chへ書き込みたい事情があまりない >>138
おすすめのハッシュタグはなんでしょうか? もっとメジャーになってslackが荒れて来たらここもワンちゃん slackで発言できないアンチにしか存在価値がないのかぁ つまり変な人でもスレに繰るなら、山の賑わい人気の証ってことね Vec内のアイテムを複数条件やand or等をユーザに指定させてフィルタリングをしたいのですが
無理にでもSQL使うべきでしょうか ユーザってのはどういうレイヤの話をしてるの?もう少し具体的に書かないと意味不明 values.iter().filter(hoge).filter(fuga).filter(piyo)
フィルターを何度がけすると型がやばそう 調べてみるとfiltersというクレートがありました いやじゃ、いやじゃ、Eclipseなんぞ使いとうない みんなどんな環境で書いてるの?今はvscode使ってるんだけどrlsがあまりに不安定すぎてストレスが… emacs + flycheck
racerは重すぎるんでOFFにしてる 日本語の発音ってかイントネーションはみんなどっち?
ラスト(ミファファ=スタバ)
ラスト(ミドド=ベスト(着る方)) Rustの型って何を言ってるのか良う分からないくらい一気に複雑になるんだけど、改善の兆しってある?
filter(|x| ...).map.(|x| ...)ってやると戻り値がMap<Filter<...>>みたいに、情報量がほぼ増えないのに型の表記だけが増えてくのが見づらくてしゃあないんだが
「ここを関数に切り出しておきたい」ってのも難しくね?
impl Traitあるだろって言われるけど、自分ひとりでできた試しが無い >>173
.filter(|x| ...).map.(|x| …)とやったら
ざっくり言うと戻り値はIterator<Item=T>でowned, shared reference, mutable referenceの3種類
Map<Filter<...>>とかの詳細な型を知りたいと思うことは基本ないからそこまで困らない
デコレータとかコンポジション的なものとして理解しとけばいいと思う
関数に切り出すのはGC言語と比べると難しい
どの値の所有権をどの呼び出しレイヤーで保持すべきかを整理しながらリファクタリングする必要がある
ただある程度パターンがあるからそれが理解できるとそこまで難しくはない >>174
標準ライブラリでiteratorのメソッドならそうなんだろうな、って他言語でも溜め込んだ知識で何とかなるけどさ、
例えばwarpっていうWebフレームワークはリクエストの解決にfilterを使ってるんだけど、
https://docs.rs/warp/latest/warp/filters/index.html
↑ここからたどって、例えばリクエストのパスにマッチするフィルタを作成するwarp::filters::pathってのがあるんだけど、
こいつの戻り値が独自型のExactってやつなのね
warp作ってる人はここに様々な条件を追加できるようにしているんだけど、pathの戻り値にどう組み合わせられるかってのをどう探せるんだろっていつもなってる
他のcrateも、単機能で目的果たせるライブラリならまだいいけど、高階関数で機能組み合わせてねってやつはrustdoc見ても意味が分からなくなってる >>175
ExactがFilterだと分かれば別のFilterを組み合わせられることはわかるでしょ?
warpのFilterシステムを理解させるための解説ドキュメントが不足してるのと
他で類似の仕組みをあまり経験したことがないのが理由なんじゃないのかな?
型が入れ子の形でチェインされてる状態に慣れてないから
それがわかりにくさの原因のように感じるかもしれないけど
JavaやgoのReader/Writerみたいにデコレータ的に型を重ねていくのはそんな特殊なことじゃないよ iterator系の処理はどんな言語でもやりすぎると意味不明なんでいい単位で説明変数や関数に切り出すのは大事だよ。 関数単位で切り出す場合はimpl TraitやBox<dyn Trait>使った方が良いと思う
実装の詳細が型として露出してしまうのはよろしくないし
何より長い型を書き下すのはめんどくさい >>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 そう思うのは人情だが、じゃあどういう型の関数にすればいいのかって話
ググらずに分かる?俺は分からなかった >>179
非公開の(だけど実装が漏れている)FilterBaseトレイトを介してFilterを実装してるんだね……
FilterBaseが公開されていればExactのblanket implementationsに出てくるはず
同じことは指摘されているが放置されている模様
https://github.com/seanmonstar/warp/issues/742 もしかして特段に分かりづらい構造だったのかWarp Sealed TraitっていうユーザーにTraitを実装させないための一般的なパターンなんだけど
privateなTraitはドキュメントには現れないのでExactがFilterBaseを実装してることを確かめたければソースを見るしかない
でも関数や構造体の説明にFilterだよって書いてるんだからまずはそこからじゃないか?
path()「Create an exact match path segment Filter.」
Exact「A Filter matching an exact path segment.」 いや型の説明がコメントにしか無いかったら疑うのが基本じゃないか…?
説明にある通りの使い方はできるけど、何故そう使えるのか分からない、となった上での話
前にもちらっと書いたところもそうなんだけど、impl Filterを返す関数のシグネチャも独力だと分からなかったんだよ。もっと情報の少ないクレートでやる必要が出てきたら詰んじゃう [T]と[T; N]があるように
strに対するSizedなstr<N>とかできんかね ttps://doc.rust-lang.org/beta/unstable-book/language-features/yeet-expr.html
名前の元ネタがよくわからん >>185
trY Early-ExiT で yeet じゃない?
experimental だからわざとクソ命名してそう。 ProviderとDemandってCOMのQueryInterface的な使い方もできるのかな cargoのsparse protocolは嬉しい Default alloc error handlerはLinus指摘の取り込みかな。 Linusの話は、メモリアロケーション失敗時にpanicするなという話だと思うけど、今回の変更とは全く関係ない
今回の変更でalloc crateがalloc_error_handlerのデフォルト実装を提供するようになった
新たに提供されたalloc_error_handlerはpanicする実装になっているので、メモリアロケーション失敗時にpanicになることは変わらない
単に、利用者がalloc_error_handlerを独自に実装する必要がなくなったというだけ
Linusの指摘に対しては、Box::try_newなどのアロケーション失敗を呼び出し元に通知するAPIを用意することで対応している >>195
サンクス。
Linusは「単にエラーを返せ」と言っていたから、error handlerじゃ確かに駄目だね。 Rust製の高速なwebpack互換バンドラ「Rspack」登場。現時点で5倍から10倍の性能向上
https://www.publickey1.jp/blog/23/rustwebpackrspack510.html
> Rust製の高速なバンドラとしては、webpackの主要な開発者がNext.jsに入社してwebpackの後継として開発している「Turbopack」もあります。
> 現時点ではまだwebpackが抜きん出た人気を得ていますが、現時点で主要な開発者が抜けてしまったwebpack後継の座を狙った競争が始まったといえそうです。 >>197
ちょっとスレチ気味だけれど
Turbopack(新調で700倍高速) vs Rspack(互換性維持で5~10倍高速)
webpackからの乗り換えはしばらく様子見 一度普及したソフトの作者自身が後継プロジェクトを立ち上げてもなぜかうまくいかない法則 速度遅くてもウケたプロダクトの動作速度上げたところで
現行をリプレイスする理由にならないからな
それにRustがいかに速かろうと今の時代ネックはIOである可能性が高いし >>200
詳しく見ていないけど、ロジックにボトルネックがあるのかもね。 10倍のオーダーで速度差出るなら性能がリプレース理由になる場合も増えると思うよ
数分かかる処理が数秒で終わると快適さが全然違うだろうし >>201
どうせ IO がネックだからってのは昔から言われてることだけど
クラウドサービスを前提にすると事情が違うと聞いたことがある。
レスポンスタイムにあまり差が無かったとしても課金は演算量 (CPU の使用量) に対して
だからなるべく効率的に実行できる言語を使ったほうが安く上がるんだとさ。 Ruby on Rails 6 では、webpack が標準だったけど、
Rails 7 では、Import Maps で、CDN から直接インポートするように変わった。
脱webpack/node.js
ES2015 に対応していないブラウザ用に、バンドルする方法もある。
バンドラーは、esbuild, rollup, webpackの3つ ドキュメントコメントを reStructuredText で書きたい let-else の else ブロックの中だけ rustfmt 効かなくて設定間違えたかと思ったら
フツーに未対応だった
https://github.com/rust-lang/rustfmt/issues/4914 let-elseは鬼っ子だから
改行位置決めるのも大変 横から済みませんがが、
Rust で Vec に要素を追加した場合にメモリー不足になったかどうかを検出
するのはどうしたらよいんでしたっけ? >>210
それは予め領域を確保しておく関数で、確保できなかった場合には、
Result<(), TryReserveError>
という戻り値を返す関数と言うことですか?
そして、関数呼び出しの直後に ? を書くと、エラー発生時にそこで
アプリをダウンさせると言うことですか? >>211
事故レスですが、? 演算子は、x ? と書くと、x の値が Err(y) だったら、
return Err(From::from(y)),
というような動作をする関数のようですね。 いろいろ違う
落としたいならpanicさせとけばいい メモリ不足を検出した場合に何をしたいかで適切な対応は変わってくるけど、何をしたいの? >>214
メモリー不足の時にメモリー不足である旨のエラーメッセージを出して、
なんらかの自作の処理コードを動かしたいです。 >>215
なお、Vecに追加する動作を行なった関数の中で処理をしたいです。 重要:
メモリ不足だからと言ってmallocが失敗するとは限らない 今の Linux カーネルだとアプリケーションからオーバーコミットを無効にすることは出来るようになってるぞ。 try_reserveの戻り値がErrだったら処理を実行するだけだよ
この説明で分からないならenumやResult型について勉強した方が良いよ
あとtry_reserveの失敗要因はメモリ不足だけじゃないけど、エラー種別はnightlyじゃないと取得できないみたいね RefMut <-> Ref にも Rc <-> Weak みたいな相互変換メソッドがあればいいのに >>220
RefCell自体を取り回して必要なところで都度RefやRefMutを作れば良いのでは >>221
実際今はそれでやってて、別に問題になるほどじゃないんが、ちょっと無駄だよなあと
Ref/RefMutってあんまりあちこち取り回す用にできてないよね >>222
RefやRefMutはMutexのGuardみたいなもんなんだから取り回す範囲は極力狭くするべきなんじゃね