プログラミング言語 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 rustを始めたんだけど 分かりそうで分からなくて イライラする なんだこの言語 他の言語の経験にもよるけど 3000行ほど書けば慣れるよ(適当 actix_webでちょちょいとwebサービス作ろうと思っただけなんだが externとuseみたいに、なんで同じようなものが2つ有るのとか trait?、インプリすればいいだけならなんでこんな名前なんだとか 察するに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参照)が始まっちゃうかもしれないので ゆるく受け流してほしいところ extern/use周りをrefineする話ってどうなった? チュートリアルの和訳のところを読んでいるけど 誰が訳したんだろう。。。 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が失敗するとは限らない read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる