Rust part10 ..
[2ch|▼Menu]
624:デフォルトの名無しさん
21/05/14 14:57:53.07 85G96vHL.net
両方やっとけ

625:デフォルトの名無しさん
21/05/14 15:16:48.50 678S/iU6.net
なんでマイナー言語のはずのgoがよく言及されるようになったのかと思っていたら、AWSで使える言語の一つになっていた。
Azureでも使えるようだ。

626:デフォルトの名無しさん
21/05/14 15:45:19.02 WB7bczPS.net
goがマイナー。。。..

627:デフォルトの名無しさん
21/05/14 15:46:03.80 BI4FO4HO.net
サーバープログラムみたいな閉じた環境で、出来るここまでと決まってて
要らないこと考えたくないなら制約された言語選んだほうが良いかもな

628:デフォルトの名無しさん
21/05/14 15:47:17.23 6SQ932Rj.net
goでほとんど問題ないんだが、それだとrustの出番なくなっちゃうからね。

629:デフォルトの名無しさん
21/05/14 16:15:48.73 1T0ViQH9.net
Go言語がマイナーならこの言語はどんだけマイナーになっちゃうのよ

630:デフォルトの名無しさん
21/05/14 16:25:56.91 Z0ePaP6y.net
goとrustの違いが分からないような知識量ならgoやった方が不幸にならないかと

631:デフォルトの名無しさん
21/05/14 16:48:29.92 678S/iU6.net
参照型はローカル変数にだけ入れて一時的な目的だけに使うことに徹してスクリプト言語の様な書き方だけに専念すればRustはスクリプト言語であるかのように使えて、習得は難しくないかも。
参照型を構造体の中に入れようとしたとたんCやC++では考える必要の無かった難しい問題が生じる。

632:デフォルトの名無しさん
21/05/14 17:00:31.58 dvkZe6EK.net
メジャー言語
c java vba

633:デフォルトの名無しさん
21/05/14 17:40:01.47 N2rlLeCr.net
Rustを勉強したら低レベルが理解出来る!!!わけねえだろ
URLリンク(www.akiradeveloper.com)

634:デフォルトの名無しさん
21/05/14 19:36:04.21 5xLewDJ4.net
例えばWeb系ならばRustがベスト
WasmでGC抱える言語をわざわざ選ぶメリットないからね

635:デフォルトの名無しさん
21/05/14 19:44:16.91 6SQ932Rj.net
こういう詐欺師が普通におるからrustは信用できんわ

636:デフォルトの名無しさん
21/05/14 19:51:45.41 WB7bczPS.net
rustに対するコンプレックスすごい人いるね

637:デフォルトの名無しさん
21/05/14 20:26:02.54 0Bqgd+6M.net
詐欺師はどこにでもいるからな
とはいえ、webならwasmは正しくないとは思うがwasmならrustは結構正しいと思う

638:デフォルトの名無しさん
21/05/14 20:32:01.67 6SQ932Rj.net
wasm,rustでまともに開発してたら絶対そんなこと思わんわ。。どいつもこいつも馬鹿すぎる

639:デフォルトの名無しさん
21/05/14 20:40:33.59 WB7bczPS.net
それで、どんなまともなものを作っているんですか

640:デフォルトの名無しさん
21/05/14 20:46:14.11 5xLewDJ4.net
>>624
とこが詐欺?
あなたはWebブラウザ上のWasmでRustではなくGoを用いているのですか?

641:デフォルトの名無しさん
21/05/14 21:18:15.11 TMXA3cLH.net
>>627
それはあなたがまともにrust使えてないだけなんじゃないですかねぇ

642:デフォルトの名無しさん
21/05/14 21:22:56.09 yxEaYkUD.net
話が具体的で説得力がある

643:デフォルトの名無しさん
21/05/14 21:38:43.40 2w1FBHD8.net
>>572
形式的に書けているのは構文規則だけで
意味規則は自然言語で書かれているやんけ

644:デフォルトの名無しさん
21/05/14 22:59:38.34 R2Ezzb7N.net
「Rustはスクリプト的に書ける」とかいう謎の言葉言う奴沢山いるけどなんぞ?
同一人物か?

645:デフォルトの名無しさん
21/05/14 23:07:50.74 TMXA3cLH.net
我々が知らないところでevcxrが流行ってるのかもしれない

646:デフォルトの名無しさん
21/05/14 23:23:46.43 72ZodHJE.net
google謹製のREPLね
エベクサ?

647:デフォルトの名無しさん
21/05/15 02:09:59.05 BphhllcO.net
>>633
Rubyと同じようなメソッドチェーンを使ったコードを見かけたから。

648:デフォルトの名無しさん
21/05/15 03:17:16.69 vuo6fbRn.net
ドットでメソッド呼び出しする言語は大概そういうライブラリ設計あるでしょ

649:デフォルトの名無しさん
21/05/15 11:05:39.24 DTE+piln.net
>>637
C++やJavaでは見たこと無い。
JSでも余り見かけない。

650:デフォルトの名無しさん
21/05/15 11:12:58.76 Y+SvMVkX.net
そもそもメソッドチェーンって「スクリプト的」なのか?

651:デフォルトの名無しさん
21/05/15 11:24:14.14 C+CtGbiq.net
前々からヤベェやつだとは思ってたが
レベルの低さが想像をはるかに超えてた

652:デフォルトの名無しさん
21/05/15 11:27:04.30 MS0dCBGJ.net
c言語みたいにcsvパーサーも自前で用意するような環境だとそらスクリプト的だろうね。

653:デフォルトの名無しさん
21/05/15 12:00:43.05 A3vQNOxR.net
unityとかUEがrustに対応しないかなあ

654:デフォルトの名無しさん
21/05/15 12:00:58.11 ZgJC7yuF.net
cargoみたいなパッケージマネージャがあるのもスクリプト的な要素のうちなのか?

655:デフォルトの名無しさん
21/05/15 12:10:16.46 MS0dCBGJ.net
cargoは低レイヤー慣れてる人からすれば邪魔でしかないけどね。

656:デフォルトの名無しさん
21/05/15 12:20:50.35 DTE+piln.net
SourceforgeなどでRustが好きといっている人の大部分はレベルが低いだろう。
そもそもこの世の中、大多数から受けるものにレベルが高いものがあったためしがない。
好きな言語ランキング上位のJS、Pythonも初心者向け言語であることは誰もが認めることだし。

657:デフォルトの名無しさん
21/05/15 12:40:11.21 UqP25wMI.net
sourceforge???
stackoverflowの調査かなんかと勘違いしたの?

658:デフォルトの名無しさん
21/05/15 12:41:57.93 ZgJC7yuF.net
>>644
どういうこと?ベアメタル向けでもcargo使うのが主流だと思っていた

659:デフォルトの名無しさん
21/05/15 12:47:56.99 ZgJC7yuF.net
>>645
使用者のレベルの高低と言語のレベル(?)の高低は一致するという主張かな?
言語のレベルが高いというのが最先端のテクノロジーを取り込むという意味ならrustの目指すところではないと思う
他の言語で実証されたコンセプトを取り込むと宣言してる(た?)はず
高レベルな言語が必要な人はこんな普及言語じゃなくてもっと尖った言語を使うか自分で作るべきなのでは

660:デフォルトの名無しさん
21/05/15 12:49:38.36 DTE+piln.net
>>646
ああ、そっちだった。
Stackoverflowも来てる人の頭の良さは一般大衆と同じくらいだから同じ。

661:デフォルトの名無しさん
21/05/15 12:53:14.42 DTE+piln.net
>>648
そういうことじゃなくて、
・Rustをほとんど使っても見てないのに勝手に「好き」と言っていることが分かってる。
・Stackoverflowのような沢山の人が集まる場所の調査では、必ずJSやPythonのような初心者向けの言語が人気となるわけだから、そこの人々が好きだと思う言語は、JSやPythonのような感覚で使えると勝手に思い込んである蓋然性が高い。
 ただし、現実はRustは実際には使ってないのに勝手に言っている。
ということ。

662:デフォルトの名無しさん
21/05/15 13:20:44.67 YOv93GRR.net
stackoverflowの調査の話なら、調査内容を勘違いしている
あれは「今Rustを使っている人が、今後もRustを使い続けたいかどうか」のアンケート結果をmost lovedと言ってるだけ
だからJSやPythonユーザの意見は入ってない
そもそもloveって言葉に語弊があるし、日本語にしたときに「人気の」とかなって余計訳がわからなくなってる

663:デフォルトの名無しさん
21/05/15 13:25:20.53 YOv93GRR.net
たぶん「最も嫌嫌使っている人が少ない言語」みたいなのが正確な気がするな

664:デフォルトの名無しさん
21/05/15 14:15:44.60 MW7lNw7H.net
「今使ってる人が次も使いたいと思うか?」ってJetBrainsの調査でも毎回入れてくる項目だな
海外のアンケートではよく見るやつ

665:デフォルトの名無しさん
21/05/15 14:17:03.39 DTE+piln.net
>>651
もし前半の通りなら、今Rustを使ってる人なんて極一握りの物好きだけだから
「love」なのは当たり前で調査結果が意味が無い。

666:デフォルトの名無しさん
21/05/15 14:19:45.06 eXXN4CKf.net
一生でどれか一つのプログラミング言語しか覚えられないとして
Rust選ぶ人いますか?
選択したとして別にその言語がいきなりマスターできるわけでなく
ただその言語しか覚えられないというだけですが

667:デフォルトの名無しさん
21/05/15 14:23:36.58 DTE+piln.net
今rustを使ってる人って、自ら進んで使おうとした人に限られるから
嫌いな人がほとんどいないのは当たり前だから、調査結果にバイアスが
掛かりすぎていることになるな。

668:はちみつ餃子
21/05/15 15:05:35.65 pVi51x8H.net
そういえば C++ でメンバ関数の評価順序に関して設計者も気づいてなかった考慮漏れが見つかった
(よくあるパターンが実際には未定義だった) って話があったな。
URLリンク(www.open-std.org)
C++17 で修正されているはずだけど。
宣言的な表現や関数的な表現をプログラミング言語に取り込む試みは数多いが
現実は順序からは逃れられぬのだ……。

669:デフォルトの名無しさん
21/05/15 15:16:25.44 HcoKJY+/.net
Rustがスクリプト的に書けるかどうかはおいといて、
個人用のツール書く言語をPythonからRustに乗り換えたっつー話は一応あるな
URLリンク(hayatoito.github.io)

670:デフォルトの名無しさん
21/05/15 15:20:52.26 DTE+piln.net
>>658
Googleがnode.jsで書いていたものをRustにしたと聞いたぞ。

671:デフォルトの名無しさん
21/05/15 15:23:50.02 TrqVEcq2.net
全部書き直すのは逆に効率悪そう
速度的にキツイ場合のみでいいんじゃないか


672:?



673:デフォルトの名無しさん
21/05/15 15:32:34.68 H/3gPTTR.net
どちらかといえば速度よりも変更頻度が動機になると思う
静的チェックツールも増えてはいるけどコンパイル型はいじる時の安心感が違う

674:はちみつ餃子
21/05/15 15:37:59.52 pVi51x8H.net
>>660
言語を跨いで呼出すときはその境界で色々な処理が挟まったりもするので、
まだらに入り乱れるような形になるとそれはそれで実行性能の足を引っ張ることもある。
状況次第なので一概には言えないけど、言語を変更すると決めたなら
そこそこ大きい単位で乗り換えるのが妥当な場合は結構あると思うよ。

675:デフォルトの名無しさん
21/05/15 17:32:17.46 jwQMP5Oj.net
>>661
それはあるね
個人用のツールだとそんなに真面目にテストも書かないから
動的型だと忘れた頃に改修したくなって詰む

676:デフォルトの名無しさん
21/05/15 18:53:39.15 IpomZGOJ.net
>>642
MSがdotnet対応のRust#出したらUnityワンチャンあるんやない?

677:デフォルトの名無しさん
21/05/15 19:10:58.08 Y+SvMVkX.net
そこはRust/CLIで。

678:デフォルトの名無しさん
21/05/15 21:52:45.98 TrqVEcq2.net
GCのあるrustに存在意義などない

679:デフォルトの名無しさん
21/05/15 22:13:28.16 Y+SvMVkX.net
GCとデストラクタが共存するC++/CLIはなかなか興味深い言語だった。

680:デフォルトの名無しさん
21/05/16 11:00:47.47 9EXRd3vl.net
RustのGCって初期はまた復活されるかもーみたいなノリじゃなかったっけ?

681:デフォルトの名無しさん
21/05/16 11:12:01.38 SPtqbmz9.net
RC関連についてはやるとか?

682:デフォルトの名無しさん
21/05/16 12:07:45.66 MDYO1Tug.net
@ pointerとか ~ pointerとかあった頃の話?

683:デフォルトの名無しさん
21/05/16 15:06:48.66 JH7fFMWR.net
>>665
確かにそっちか
>>666
GCがあるRustって言うよりはunsafeを外部リンクで呼び出してるようなもんだろ

684:デフォルトの名無しさん
21/05/17 10:53:44.01 ZSkTvtbm.net
rustが覇権を取るにはPHPみたいにドキュメントの翻訳をたくさん作ること
そしてサンプルコードを盛り込むこと

685:デフォルトの名無しさん
21/05/18 19:40:20.00 A1yOEMnk.net
>2021 Editionは2021年10月にリリースされる。今回のエディションは「Rustの使用感を大きく改善する」ものになるという
あんまり前にこんな発表しないでほしい
やる気なくなる

686:デフォルトの名無しさん
21/05/18 19:44:35.79 Gj41gD2H.net
>>673
ちゃんと発表資料見れば分かるけど、大して使用感変わらんよ
クロージャー使いまくりの人が一番恩恵を受けるかな

687:デフォルトの名無しさん
21/05/18 20:19:55.73 Z0RWJbQc.net
所有権は移動するときのほうにマークが出るべきなんじゃあ

688:デフォルトの名無しさん
21/05/19 07:47:56.56 X700JkCT.net
まぁコストかかるのはコピーだし

689:デフォルトの名無しさん
21/05/19 08:05:05.13 o3bqBTNO.net
Rustの真似をしようとする言語がないのがふしぎだ

690:デフォルトの名無しさん
21/05/19 12:30:25.52 HmkTJiD6.net
URLリンク(en.m.wikipedia.org)(programming_language)
wikipedia見ただけだけど Crystal, Elm

691:デフォルトの名無しさん
21/05/19 12:30:46.25 HmkTJiD6.net
など影響を与えた言語は列挙されてた

692:デフォルトの名無しさん
21/05/19 12:42:47.10 9T1L9lvJ.net
>>678
Elmのどこが?と思ってソースを読んだら
関数型言語なら大体持ってるEither型の名前を Result, Ok, Error にしたところがRust由来とな
うーむ持ってきたのは名前だけなのにInfluencedか

693:デフォルトの名無しさん
21/05/19 12:59:40.27 u9Tr9lyP.net
Gleam
URLリンク(gleam.run)
OwnershipやLifetimeの考え方を採用した言語はまだ聞いたことがない

694:デフォルトの名無しさん
21/05/19 13:11:21.07 bDX8SBSl.net
所有権の考え方を採用している言語としてはC++などがあります

695:デフォルトの名無しさん
21/05/19 14:00:04.90 NOe9g/vN.net
まあインスタンスの共有については何らかの言語サポートが入ってもおかしくないかもね

696:デフォルトの名無しさん
21/05/20 01:09:22.49 WwVMFHF+.net
DにもOwnership入ったとか小耳に挟んだだけなら

697:デフォルトの名無しさん
21/05/20 17:03:02.09 VKAk8Olu.net
URLリンク(forest.watch.impress.co.jp)
凄いね

698:デフォルトの名無しさん
21/05/20 17:06:31.55 13olK3Lw.net
>>685
UIがReactというのが残念

699:デフォルトの名無しさん
21/05/20 18:20:18.69 PiC1UW/o.net
逆に何ならいいんだよ

700:デフォルトの名無しさん
21/05/20 18:33:43.55 UXe9/StR.net
GUIフレームワークをRustで作るうまみあまりなさそう

701:デフォルトの名無しさん
21/05/20 19:39:25.12 QrP75Wi1.net
Rustで作ってあるなら絶対大丈夫だな!

702:デフォルトの名無しさん
21/05/20 22:57:01.82 HbCDuKW4.net
設計がクソだとダメ
ダメなヤツはなにやってもダメ

703:デフォルトの名無しさん
21/05/21 11:45:49.77 r1IBz1vL.net
>>538
(1)もちろん例外を使わずとも関数呼び出し等がエラー値を返すことで全て実現できます
(2)ところがエラー値が返ってくると毎回if文やmatch等でエラー時はそこですぐreturnする等の処理を書く必要があって面倒かつコードが醜いため例外の使用が好まれました
(3)Rustでは関数の返り値型をResult<T,E>とすることに加えて「?」オペレーター(旧try!マクロ)を使うことで(2)の処理を自動化しました
つまり関数等呼び出し毎にifやmatch等で返り値エラーチェック&returnの記述をしなくても末尾に「?」を記述するだけで済みます
これでチェーンも出来て具体的には
b = a.hage()?.hige()?.hoge()?
と書くだけでhage()でエラーが返れば早期エラーreturnしますしhige()やhoge()でエラーでも同様です
関数の返り値型がResult<T,E>であることが使用条件です
これはもちろん正常値の<T>型とエラー<E>型のenumです
これらにより関数を多段に深く呼び出していても深い所でのエラーがすぐにreturnを多段にしてエラーが戻って来ます
したがってRustでは例外を使わなくても困らないのです

704:デフォルトの名無しさん
21/05/21 13:37:02.96 J6y23PLS.net
すまんrust新参者なんだが、Rust By Exampleのコードいじって勉強してて、以下のコードが疑問に感じられた。
以下のプログラムはmain関数内のif文は実行されないとは明らかなんやが、それでもsubの行でいわゆるuse-after-freeのコンパイルエラーが出る。
これはif文が実行されなくてもdropは実行されるということなんですか?
下のコードみたいにuse-after-freeになるかならないかがif文の条件満たすかどうかによって決まるようなプログラムでも
rustでは一緒くたにuse-after-freeになるとみなされるってことなんですね?
そう考えればそこまで賢くないコンパイラですね
struct Droppable {
id: &'static i8,
}
impl Drop for Droppable {
fn drop(&mut self) {
println!("> Dropping {}", self.id);
}
}
fn sub(d: &Droppable) {
if *d.id == 0 {
drop(d);
println!("> Test {}", d.id);
}
}
fn main() {
let _a = Droppable { id: &0 };
if *_a.id == 1 {
drop(_a);
}
sub(&_a);
}

705:デフォルトの名無しさん
21/05/21 13:4


706:0:53.52 ID:J6y23PLS.net



707:デフォルトの名無しさん
21/05/21 13:44:28.52 J6y23PLS.net
Compiling playground v0.0.1 (/playground)
error[E0382]: borrow of moved value: `_a`
--> src/main.rs:22:9
|
| let _a = Droppable { id: &0 };
| -- move occurs because `_a` has type `Droppable`, which does not implement the `Copy` trait
| if *_a.id == 1 {
| drop(_a);
| -- value moved here
| }
| sub(&_a);
| ^^^ value borrowed here after move //ここでuse-after-free errorが発生!
error: aborting due to previous error
For more information about this error, try `rustc --explain E0382`.
error: could not compile `playground`
To learn more, run the command again with --verbose.
見やすくした

708:デフォルトの名無しさん
21/05/21 14:49:33.29 vx/ErwhM.net
意味のないコードだよ

709:デフォルトの名無しさん
21/05/21 14:53:16.15 PNtD97K1.net
コンパイラは別に値まで見ないからな
clippyが意味のない分岐だよと指摘してくれるのかどうかは知らんが

710:デフォルトの名無しさん
21/05/21 14:55:24.20 HgMuIEwp.net
>>692
基本的に条件分岐はpredがコンパイル時に評価できる場合でも true/false 両方あり得るものとして扱われるよ
その後の最適化フェーズであり得ないルートは除去されるだろうけど最適化の結果でコンパイルエラー差異が出ないようにする考え方なんだと思われる
無限ループ専用の構文であるloopが導入された背景もたぶんこのあたりにある

711:デフォルトの名無しさん
21/05/21 15:52:58.09 J6y23PLS.net
>>697
trueのときもdrop、falseのときもdropされるとみなされるということは、
if文によってheap領域で確保しているメモリを解放するかしないか場合分けできないってことじゃん
それって不便では?

712:デフォルトの名無しさん
21/05/21 16:14:23.61 qRzkKAr2.net
>>698 これ元のコード見てみ
これifの条件がtrueだろうがfalseだろうがsub(&_a);は実行されるやん
ifの条件がfalseのときには問題なく実行できるけど、もしifの条件がtrueになって_aがdropされてしまった後にsub(&_a);が実行されてしまうと開放された値を使うことになる
だからRustコンパイラはエラーを吐くんだよ

713:デフォルトの名無しさん
21/05/21 16:15:51.92 91Y2FzX3.net
いや、普通に場合分けはできるが…
どちらかというとifの条件を変えるたびにコンパイルが通ったり通らなかったりするほうが不便では?
そこにifがあるってことは(将来的にとか何らかの条件で)実行される可能性があるからあるんでしょ
もし絶対に実行されないことが確定してるなら書く意味ないし

714:デフォルトの名無しさん
21/05/21 16:19:22.28 91Y2FzX3.net
場合分けしたいならこんな感じで
if *_a.id == 1 {
drop(_a);
} else {
sub(&_a);
}

715:デフォルトの名無しさん
21/05/21 17:42:19.92 J6y23PLS.net
>>700
言ってる意味がさっぱりわからん
>>692のプログラムにあるとおり
現実問題、将来的に決して実行されるわけがないif文というものは存在するし
if文があるというのは実行される可能性のあるの十分条件でもなければ必要条件でもなわけでもないんやが。
ワイが言いたいのは仮にrustの型システムを無視して>>692のコードをそのままコンパイルしたとしても
if文は実行されないわけだから安全なはずなものまでを省いているというところが不思議だってことや
つまりuse-after-freeバグが現実には起きないコードまでもif文の他の条件でUAFバグが起きるがために
ひとまとめにUAFが起きる


716:ニみなすrustコンパイラの姿勢がif文である条件のときだけfreeするコードを書くのを認めないようにみえるという ワイの感想に繋がってるわけでして



717:デフォルトの名無しさん
21/05/21 17:53:39.45 IHGXJo1X.net
use of moved valueやborrow of moved valueを
use-after-freeとして理解してるのがそもそも間違ってる
The Bookを読んでLifetimeとOwnershipを復習してくれ

718:デフォルトの名無しさん
21/05/21 18:00:55.07 J6y23PLS.net
>>692のコードをcに書き直してみたらこうなる
} Droppable;
void drop(Droppable* d) {
printf("> Dropping %d", d->id);
free(d);
}
void sub(Droppable* d) {
if (d->id == 0) {
//free(d);
printf("> Test %d", d->id);
}
}
int main() {
Droppable* _a;
_a = malloc(sizeof(Droppable));
_a->id = 0;
if (_a->id == 1) {
drop(_a);
}
sub(_a);
}

719:デフォルトの名無しさん
21/05/21 18:01:46.42 J6y23PLS.net
これはrustでは弾かれるはずの「if文のある条件のときだけヒープのある部分をfree」というコードのはずだが
安全なCのプログラムや コンパイルは通るしランタイムエラーも起こさない。
メモリ安全なプログラムの中では、cで書けるプログラムのほうがrustで書けるプログラムより広いんだね
rustはメモリ安全なcのプログラムと同等な処理を書けない部分もあって不便じゃないかっていうのが結局のところワイの疑問になるんや
じゃあrustでは「if文のある条件のときだけヒープのある部分をfree」のコードをどう書くんや?
メモリ安全性を損なってるわけでもない処理ではないはずなんやがrustのコンパイラははじくぞ?

720:デフォルトの名無しさん
21/05/21 18:03:27.13 J6y23PLS.net
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int id;
} Droppable;
void drop(Droppable* d) {
printf("> Dropping %d", d->id);
free(d);
}
void sub(Droppable* d) {
if (d->id == 0) {
//free(d);
printf("> Test %d", d->id);
}
}
int main() {
Droppable* _a;
_a = malloc(sizeof(Droppable));
_a->id = 0;
if (_a->id == 1) {
drop(_a);
}
sub(_a);
}
ほい完全版

721:デフォルトの名無しさん
21/05/21 18:06:23.36 p9FphGnI.net
>>705
unsafe使え、というかもうちょっと具体的な例じゃないと困る
今まで出された例だと「最初から絶対通らないの分かってるならif文消せばいい」としか思えないので

722:デフォルトの名無しさん
21/05/21 18:12:17.78 91Y2FzX3.net
別にわざわざCで書いてもらわなくても安全なのは分かるよ
今のRustコンパイラで通らないのはボローチェッカーが最適化前にあるからなんで
部分的にでも先に最適化すれば通るようにはできるだろう
ただそれをしたい動機が分からない
本当にifが実行される可能性が一切ないなら単に消せばいい、といしか言いようがないので

723:デフォルトの名無しさん
21/05/21 18:14:06.78 J6y23PLS.net
>>703
それただの論点そらしだよね
UAFってrustの独特なメモリ管理手法と相反する用語ではないし
use of moved valueやborrow of moved valueもUAFを阻止するためのものだよね
じゃあrustでは「if文のある条件のときだけヒープのある部分をfree」のコードをどう書くんや?

724:デフォルトの名無しさん
21/05/21 18:18:59.35 p9FphGnI.net
>>709
DroppableのメンバにBox<i8>持たせろ
仮に"drop"された後でもsubが正常に動くことが期待されているなら、そこで使うべきなのはdropではない

725:デフォルトの名無しさん
21/05/21 18:22:54.40 91Y2FzX3.net
というか >>701 で書いたif/elseの例はちゃんと「if文のある条件のときだけヒープのある部分をfree」になっているのに何か不満なのか

726:デフォルトの名無しさん
21/05/21 18:24:13.35 IHGXJo1X.net
>>709
UAFを阻止するためだけにあるものじゃないから
やり方は>>701で教えてくれてるやろ
とりあえずThe Book読んでね

727:デフォルトの名無しさん
21/05/21 18:31:38.95 p9FphGnI.net
>>709
これでどうですか?
URLリンク(play.rust-lang.org)

728:デフォルトの名無しさん
21/05/21 18:38:40.69 J6y23PLS.net
>>711
そうやん
rustって不思議やね

729:デフォルトの名無しさん
21/05/21 18:44:49.25 J6y23PLS.net
解決しました。
なにはともあれありがとうございました。>>701の方に救われました。
ここまで関わってくださった皆様まことに協力ありがとうございました。感謝いたします。

730:デフォルトの名無しさん
21/05/21 19:24:50.36 91Y2FzX3.net
「理論的に安全な任意のコードは通るべき」ってイメージだったのかな
実際にはそんなことはなくて、上の例のようなコードを通すためには色々なトレードオフがあるから
単に「理論的に安全」ってだけで無条件に実装されることはない
もっと具体的なユースケースがあって、みんなが「これは通らないと不便だよね」ってなったものが実装される
数年前に実装されたnon lexical lifetimesなんかはまさにその例だね

731:デフォルトの名無しさん
21/05/21 19:31:11.66 bfSFy0HM.net
はぎゃーん

732:デフォルトの名無しさん
21/05/21 21:43:48.32 HgMuIEwp.net
クロージャの disjoint capture が破壊的変更になるのは分かるんだけど最初からこうなってなかったのはなぜ?

733:デフォルトの名無しさん
21/05/21 22:34:26.09 vpqVq/KA.net
iter()とinto_iter()の使い分けが分からない
iter()じゃないといけない場合があるのは分かるんだが

734:デフォルトの名無しさん
21/05/21 22:49:37.59 +ok17UuV.net
into_iterは所有権を奪いItemを得ることができる
iterは&Itemを得る
他のintoで始まるものは所有権を奪うことになってる

735:デフォルトの名無しさん
21/05/21 23:22:44.96 qRzkKAr2.net
>>711 Rustコンパイラが問題視してるのは開放された値を使ってしまう可能性があることで、それが修正された >>701 のコードは問題ないから通る

736:デフォルトの名無しさん
21/05/22 00:04:28.82 yRhz4OAW.net
>>719
Rustでの変数の受け渡し方は
by (shared) reference、by mutable reference、by valueの3つなので
それに対応していろいろなものが3種類1セットになってる
イテレータならiter(), iter_mut(), into_iter()
クロージャならFn, FnMut, FnOnce
コンバージョンならAsRef, AsMut, From/Into

737:デフォルトの名無しさん
21/05/22 00:34:10.91 RuplHzwP.net
as_foo(), to_foo(), into_foo() の違いも覚えておくとよいかもね

738:デフォルトの名無しさん
21/05/22 00:45:11.88 yRhz4OAW.net
覚えておくとはいいのはそうだけど、そのセットは少し観点違うよね
URLリンク(rust-lang.github.io)

739:デフォルトの名無しさん
21/05/22 16:34:10.81 ma8sDMzI.net
Rustややこしいわぁ

740:デフォルトの名無しさん
21/05/22 20:26:18.21 UuUK8ShD.net
Rust慣れたあと他の言語行くと
良い作法が身についてて歓迎される、とかありますか?

741:デフォルトの名無しさん
21/05/22 20:30:50.12 18meLr+O.net
>>726
言語が異なれば同じことをするにも良い作法とされる方法は異なるだろうし、そんなに役に立たないかもよ。
むしろRustでは〜と言い出すとかえってうるさがられる可能性も。

742:デフォルトの名無しさん
21/05/22 20:34:58.75 RuplHzwP.net
rustでは変数のshadowing当たり前のように使うけど他の言語では嫌がられそう

743:デフォルトの名無しさん
21/05/22 21:08:16.57 9BHHuuQy.net
let value = value;
とか他言語で書いたらアホだと思われるし

744:デフォルトの名無しさん
21/05/22 21:10:13.17 61y793Zl.net
Rustはメイン関数かその次の関数のローカル変数にリソースを保持する形にしがちじゃない?
他の言語だとあんまりやらない

745:デフォルトの名無しさん
21/05/23 03:12:09.36 1TnUlIAl.net
>>730
他の言語でも同じだよ
それとも禁断のグローバル変数を使う駄目パターンをRustでもしたいということ?

746:デフォルトの名無しさん
21/05/23 06:28:03.88 ApnxiBa8.net
pythonみたいな動的型付け言語ではよう見るけどさ
Rustではこんなん要らなくしてほしいわ

747:デフォルトの名無しさん
21/05/23 13:14:57.61 viOBOYhY.net
ライブラリによってはデータを持ち運ぶということが不可能だったりするからグローバル変数必須だったりするんだよな
(具体例: serenity)

748:デフォルトの名無しさん
21/05/23 13:33:01.51 1FznZ2H5.net
いや別に必須ではないだろ。

749:デフォルトの名無しさん
21/05/23 13:39:52.69 p3SEnqzU.net
log!() みたいなプログラムの各所から呼び出されるマクロや関数の実装の為には rust でも普通にグローバル変数使われているのでは
static 変数にするためには Sync が要求されたり mut にするために Mutex 使う必要があるから他の言語ほど気楽に使えないというだけで
グローバル変数そのものが禁断扱いされることはないかと
グローバル変数の濫用は他の言語同様嫌われるけどね

750:デフォルトの名無しさん
21/05/23 13:43:31.31 1TnUlIAl.net
一般的にどんな言語においても何らかの外部のライブラリを取り込む時には
何か一つのクラスとかオブジェクトとか構造体とかに閉じ込めてしまって
それ一つだけ持ち運ぶからグローバル変数を使うことは無いでしょう

751:デフォルトの名無しさん
21/05/23 16:18:03.34 ljEJPp90.net
>>735
static変数とglobal変数はスコープが違うだろ
global変数が悪とされるのは、そのスコープの広さだからね
いつどこで誰が変更するのか、また参照するのか、スコープが広ければ広いほど把握が困難になる
把握が困難になればなるほど、それだけバグを生む温床になる

752:デフォルトの名無しさん
21/05/23 18:34:32.71 1FznZ2H5.net
io周りは極論すればどう管理してもグローバルだからな。
プロジェクト毎に規約設ける以外にまともに管理する方法なんてない。

753:デフォルトの名無しさん
21/05/23 20:09:32.32 wHpcVS8W.net
>>735
そういやロガーの設定ってどこに保存されてるの?
debug!() 呼ぶたびにMutexロックしてるのかな?

754:デフォルトの名無しさん
21/05/24 12:11:21.84 1Toh/2dP.net
>>736
クラスの中に入れても、グローバル変数であることは避けられないし
どんな言語においてもグローバル変数は必要。

755:デフォルトの名無しさん
21/05/24 12:28:02.03 wwlvG9VZ.net
「:?」ってなんなんですか?
URLリンク(tourofrust.com)

756:デフォルトの名無しさん
21/05/24 12:49:55.25 KKN49LSI.net
>>741
デバッグ用のフォーマットで出力するという意味
詳しくは以下参照
URLリンク(doc.rust-lang.org)

757:デフォルトの名無しさん
21/05/24 13:24:07.35 JJaZh5wC.net
>>740
そんなことはないだろう。
確かにグローバルでも大して変わらんてものはあるけど、
loggerを引数で渡していくっていうような実装方法もある。

758:デフォルトの名無しさん
21/05/24 13:33:20.21 u2umy7DV.net
>>739
logクレートのstatic mut変数だね
ロックするのは初期化とレベル設定時だけ
出力時にロックするかどうかは実装次第

759:デフォルトの名無しさん
21/05/24 15:43:10.46 dukpbHqg.net
>>740
そのクラスの存在そのものがグローバル変数(相当)だという話?
それともそのクラスもしくはそのインスタンスをグローバル変数に入れて使うということ?
後者の意味ならば必要な範囲で引数として持ち歩けばグローバル変数を普通は使わないですよね。

760:はちみつ餃子
21/05/24 16:59:24.57 tdQ8iTTE.net
大事なのは抽象化がきちんとしているかどうか。
各部品が妥当な意味に分離されているかどうか。
グローバル変数がよくないのは色んなパーツから横断的に使われる可能性があって
部品が不必要に密結合していることの表れだからであって、
そのグローバル変数のアクセス範囲が妥当な範囲に制御されているなら問題じゃないよ。
過剰な密結合を解消せずにグローバル変数を引数に置き換えてたら
影響範囲が見えにくくなってもっと悪くなることだってありうる。
まあどういう場合なら妥当なのかってのは色々と意見はあると思うけど。

761:デフォルトの名無しさん
21/05/24 17:17:23.03 qqtJSk72.net
$_POSTはセーフ

762:デフォルトの名無しさん
21/05/24 17:21:32.94 Ig527IlE.net
>>746
まずは長くて区別しやすい名前に変えるのがスタートかね。

763:デフォルトの名無しさん
21/05/24 17:31:54.98 wwlvG9VZ.net
>>742
ありがとう!


764:なんか独特なのね



765:デフォルトの名無しさん
21/05/24 23:12:37.25 rI3Y4Uqa.net
関数型言語やったことないけど、Rustいけるかな
JavaとC++はそこそこ経験あり

766:デフォルトの名無しさん
21/05/24 23:17:37.88 zk4LoLUU.net
Java 8とかC++ 14以降くらいなら結構似たような機能も入ってるし
そこまで大変じゃない気がする

767:デフォルトの名無しさん
21/05/24 23:36:00.17 JJaZh5wC.net
c++はともかく、cくらいはやっぱ理解してた方が早道な気はする。

768:デフォルトの名無しさん
21/05/25 01:36:21.07 5vUI50kp.net
以下のような関数を作ったんですがmatchが多くてどうしようか考えていました
fn foo(x: Option<u32>, y: Option<&str>) { //実際はOptionが5個とか
let x = match x {
Some(x) => x,
None => return,
};
let y = match y {
Some(y) => y,
None => return,
};
println!("{} {}", x, y);
}
考えついたのが、次のようにする方法なのですが、
fn foo(x: Option<u32>, y: Option<&str>) -> Option<()> {
let x = x?;
let y = y?;
println!("{} {}", x, y);
Some(())
}
記載の省略のためだけに返値の型をOption<()>にして最後にSome(())つけるのがすごく気持ち悪いんですが、
返値なしのままどうにかする方法はないでしょうか

769:デフォルトの名無しさん
21/05/25 02:11:48.11 QcInQ0e9.net
if_chain使って
if_chain!{
if let Some(x) = x;
...
then { println!("{}", x); } }

770:デフォルトの名無しさん
21/05/25 02:16:51.35 Ygc8ZzR1.net
>>753
fooの型変えられないなら、戻り値Optionはクロージャないしローカル関数に留めるといいと思う
URLリンク(play.rust-lang.org)

771:デフォルトの名無しさん
21/05/25 03:00:10.05 nrKC74iS.net
Ok(())はよく使うがSome(())はないな
普通にif-letでパターンマッチするのでよくない?
if let (Some(x), Some(y)) = (x, y) {
println!("{} {}", x, y);
}

772:デフォルトの名無しさん
21/05/25 05:18:39.47 gz717nup.net
loggerを引数で渡すためには
ロギングを行うクラスFooがどこかしら(コンストラクタか個々のメソッドで)loggerを受け取る引数を持たねばならない
これ、ロギングみたいな裏方の仕事がFooのインターフェース仕様に影響しているということで、
抽象度が下がってるやんけ;;;
引き換えに得られるメリットは、Fooのインスタンスごとにloggerを切り替えられるというおおよそ現実的にありがたみが無い機能だけ

773:デフォルトの名無しさん
21/05/25 06:08:48.35 FYPKUk3M.net
>>756
それをmachでやるのがよくない?

774:デフォルトの名無しさん
21/05/25 06:23:40.79 gz717nup.net
つか機能の分離と記述の分離はトレードオフがある
1+1=2の形式的証明がどんだけの糞みたいな分量のに成り得るかを見たらワカル
どっかの抽象度をつきつめれば別のところにしわ寄せが逝く
それで良いジャマイカ人間の言語だもの、

775:デフォルトの名無しさん
21/05/25 09:01:56.56 5vUI50kp.net
皆様ありがとうございます
どうもSomeをある程度書くのは避けられない感じですね

776:デフォルトの名無しさん
21/05/25 10:09:28.07 4oEEOZjA.net
まさかstatic変数使ってるなんて、logクレートには失望したわ

777:デフォルトの名無しさん
21/05/25 10:33:41.89 bGIV0Xp5.net
>>757
ログを裏方と考えるのも偏ってるし、ログ切り替えはデバッグ目的で普通にあるわ。
別にグローバルにするという選択が間違いとも思わんがこういう決めつけ野郎は邪魔だな。

778:デフォルトの名無しさん
21/05/25 10:59:01.14 /nQyXsn+.net
サーバ側だとログを取るのが基本だし取り方も変えたくなるからlogger渡しは結構やるな
CLIとかなら雑にstaticでいいけど

779:デフォルトの名無しさん
21/05/25 13:12:03.88 CssgwvqL.net
>>761
stdも使えないじゃん

780:デフォルトの名無しさん
21/05/25 18:48:30.58 4oEEOZjA.net
>>764
なんで?

781:デフォルトの名無しさん
21/05/25 19:25:41.69 CssgwvqL.net
>>765
URLリンク(github.com)

782:デフォルトの名無しさん
21/05/25 19:39:28.48 4oEEOZjA.net
>>766
えー
これからは write() システムコールでプリントするわ

783:デフォルトの名無しさん
21/05/25 21:02:03.28 p1A5R6d8.net
stdが嫌ならcoreを使え

784:デフォルトの名無しさん
21/05/25 22:59:34.15 gz717nup.net
>>762
近代的なログシステムならタグが使えるから
記録時に分っける理由がさらさらない
だいたい並列な事象を並列なまま記録したのでは時系列の解析ができないし、
そもそも>>762がいくら「ログは裏方じゃない」と叫んだところで基準が無い
アプリケーションロジックを汚してまでか?!という議論はいつまでもつきまとう

785:デフォルトの名無しさん
21/05/26 00:00:47.75 S2nFrW0F.net
別に仕事で使ったことないならそういえばいいと思うよ。悪いことしてるわけじゃないんだから。

786:デフォルトの名無しさん
21/05/26 00:04:47.15 PLorGv/T.net
そういやLog4JでいうMDCみたいなやつはあるのかしら?

787:デフォルトの名無しさん
21/05/26 00:07:56.89 rwxZHBm1.net
お前らslog
>>760
ただのzipやん。
URLリンク(play.rust-lang.org)

788:デフォルトの名無しさん
21/05/26 08:19:13.92 AN5OxrIl.net
まあloggingオブジェクトを複数作る仕事なんなら仕方が無いな

789:デフォルトの名無しさん
21/05/26 08:29:19.07 vJAmL6Qi.net
slog見たけど、クソややこしいな

790:デフォルトの名無しさん
21/05/28 09:51:25.19 jQHjx/Sg.net
シンタックスで判断しづらいもので性的分析するって、そのうち破綻しそうだな。

791:デフォルトの名無しさん
21/05/28 09:54:11.42 S8Iz9SRl.net
エロい分析か

792:デフォルトの名無しさん
21/05/28 10:45:17.68 EKMYAKDR.net
やらC

793:デフォルトの名無しさん
21/05/29 20:28:41.06 sKXDX7XX.net
JPEG-XLのリファレンス実装作ってるチームがRustで再実装も始めてて驚いた
URLリンク(github.com)
FirefoxにJPEG-XL対応を入れるかどうか議論するチケットで
今更大量のunsafeなC++コードを入れるのはちょっと……みたいな反応をされてた事と関係あるのかもしれない

794:デフォルトの名無しさん
21/05/30 15:56:56.42 HupJBx7X.net
URLリンク(4e6.github.io)
URLリンク(www.openhub.net)
Firefox、かなりの割合でC++のコード入ってるけどこれでも減らそうとしてるのか

795:デフォルトの名無しさん
21/05/30 16:00:13.57 P46Jh5T1.net
もう9.5%も行ってるのか
と言うかfirefoxからrustは始まったから当然か

796:デフォルトの名無しさん
21/05/30 16:15:38.02 ds+xAsBi.net
でも、大量の有名なWebサービスが一時的にRubyで書いていたのに、
しばらくすると他言語に書き直した歴史がある。
アメリカ人はなぜか言語を書き直すのが好きなようだ。
Rustで書いてもまた別言語に直すかも知れない。
なお、Googleドライブなどの各社のストレージサービスを統一的なAPIで制御できる
ライブラリも何故かGoで書かれている。
メンドクサイ。

797:デフォルトの名無しさん
21/05/30 17:11:41.17 cF4puvJq.net
>>781
遅い方から速い方へ書き直すのよ
特にスクリプト言語からC++/Rustへ書き換えるとサーバー数を1/10にできるケースもあり規模によっては経費激減ね
GoもGCあるから場合によっては他へ書き換えられる対象になりうるかも
Rustが他へ書き換えられる可能性がもしあるとしたら今はまだ存在しない新たに出現する言語へ

798:デフォルトの名無しさん
21/05/31 00:35:54.04 7s+MSAY0.net
なんでClippy大先生がcargoでインストールできるクレートから外されるの?

799:デフォルトの名無しさん
21/05/31 01:50:13.82 u1BqTaEs.net
rustupでインストールできるからでは
rustcとバージョン合わせないといけないから他のcrateと同じ扱いはしづらいのでは

800:デフォルトの名無しさん
21/05/31 08:44:19.92 etoumxTf.net
Ruby on Rails の時価総額は、
Shopify が15兆円、
民泊のAirbnb が、大手ホテル3社の合計以上の10兆円、
Github が8千億円
これぐらい巨大でも、Rails で出来る。
時価総額が千億円以上になったら、Go, Elixir を考えてもよい
食べチョクは売上50億円らしいけど、
若い文系女が1人で起業したような会社は、Rails で十分
売上が千億円を超えたら、考えてもよい

801:はちみつ餃子
21/05/31 15:24:48.93 hqkxpUd6.net
ウェブシステム全体の実行コストはネットワークや IO にボトルネックが有るので
システム構成やらなんやらで工夫するのがまずやることで、
言語の速度が少しばかり速いのはそんなに効いてこないよ。
という話もよく聞くんだけど、実際のところどんなもんやろね?


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

414日前に更新/267 KB
担当:undef