Rust part23
関係ない長文でごまかすフェーズに入ってるってことは内心恥ずかしくて死にそうになってるんやろうな…… 複オジは見えてる範囲が狭過ぎる だから長文になればなるほど勘違い度や害悪度が高まる 自分が使ってきた特殊な仕様の言語に慣れ親しんでいると 一般的なの仕様のRustに違和感を感じて文句をつけたくなる気持ちはわからんでもない Rustを叩く前に視野を広く持つべきだな Rustの仕様はよく考えられ機能的に洗練されている >>640 Rustに無いからといってUFCS叩くのはさすがにアホかと。 そんなことよりError::sourceの戻り値に'static要求されるのってなんでなん >>642 エラー返す時に参照してるリソースをつかんだままにしたくないからじゃない くだらないレスは頻繁にするのにまともな質問が来ると急に黙るの面白い まともな質問にいつものノリで適当に答えて嘘だったら良くないしね そっか 俺の答えも間違ってたしな 正しくはdowncastのために必要らしい 詳しくはfix_errorのRFC見て Playgroundがwebsocket接続のタイムアウトエラー(504:Gateway Time-out)で全然動かないんだが俺環? downcastなんて別にしないからいらねーよって思ったけど そういえば内部で似たようなことやってるあれがあったな、どっちかっていうとあれのためか ヒントありがとう >>641 UFCSはメソッド名空間の汚染であるため、まともな言語では採用されていない。 RustはUFCSを採用しないだけでなく、更に厳しく孤児ルールによってメソッド名空間の汚染を防いでる。 Rustでのメソッド追加拡張は、そのための新たなトレイトを用意することで、その利用空間に限定して安全に行うことができる。 >>651 UFCSはそもそもメソッドとか無いんだから、ありもしないメソッド空間の汚染とか考えるだけ無駄。 それに、メソッド呼び出しは人間の思考パターン(大域から局所に絞り込む)に従った自然な記述方法なんだから、それを拡張困難なメソッドだけに限定するのは酷い制約かと。カス文法のPythonを思い浮かべますな。 >>652 Rustでメソッド呼び出しは拡張困難ではなく、拡張用トレイトを自由に新たに用意することで、他への汚染を招かずに安全に拡張できる。 そのためUFCSのような愚かな方式を採る必要がない。 答えを教えてもらっているのにヒントありがとうというオジさんw >>653 それって単にメソッドだけ特別に名前空間を管理していという話で、UFCSだから問題になるという話では無いな。 もっとUFCSならではの問題点を指摘してくれ。 せめて関数が左作用ならUFCS捨ててもいいけど、どの言語も馬鹿のひとつ覚えで右作用を採用するからメソッドとかUFCSが重宝される。 アラビア語でコーディングすれば、入力左から右へ進むから右作用が思考の順になるぜ アラビア語おすすめ >>656 それはメソッド呼び出しのメリット モジュール化や結合の観点からも最初からメソッド定義していくのが正しい UFCSはそれが出来ないあるいは間違ったプログラミング設計によりフリー関数を多数作ってしまった間違った環境でメソッド呼び出ししたくなった時のみ必要とされる 具体的には歴史的な負の遺産でボロボロなC++が該当する そのためC++ではUFCSを導入しようと今も悪あがきをしている ほとんどの言語にUFCSがないのはそんなものを必要としないためだ モジュール化や結合の観点から、関数が一つの変数の型に紐づくのがそんなに優れているとはあんま思えんけどなあ RustのAdd演算子とかrhsとlhsの型が違う時は演算子がlhsのみに紐つくことになってかなりキモい それはAddが交換法則の成り立つ二項演算子だからそう見えるにすぎない AddAssignやSubやShlなど多くの演算は非対称 いや別にSubでもDivでも左のみに紐づいているのはキモい >>658 やっぱりUFCSじゃなくて名前空間の設計の問題にしか見えんね。 例としてc++を挙げているが、名前空間を使っているライブラリとかで問題になっている事例てあったっけ? グローバルのフリー関数は影響範囲が広すぎて問題を引き起こすというなら、Rustのトレイルと同様に適切な名前空間を用意しないと関数を定義できないようにすればいいかと。 >>662 トレイルではなくトレイト トレイトは名前空間を用意するものというより、トレイトをuseすることでそのトレイトにより実装されるメソッドが使えるようになるだけ >>663 だったらなおさら>662だけの話かと。名前空間で「メソッド空間」を管理するのをRustは「トレイト」で管理しているだけにしか見えないね。 >>659 >モジュール化や結合の観点から、関数が一つの変数の型に紐づくのがそんなに優れているとはあんま思えんけどなあ 同意 >>664 Rustはそうやってきちんと管理できつつ便利でいいよなー 他の言語も導入すればいいのに >>665 オブジェクト指向を全否定するキチガイか クラスのある言語もクラスのないGoやRustなどの言語も 一つの変数の型に関数を紐づけることがプログラミング言語の中核機能だ >>667 >一つの変数の型に関数を紐づけることがプログラミング言語の中核機能だ オブジェクト指向前提思考? >ほとんどの言語がこの方式なのに何を気持ち悪がっているのだろう からの >UFCSはメソッド名空間の汚染であるため、まともな言語では採用されていない。 schizoかな? >>670 虚言癖などと同じパーソナリティ障害の一種だから生温かく見守ってやれ おじいちゃんは昼だけ起きてて 夕方を過ぎると寝てしまう ジェネリックにも同じように安全に適用できるのはRustにトレイト境界があるおかげか トレイト境界はc++ conceptみたいに同じ関数集合ならOKなんだっけ? 柔軟性のために外延性は欲しいところ。 異なる型間の共通項をトレイトとして切り出すだけでよく コードを美しく整理して保守性を高めやすい 143 デフォルトの名無しさん 2024/04/07(日) 19:27 純関数型言語でなくても モダンなプログラミング言語 Go、Rust、Zig、Nim、Julia、Elixirなどは クラスおよびその継承を言語仕様から排除しておりクラスは存在しない それら各々の言語は全く異なる方針を採っている言語だがクラス排除だけは全てが同じ方針である クラスとその継承は悪手であるとプログラミング言語界では結論が出ている 継承がなくても構造体にメソッドついてたら実質クラスだろ 関数に構造体渡してたらそれはクラスじゃないけど >>681 構造体にメソッドが付くことはカプセル化と言う クラス=カプセル化+実装継承 なのでクラスとカプセル化は異なる このクラスを成り立たせている実装継承が悪であるためにモダンな言語群がクラスを採用しなかった 実装継承とは具体型が別の具体型を継承することを指す クラスでは派生クラスが基底クラスを継承するため悪の実装継承となる 正しい方法はインタフェイスやトレイトなどの抽象型からのみ継承する つまりクラスを完全に排除できるためモダンな言語群にクラスはない 用語も色々。 Rust で言うところのトレイトみたいなやつを Haksell とかでは型クラスって呼んでるし、 JavaScript のクラスの実体は (特定のプロトタイプに紐づいたオブジェクトを生成するための) 関数。 極論すればクラスと名付けたものがクラス。 Rust でクラスと呼んでない以上はもう別概念として捉えるしかしょうがないだろ。 C++ のクラス的なことの一部を Rust でも「可能ではある」というという主張なら賛成するけど、 クラスとは何かを定義せずにクラスかどうかを論じても無意味。 型クラスとクラスは全く異なるので混乱しない クラスとはクラス継承すなわち親クラスから子クラスへの実装継承できるものを指す JavaScriptはプロトタイプを親として実装継承するためクラス 一方でRustにクラスはない クラスとは何か?継承とは何か? こういう基本的な概念を特定言語の実装から離れて理解しようとしない限り何を言っても虚しい >>681 が一番まとも 話は非常に単純 具体的な型から具体的な型への継承が実装継承でこれがよくない classは具体的な型superclassから具体的な型subclassへの継承があるから実装継承 interfaceやtraitは具体的な型ではなく抽象的な型なので該当しない 最近の言語がclassのみ採用しなかった理由はその違い RustにはJavaのクラスはありません RustはJavaではないからです あたまいいね Javaの生みの親であるJames Goslingも、 「もう一度最初からJavaを作り直すとしたら、どこを変更したいですか?」に対して、 「クラスを除外するでしょうね」と答えている。 その理由は、クラス継承が実装継承となっているためで、この設計を後悔していて、インターフェースによる継承が望ましいと述べている。 クラス継承のある言語でも今はクラス継承を使わない設計するのが良いとされてるので要らんよな それは単に使い分けが出来ない馬鹿な子向けの説明だぞ >>691 言語仕様としてあった方が良いということ。 馬鹿が使うとクソになる仕様がある言語は馬鹿をチームに入れただけで開発が即破綻するからクソ Javaの生みの親も言ってるようにクラス継承の機能はない方がいい なくても困らない あると問題を引き起こす そういうのは話半分に聞いておけばいいよ nullを使ったのは失敗だったとか 後からそれらしいことを言ってるだけ javaはクラスと継承が無くなったらまともに機能しない interfaceにデフォルト実装がなかったので全部自前かコンポジションで実装することになったはず >>696 interfaceにデフォルト実装を後から入れたので問題なくなった そうなるとclass継承は不要 最初はなかったしずっと取り入れなかったのはそれがJAVA風じゃなかったから 今JAVAが生き残ってるのは最初の設計思想が世間に受け入れられたからであって 後から○○無くせばよかったと言うのは誤りで浅はか NULLを無くせばよかったと言うが当時メジャーな手法でそれの代替手段がなかったのと同じ インターフェイスにも集合で言うところの外延性は欲しいところ。 基底クラスで保証してる内部条件を継承クラスで壊されやすい Javaは基本的に全部オーバーライド可能でprivateとfinalで変な継承を抑えてたけど C#はabstract/virtualかつsealedでない要素だけオーバーライド可能になってたと思う 古い知識だから最近の動向は知らない Unreal EngineがRist対応するんだってね 隙間作って床下チェスト収納ってできなくなった?動画みてるけどうまくできん shift-jisのファイルをBufReaderで1行ずつ読み込もうと思ったら無理でOKが流れてこない 全部読んでデコードして\nで切り分けるしかないの? read_lineはutf-8じゃないと無理だけどread_untilならバイト列で1行ずつ取れそう >>712 encoding_rs_io::DecodeReaderBytesBuilderでsjisをdecodeするreaderを作る あとはreader.lines()で同じ std::io::BufReader::new(encoding_rs_io::DecodeReaderBytesBuilder::new().encoding(Some(encoding_rs::SHIFT_JIS)).build(std::fs::File::open(SJIS_FILE)?)).lines() BufReaderもFile::openもそのまま使える点がいいね >>715 ありがとうございます 動作確認しました ちょっと仕組みがむずかしいですね decoderが挟まるだけだよ // UTF8の場合 let file = File::open(path)?; let reader = BufReader::new(file); for line in reader.lines() { // SJISの場合 let file = File::open(path)?; let decoder = DecodeReaderBytesBuilder::new() .encoding(Some(SHIFT_JIS)) .build(file); let reader = BufReader::new(decoder); for line in reader.lines() { バッファリングせず丸ごと贅沢にメモリ使っていいなら単純 let bytes = fs::read(path)?; let (s, _, _) = SHIFT_JIS.decode(&bytes); let reader = BufReader::new(s.as_bytes()); for line in reader.lines() { コマンドラインからファイル名取るようにしたらパニック windowsで文字コードが違うかららしいけどこういうバッドノウハウを開発者に積み重ねていかないと使えないのはめんどい 知らないとそういう反応するんだろうけど std::env::args_osを使ってOsStringを取って対処する必要があるんだよ 勉強になっただろ? 日本人だから日本語名が付いたファイルを扱う機会に恵まれてるからこういうことに出会える アメリカ人だったらこういうのに出会わないでコーディングしてリリースしてるだろう 世界中で使ったらパスの問題で落ちるプログラムがガンガン量産されている >>722 チュートリアルレベルの基礎を バッドノウハウwとか 積み重ねでいかないといけないwとか 言ってるから何言ってんのwになる >>720 Rustのパニックはどの関数で何をした時に発生するかすべてドキュメントに明記されてるのでパニックはプログラミングした側に問題がある さらにパニックがソースコードの何行目のどの場所で起きたのかもわかるのですぐにそのバクを調査できる まずは基礎知識を身につけよう >>722 std::env::argsのドキュメントにどういう時にパニックが起きるか書いてある さらに対処方法はargs_osを使えと明記されている ドキュメントを見よう >>724-725 こういう低能がありがたがるんだろうな 信者としか言いようがないw リリースした後の実行時のpanicを有り難がる信者 Rustのライブラリの思想がいまいち馴染みにくいと言うか素人が作るとこうなりますと言う見本 >>722 Rustではそんな個別の知識を知らなくてもpanicさせた関数が分かるから その関数のドキュメントのpanicの項目を見れば明記されてる 他の言語と比べても良い環境 馬鹿と話しててもらちが開かない 世界中で使ったらパスの問題で落ちるプログラムがガンガン量産されているのは事実 お前らそれを一個一個プルリク送ったりしてるのか? 所有権とか導入してバグを静的に弾こうとしてる割にはこういうところではガバガバ 世界中で英語じゃないwindows環境でpanicが起こるコードが蔓延してる 非合理的 そんなことより The Embedded Rust 読み始めたんです。 冒頭からリンカで割り込みベクタマップの取り方やら panic 無効にしての main 関数導入やら、HAL は自分でこさえるんだよね?と言わんばかりの内容。 おおむかしのMCU開発環境みたいで嫌いじゃないけど、arch 対応してないと敷居高いねこれ。 公式チュートリアルすらまともに読めないお馬鹿さんは自分が使う道具を間違えててもそれを言語のせいにしたがる プラスドライバーを使うべき状況でマイナスドライバーを使って使いにくいじゃねーかこんな道具は非合理的などと言い出す ヤバすぎね? >>725 なんでコンパイル時にエラーにできないんだろう? Rustのポリシーからすれば安全優先でargs_osだけにしてargsは削除すべきでは? c++じゃあるまいに、コマンドラインのデータが常に正しいunicodeだと信用するプログラムを書けるとか、セキュリティーホールになりかねんと思うけど。 >>734 緊急停止して「安全ですよ」はちょっと…… >>733 セキュリティホールにならない 異常データに対して止まり動作を続けない >>733 >なんでコンパイル時にエラーにできないんだろう? 出来るわけないだろw 実行時に与えられる外部入力をコンパイル時にどうやって判定するんだよw バカすぎる しいて言えばargs()を使う方が特殊ケースなのにデフォルトの名前を引き継いだのは設計ミス もう治る見込みはないからargs_os()を使おうねってだけだけど read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる