プログラミング言語 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 皆知ってるかもしれないけど、https://github.com/rust-unofficial/too-many-lists は良いね
公式のbookには無かった「自分で書いてみた時にハマる箇所と解決法」が丁寧に書いてあるんで、
特にプログラミング経験者でRust初学者には自信を持ってお勧めできる >>3
しらんかた
webのやつはみれなくなってるね 製本?したものを上げてるサーバーが結構長いこと落ちてるね
1. cargo install mdbookでmdbookをインストール
2. git cloneで>>3のリポジトリを取ってくる
3. 取ってきたディレクトリでmdbookを実行
4. book/ にhtmlで製本されたものが出力される
ので、是非読んで欲しい。may not live longとかcannot moveとかで怒られまくってる人なら共感しながら読めるはず アンチスレのほうが伸びてるやん
枯れ木も山の賑わい 教えてください
VecのDisplay::fmtをカスタマイズしたくて
type MyType<T> = (Vec<T>);
impl std::fmt::Display for MyType {
} 申し訳ありません 途中送信してしまいました
コードをplaygroundに移しました
https://play.rust-lang.org/?gist=10bd65d0bfaf8b5117399b18bd8eb0d2
VecのDisplay::fmtをカスタマイズしたくて上の様にMyTypeを作成したのですが
Vecのメソッド委譲するためのコードを手書きする作業が煩雑になって困っています
何か上手い回避策は無いでしょうか? >>9
私も初心者で分からないですが最終的に何がしたいんでしょうか? >>10
レスどうもです
Vec(他標準 struct)のDisplay::fmt出力をカスタマイズしたいんです 例えば
・要素数が多い場合、最初の数個を出力して残りを省略するとか
・要素の出力が長くなる場合、適当なところで改行するとか
・インデントを受け付けてネストしてる場合は改行とインデントで整形するとか
その上でVecのインターフェースをそのまま使いたいんですが
>>9のように新規の構造体を作る場合 手書きで委譲せねばならず
どうにか上手く出来ないもんかな……と >>11
その用途ならVecに別な名前のメソッドを直接implしちゃってそっち呼び出せばいいような気がしたんですが
println!("{}", v.my_fmt());
みたいに >>12
ごもっともです
self.0に委譲するマクロが上手く書けなかった経験があり
それに引きずられて本質を見失ってました
コードを整理していったらいけそうな感じになりました
https://play.rust-lang.org/?gist=960819f1fb1b5f9988a1c58cab2b1b9e&version=stable
ありがとうございます
>>13
ああ、なるほど
Derefは思い至ってませんでした メソッド委譲の解決になりそうで助かります
こちらもありがとうございます >>16の論旨は「MyType<T>は常にVec<T>として扱われても問題ないか?あるならDerefはおすすめしない」だと思うけど、
今回の場合はむしろMyType<T>は特別なことが無い限りVec<T>として使いたいんじゃないの? >>16 読みました
見覚えのあるピンク玉はrust playgroundの中の人でした
「smart_ptrぐらいの同一性がある場合にはDerefが必要だけど
strにDeref<Taget = [u8]>が無いように
Derefだとやりすぎな場合もあるからdelegate構文欲しいよね」
ってなとこでしょうか
strの例は「替わりにas_bytesがあるよ」ということかなと
strとsliceとか他のライブラリを眺めた個人的な結論としては
has_aならAsRef、is_aならBorrowをimplして受ける関数で使い易くしておくのが
Rust的な落とし所なのかなーといった印象です
AsRef, Borrow, Derefの使い分けは宣言的にプログラマの裁量に任されてる感じ
よくよく考えれば自分のコードにもas_xxx, as_xxx_mutが散見されている現状なので
Mytypeにもas_vecを書けばそれでも良かったような気がします
>>17
自分のケースの場合はそもそもMyTypeがいらなくなってしまったもので
Derefはオーバーパワーかなと思ってます
とはいえ smart_ptrのように扱うならDerefが有用ということが
知見として学べたので 大変ありがたかったです >>17
このスレを読んでる人に情報共有してるだけだよ オライリー届いた。
分厚すぎてわろたわ。読むの大変そう。 dyn Traitが入ってしばらくしたらBox<Trait>はdisconになるの? deprecated扱いになって警告を出し次のepochで削除とかだったと思う impl Trait入ったらそもそもほとんど使わなくなるから気にしなくていいのか。 使うケース減るのもそうだけどepochで機能削除する場合はソースコードの変換ツールが提供されるらしい
あと古いepochのソースはそのままコンパイルできるらしいから特に対応不要らしい
だから新しいepochにしか入っていない機能を使いたいcrateとかでなければ何もしなくても困らないはずだし
その場合でも変換ツール通せば簡単に対応できるはず epoch releaseってのはどういうことなんだってばよ? map: BTreeMap<K,V>で、keyが無かったら挿入、あったら格納されてる値vに応じて新しい値new_vに更新するか決めるってやりたいんだけど、
let v = map.entry(key).or_insert(new_v);
if ... {
*v = new_v;
}
よりもっと綺麗な書き方ある? https://webassembly.studio/
CやRustでWebAssemblyできるOnlineIDEだそうな Rust Never Sleeps: Community Grows, Eclipse-Based IDE Planned
https://adtmag.com/articles/2018/02/01/rust-grows.aspx wasmってまだプリミティブすぎて使い物にならないのかと思ってたけど wasm-bindgen すげえな
もうここまでできるのか Rustすごい!
takahito takabayashiさんのツイート: "ファミコンのエミュレータをRust / WebAssembly で書き直した
https://twitter.com/tatakaba/status/961532612723511296 苦労して書き直しても全然パフォーマンス上がらないのな…
ぐうの音もでないほど効果があるユースケースってなんなんだ アルゴリズムが変わらないならそう変わらんのじゃないか
他人のひどいコードならともかく、同じ人が小規模なプログラムを書き直す程度だと特に
C/C++からRustへ書き直して速度が上がったって話はあんま聞いたことが無い
速いネイティブライブラリを言語に組み込んでるJuliaとかなら、書き直すだけで速度上がったって話はちらほら
pythonだったらnumpy使った方が楽でいいとかも いやだってjavascriptだぜ?アルゴリズムの問題か? c++もそうだがコンパイラに機能を詰め込むってのがそもそも筋が悪い