Rust Part7
■ このスレッドは過去ログ倉庫に格納されています
最低でもヴァリアントとレコードとパターンマッチがあって全体的に式指向な言語が良い
ocamlがマルチスレッドに対応しててもっと流行ってれば...
scala/f#がネイティブであれば...
haskellが正格評価でもっとパフォーマンスが良ければ...
皆さんc/c++の置き換えとしてrustやってるの?
自分は関数型言語由来の機能が多くてネイティブで動く言語が欲しい
そういう理由でrustに手を出す人って少ないのかな
rust製のcliツールとかめっちゃ多いし、低レイヤのためだけにrustやってる人のほうが少ないんじゃないかな 難しいからなんなんだよってかんじ
勉強すればそのうち使えるようになるんだからどうでもいいことじゃん
俺はPHPの置き換えで使ってるけど rust, c++より少しはマシくらいの言語だわな。
実装系含めたらまだc++のがマシになるが。 C++がましってどのへん?学習コストはどうしようもないとして、学習してしまった今となってはC++に戻る気とか一切しないんだけど。 >>46
pony。cliツールっていうかcoreutilsとbusyboxの代替実装とかならあるけど。 >>52
cとかより低いレイヤーの言語をバインドしようとした時、より素直。 お前らが本当に必要としてるのはRustじゃなくて
ziglangなのでは? 流行ってる言語じゃないとしんどいってocamlで学んだ rustがリアルタイムで使われてるの聞いたこと無いんだけど
どうせgcあるから駄目とか言ってるやつはメモリの開放タイミングが
予測不能でも致命的にならない事しかしてないんだろ? Option<char>とStringを結合させたいんですけど、どうすればいいんですか? >>63
Option<char>はList<char>の特殊な例と考えて良い
これ、関数型言語の常識 let x: String = "Hello World!".toString();
s += Some(x)?;
いや知らんけど リアルタイムでってなに?
目の前でrust書いてくれるってこと? >>63
>>64
unwrapしてformat!で結合できましたm(_ _)m GCは結局メモリ以外のリソースはまともに管理できなくて、自分でデストラクタ呼ぶはめになるのがつらい rustでc++のtemplate<class T, size_t N>struct array{T elm[N];}みたいな事可能なの? 抜け道はあるかも知れんがジェネリクスでは型しか取れない まだ実装終わってないけどnightlyなら一応使えるっぽいよ
#![feature(const_generics)] 高機能なマクロもクロージャも使えるのだから値パラメータなジェネリクスは冗長
なキモス C++から機能取り入れるとクソ言語化するからやめてほしい んまー値パラメータなクラステンプレートを実現しようとしたらマクロでは済まないのか
そうか >>70
GCは全く関係ないがな。
try使うとかwith使うとかgoならdefer使うとかそういう話だろ。
オーバーヘッドガー言い出すやつって
ただまともにメトリックとるスキルがないってだけだろ。 >>78
RustやC++のスマートポインタならスコープ抜けたときのデストラクタできれいにリソース解放できるけどGCだとできないね、って話なんだが。
それを部分的に解決する方法としてC#のusingとかがあるけど、関数を跨ぐような寿命の長いリソースには使えない。
try-finallyやGoのdeferなんて、絶対書き忘れてリソースリークするパターンだろ。 現状静的配列が使い物にならないから const generics は必要だと思う ゼロコスト抽象化を標榜してる以上は行列計算をVecでやれとは言えんだろ >try-finallyやGoのdeferなんて、絶対書き忘れてリソースリークするパターンだろ。
一理あるが、資源を正しく管理するデストラクタ書くのそんなに楽じゃねーぞ。
舐めすぎだわ。 >>86
他言語でもさんざん書いたからデストラクタの難しさは知ってるつもりだけど、
ライブラリ作成者が注意深く書いたデストラクタをみんなで使うのと、各自finallyやdeferを正しく実装しましょう、なら前者がましでは? ちょっデストラクタで開放処理を書けない資源とかもはやプロセスをkillするしか、 Vecはただのfat pointerのnewtype patternだからアラインが合えば自動ベクトル化できるんじゃないの?
>>80
gcあるならref objectあるだろ。今どき。 ていうかデストラクタ自体は問答無用に資源を開放するように作ればよいのであって
そうならないのは上位の設計がおかしい
例外のスローが許されないなどただでさえ制約が厳しいところに小難しいロジックを押し込んでどうするんじゃ…
資源の開放に一定の手順が必要ならそれはデストラクタの中ではなくデストラクタが呼ばれる前にすませるべきだし、
必要な手順が抜かされたみたいなバグのケースの救済までデストラクタの任に負わせるのはおかしい
資源の開放自体にエラーの危険性があるならインスタンスの製造元(ファクトリ)にエラー通知してから死ぬ等の
パターンに従うべき >>89
ref objectがなんなのかよく分からないが、GCにリソース解放させる場合の問題はタイミングを制御できないことだと思ってる。
スコープを抜けて回収可能になったからといってすぐ回収されるわけではないから次の確保が早すぎると死ぬ。
まぁたいていの場合問題ないってのはあるけど、本質的にはGCに合ってないと思う。 すぐに開放されないだけの問題なら開放されるまで待てば良いではありませんか、
さすがに今日日のGCは開放可能な資源の発生と資源の獲得要求がmeetした場合に何もしないほど馬鹿ではないと思われ
(meetのトリガタイミングがなんと2回もある
致命的に問題なのはGCには資源に空きがあるように見えるが、GCが知りようがない上位のロジックで循環依存が生じる場合
ファイルをN個まで同時に複数開けるシステムで、a、bの2個しかファイルが開かれていないんだけど
スレッドAがファイルaを出力し終えた後ファイルbのクローズを待っており、スレッドBはファイルaのクローズを待ってからbを出力せんとしている場合等、 >>87
俺は後者のがマシだと思うけどね。
資源解放のパターンをオブジェクトで判断するとか自然な設計だと思えんよ。
解放ルーチンなりをシチュエーションごとに用意する方が明らかに自然だわ。 >>92
実際問題例えばC#のGCはそれくらい馬鹿ではある。
というかファイルハンドルの中身と次のリソース要求を見て、適切に回収してくれるGCってあるの?
メモリ解放のタイミングでたまたまその他のリソースも解放されてるだけでは? 効率的なTreeの書き方どこかに書いてあったはずなんだけど忘れてしまった
どこにかいてあるかわかるひといますか? enumをつかっていたような気がするんですが・・・ 効率的なTreeってなに?
代数的データ型なら普通はsum type(rustのenum)で書くけど。 ???@???
Rustとの戦いにつかれたのでDを触った次第
↑RustでコンパイラとかVM作ってる人のツイート
Rustってそんなに難しい? 配列で親ノードIDや子ノードのID持たせるとかじゃなかったか。
所有権引っかからんようにするとそんな感じになる。 他言語でもGUIのグラフとかは結局そうなるんだけどな。 今日知って驚愕したのだがJavaは構造体の参照を返すということができず、
どうしても参照返ししたいときは構造体のメンバを書き換えて返すという歪な手段を使う
↓こんなやつ
class CWDPath {
String mPath = "";
}
boolean getCWD(CWDPath result) {
result.mPath = "SomeDir";
return true; // 性交ステータス
}
これはresultの寿命がmPathに代入するデータの寿命を下回らないケースでしかRustでは書けないハズ
つまりJavaはRustのアンチパターンで大々的に書くことを余儀なくされる危険な言語 Javaすら理解できてないのにRustを使おうとするとは勇ましい javaに構造体はないってことくらい突っ込んでやれ。
value typeは当分先だ。 いや正しいていうかこの話にvalue typeは関係無い(返そうとしているStringは参照型
間違っているというならreturn mPath以外の方法でgetCWD()からStringを返してみると良い んまー不用意に構造体と書いてしまったのは陳謝するのですよ 組み込みの値型以外は全て参照型で管理されてる事が理解できてないって事? Javaにおける参照はオブジェクトへのポインタのことで、RustやC++の参照とは違う概念なのだよ だから参照を返すという言葉の意味も Java と Rust では違う 何言いたいのかさっぱりわからん
コンパイルエラーになるがやりたいことを書いてくれ 皮肉や冗句を言うにも一定のセンスと知能が必要と言う証左 >>115
C#の例(これは動く
void Main() { string str = new string(); bool bResult = getCWD(ref str); Console.WriteLn(str); // "some_dir"が表示される }
bool getCWD(ref string str) { str = "some_dir"; return true; // 性交ステータスとしてのtrue }
Javaで同じ事をしようとすると>>105になって、Stringを返すためだけのためにCWDPathみたいなクラスを作らねばならない
>>117
藻前は顔だけは賢そうだな 脳がC言語で止まってると色々気苦労が多くて大変だな で、Javaでは何で>>105みたいな変なことになるかというと、参照の参照をとることができないため
ここで参照とは何かというと>>113の前半部で良い
参照自体はレジスタに代入したりスタックに1語で積める値型の一種とみなせる
C#ではrefキーワードにより、参照の参照をgetCWD()に渡すことができる
Javaは参照しかgetCWD()に渡せない。よって、CWDPathみたいなクラスの参照を渡してやって、
そのクラスがメンバとして所有する参照を上書きするという手段で返さざるおえない >>119
参照型を引数として関数に渡すしくみはCで完成しているのだから>>119の言い様では批判になんね
Cではポインタやんけというのは本質ではない
参照自体はレジスタに代入したりスタックに1語で積める値型の一種とみなせる(>>120)
なのであって機械語レベルでみたらオブジェクトを指すポインタに他ならない
で、Java、C#、C++、Go、Rustいずれも参照型の関数渡しは参照をスタックに積んで渡すモデルであることは変わりない 調べてなお問題があると言うなら>>122の理解にこそ問題がある >>118
最初説明したこととまるで違うじゃないか。用語は正しく使えよ。
結論は、戻り値で成功不成功を返そうとしたお前が全部悪い。>>119が正しい ・カレントディレクトリを取得する
・取得の失敗を検出したい
というのが要求だとして
Javaでそんな変なことせずに
もっとまともな書き方あるから批判する前に
勉強しろや >>118
Javaの場合は普通 >>105 みたいなことをせずに、getCWD() の返り値を CWDPath にして、失敗の場合には null を返す
CWDPathみたいなものを二つ返したいなら Pair を使うし、たくさん返したい場合に初めてクラスを作る
Java の進化系である Kotlin はこの辺を確実簡易に行うために nullable とか data class とかがある optional型とかnullable型みたいなヤツは色んな言語であるわな CWDてなんなんそもそもw
pwdコマンドにあるようにワーキングディレクトリってことでいいの?
それが失敗する時があるってのが想像できない 想像力が足りない
Unix だと実行中のプロセスのカレントディレクトリを消すことができるので、
そこでそのプロセスが getcwd すると No such file or directory のエラーになる Cの知識しか無いけどJava語っちゃう痛い人が、参照渡しだの値渡しだのを問題にしたがる
Cを使えるからってプログラミングの技術全てが語れるわけじゃないのにね go9nzBX4が最初から間違ってるのは置いといてFTUf1Nuqは結局なんだったの? >>124
一連のレスの中で漏れが一度も「参照渡し」という用語を使っていない件について:
参照型の参照渡しする、という状況は比較的新しい話で、
Javaはあえてかなんだか知らんが古来からある値型の参照渡しに類似の動作に対応していない
つまり呼び出し先で引数として渡された参照型自体を交換したり出力したりできない
JavaScriptやC#は対応している(呼び出し先で参照型自体を交換できいる。C#の例は>>118。refよりoutキーワードを使ったほうが良かったかもしれん…)
>>126
それで十分使いやすいと思われたのならそれで良いが、後発言語が参照型の参照渡しに対応しているという事実、
>>133
C++脳に汚染されていたのでclassとstructの区別がなかったんじゃ すまんまつがえたorz
JavaScriptの参照の渡し方はJavaと同じやった、 なんか今ググると参照渡しの説明に真っ先にJavaScriptが出てくるが
世の中では参照型については参照型が保持するデータを呼び出し先が書き換えられることをもって参照渡しと言っているのかそうか、
しかしそれでは渡された参照型を呼び出し先が交換したり出力したりできず、
そうしたい場合に>>105や>>126(Pairの使用、ただし2個まで)みたいな技巧を要する 書き込むスレをいつまで経っても間違ったまま
そのことにすら無自覚で気付けないやつは
何してもだめ Cのときからある混乱だよな
単にポインタ渡してるだけなのに
ポインタを値渡してるだけなのに
「ポインタ渡し」だとか「参照渡し」だとか言っちゃう
そーいうブログや個人サイトが今もいっぱいある
そもそもこんな状況だから
これについての議論はスタート地点からもうやる気ほぼ出ない >ポインタを値渡してるだけ
フォートランスレにでもしてほしいのけ? >>141
> 単にポインタ渡してるだけなのに
> ポインタを値渡してるだけなのに
> 「ポインタ渡し」だとか「参照渡し」だとか言っちゃう
お前がまず混乱してね? ×単にポインタ渡してるだけなのに
○単にポインタを渡してるだけなのに
失礼、こう書いたほうが良かったねこの場合 ×ポインタを値渡してるだけなのに
○ポインタを値渡ししてるだけなのに
こっちは完全なるタイプミス ■ このスレッドは過去ログ倉庫に格納されています