Rust Part6

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2018/07/28(土) 03:04:38.63ID:kAX50nYD
Mozilla発のRust言語のスレ

公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust

Web上の実行環境
https://play.rust-lang.org

前スレ
Rust Part5
http://mevius.5ch.net/test/read.cgi/tech/1518347244/
419デフォルトの名無しさん
垢版 |
2019/01/19(土) 21:10:10.72ID:chH9K/tE
target_os とかとは違うの?
2019/01/19(土) 23:26:08.16ID:mgFfw5BT
静的リンクならcfgマクロ使った条件付きコンパイルしかないよ。
421418
垢版 |
2019/01/20(日) 02:42:18.64ID:Ej9w6434
ありがと
#cfg[(target_os=〜
struct System {
とか書くしかないのか

というかググっていてもマルチプラットフォームのアプリを作る例って出てこないんだけど
どういう風にするのが好ましいのだろうか。Cargoの使用例とか全然判らん
ターゲットによってコンパイラも変わるし、リンカやリンカに渡されるオプションも変わる
リンク後に追加の処理が必要になるケースもあったり
2019/01/20(日) 11:51:23.29ID:fjDkObgS
有名なcrateはだいたいマルチプラットフォームになってるでしょ
423418
垢版 |
2019/01/20(日) 13:10:03.87ID:Ej9w6434
そのレベルじゃなくて一つのプロジェクトで
1.Windowsでビルドする/動く
2.Linux/FreeBSDでビルドする/動く
3.Linuxでクロスビルドする/別アーキテクチャのプラットフォームで動く
みたいなのをやりたい。1〜2はともかく3はベアメタルに近いのでコアのソースはno_std付きになる

クレートもWindowsAPIへアクセスする場合Cargo.tomlに
[dependencies]
winapi = "〜
kernel32-sys = "〜
とか書くけどコレをつけたまま他のプラットフォームでビルドできるのか?とか
仕様上無視してくれるならそれで良いけどはっきりしないと無用なトラブルの元
クレートを使わずにソースにexternを並べていって条件付きコンパイルすればその心配は
なくなりそうだけど各種定義とか、IA32/AMD64環境下の差異の吸収とかいろいろ面倒だし
2019/01/20(日) 13:24:49.19ID:fjDkObgS
>>423
有名なcrateはだいたいちゃんとそれこなしてるから見てきなよ
425418
垢版 |
2019/01/20(日) 15:13:45.29ID:Ej9w6434
スマン
Carge&winapiを使ってWindowsAPIを叩くサンプルを作ろうとしたらそこまでたどり着けん
use出来なくて詰まっている

extern crate winapi;
use winapi::minwindef::BOOL;
>cargo build
error[E0432]: unresolved import `winapi::minwindef`
--> src\main.rs:4:13
|
4 | use winapi::minwindef::BOOL;
| ^^^^^^^^^ Could not find `minwindef` in `winapi`
パスがおかしいっぽいのでソースを見るべきだが、Cargoが取ってきたソースがどこにあるのか判らない
というかコレを調べられないと非対応環境でどう振る舞うのかも調べられない

rustcでコンパイルするFFI直でWindowsAPIを叩くコードは動作させられている
2019/01/20(日) 15:34:24.69ID:IFCR+fSZ
Cargo.toml に

[target.’cfg(target_aech = "x86_64")’.dependencies]

とか書けるけど、これでも不十分?
427デフォルトの名無しさん
垢版 |
2019/01/20(日) 22:10:39.80ID:Yfn6IVUJ
cargoがとってきたのはホームの下の.cargoにあるよ

質問がいまいち判然としないけど
428デフォルトの名無しさん
垢版 |
2019/01/20(日) 22:18:26.33ID:XwDXpx/J
WEB開発でフロントエンドもバックエンドもRustで開発できるようになるみたいだね
そしてJavascriptは衰退するらしい
まさに次世代の言語か?
2019/01/20(日) 23:40:56.74ID:Ba0cWsCk
Javascriptを倒すのは無理
430418
垢版 |
2019/01/20(日) 23:41:16.28ID:Ej9w6434
>>426
それでいけそうかも。というかwinapiにそんな書き方があった

>>427
ありがと。見つかった
README.mdにあったサンプルはビルドできた
1〜2年前のコードだとビルドできないようだ

いくら発展途上の言語とはいえ1〜2年前の情報が使えないのはつらいなぁ
車輪の再発明になってもFFIで書いていった方が良いのか?

というかみんなどうしているの?情報の有効期限が1年もないんじゃ
ちょっと前のを修正するにもドキュメントはないしソースとにらめっこになっちゃうよね
431デフォルトの名無しさん
垢版 |
2019/01/21(月) 21:41:20.34ID:ieTTkacC
nightlyでも使っていない限りは、基本的に過去のコードはビルドできると思うけど
2019/01/21(月) 22:24:30.39ID:imUXN0q+
>>418
rustにとって一年前は古いけどwinapi::minwindefは今はwinapi::shared::minwindefよ。
apiが変更されただけだからまずdoc読めばいいよ。
あとrustupでrust-docインストールすればthe cargo bookもあるからそれも読んで。
433418
垢版 |
2019/01/22(火) 08:09:48.68ID:owMGrrnU
>>432
0.3.x以降はCargo.tomlにfeaturesを書かないとダメらしい
あとunsafe祭りになってしまいそうなんだがwinapiの仕様でFAなんかな
434418
垢版 |
2019/01/24(木) 23:36:09.43ID:mR/sBWjl
ttps://docs.rs/winapi/0.3.6/winapi/um/minwinbase/struct.OVERLAPPED_u.html
これってどうやって初期化すればいいんだろ?
ReadFile/WriteFileでOVERLAPPEDを使いたいんだが
2019/01/25(金) 01:30:10.23ID:7aXnDiIo
よく知らんけどOVERLAPPEDをmem::zeroedで初期化して引っ張ってくるんじゃないの
436418
垢版 |
2019/01/26(土) 00:18:28.40ID:ec8OMVht
>>435
ありがと。それでとりあえず出来た
2019/02/01(金) 02:53:50.28ID:bNyzNXhv
TryFrom/TryInto がもうすぐか
438デフォルトの名無しさん
垢版 |
2019/02/05(火) 00:11:17.23ID:2NDs+2LZ
型のパターンマッチってメンテナンス性が悪かったりする?
2019/02/05(火) 00:26:16.28ID:pEuhZWls
ML系の関数型言語の経験があるなら全く問題ない
経験ないならHaskell/OCaml/F#あたりのうち最低一つは触れてみることを強くお勧めする
2019/02/05(火) 00:39:59.41ID:XXfCgR8v
どれ?
441440
垢版 |
2019/02/05(火) 00:41:00.53ID:XXfCgR8v
>>438
2019/02/05(火) 00:42:22.65ID:UXw61YxU
やっぱRustに限らず新しめの言語できる人って英語もスラスラ読み書きできるもんなの
読むのは時間かければ何とかなるけど書けないから質問する場所が限られる
2019/02/05(火) 00:48:10.95ID:28bd5R1v
パターンマッチは型で分岐するというより型に当てはめるという感覚の方が近い
OO言語でマサカリ投げられるような型で分岐するというのとは似て非なるものなんだが、
そのへんの微妙な感覚を掴んでからでないと糞コードの温床になりそう
444デフォルトの名無しさん
垢版 |
2019/02/05(火) 05:25:42.44ID:xTPbFJiK
>>442
slackで聞くといい
2019/02/07(木) 12:31:53.09ID:nkNDSe3E
何かのIDEで
(0..10).
の補完が効くようになったら教えて
2019/02/07(木) 23:00:54.15ID:+NlXQGa+
RangeはIteratorを直接実装するからcurrent scopeにIteratorがuseされてない状態でIteratorのメソッド解析出来ないと無理だろうね。
useされてないトレイトのメソッド使ったら自動でuseする機能のほうが先。
2019/02/08(金) 00:09:20.59ID:EX3qDOo1
良記事

Learning Rust via Advent of Code
https://www.forrestthewoods.com/blog/learning-rust-via-advent-of-code/
448デフォルトの名無しさん
垢版 |
2019/02/09(土) 15:36:54.38ID:6/bHpQ6m
トイレット
2019/02/09(土) 16:27:38.54ID:6Levbbby
https://volt.ws/lang
https://volt.ws/game
V言語とかいうやつ、GUIアプリとか3Dゲームとかを開発するために作られたらしいけど、GCがないとか1500万行のコードを1秒でコンパイル出来るとかバイナリサイズが極小とかC/C++とのやりとりが簡単とか
これが本当だったらRust負けちゃうんでは
実際Rustで低レイヤーやってる人少ないだろうし
2019/02/09(土) 16:31:54.37ID:meE2rnNy
詳細知らんけど低レイヤーに適した言語が出てくること自体は歓迎できるんじゃないの
2019/02/09(土) 16:35:04.90ID:k8PbCSOR
言語は言語の良さだけでは流行らないんだよ
RustもGoもまあまあ悪くない言語である上で十分なステマを行ったから流行った
2019/02/09(土) 17:19:45.83ID:XHVbx6Kw
それ使ったアプリがよほど良くて、開発者をうまく集められて、コミュニティが育たなければ無理だろうな
ソース非公開のうちは勝負にもならん
2019/02/09(土) 17:48:14.48ID:F2V9krnu
幾ら優れていようと後ろ盾がなきゃD言語の二の舞だろ
2019/02/09(土) 17:55:50.24ID:Sm9Jadj9
コンパイルが速いならジェネリクスも無いんじゃないかね。安全性については対nullしか無いっぽいし
2019/02/09(土) 19:21:01.69ID:6Levbbby
OCamlとかジェネリクスあるけどgoよりコンパイル速いよ
っていうか21世紀のOCamlが欲しかった(OCamlはそんなに古い言語ではないけど)
2019/02/09(土) 21:38:40.47ID:ifttyEGf
Rustほど丁寧なエラーメッセージ出してくれる言語もないでしょ
そういうのを捨てて速度を取った言語とは比べられない
2019/02/09(土) 21:42:08.79ID:7AbylfKm
> Rustほど丁寧なエラーメッセージ

冗談だよな? って思ったけど最近のは丁寧なのかな
2019/02/09(土) 22:39:24.66ID:+053I9at
全然だぞ。
2019/02/09(土) 22:57:48.30ID:zYIj7/GJ
Vってvoltのことか。あれgoに毛が生えた程度の言語よ。

>>457
今のはコマンドプロンプトのバッファが足らなくなるくらい丁寧だけど
答えそのものを教えてくるから書いたコードがだめな理由が初学者に理解できないのは変わらないと思う。
2019/02/10(日) 01:50:55.52ID:z2TxZpHI
>>449
どうググるとそれ出てくるの?
「volt プログラミング言語」でググって出てくるのこれなんだけど

Volt Programming Language ・ GitHub
https://github.com/VoltLang
http://www.volt-lang.org/
2019/02/10(日) 02:45:34.58ID:rzMRhZmV
大体はGoとかと一緒で言語名+langで検索するのがいいんじゃない?

四文字もあって他の情報が上に来るのも珍しいが
2019/02/10(日) 23:16:47.25ID:Unf9n64i
googleで言語名+langで検索するとgoを検索結果にねじ込んでくるから-go必須
2019/02/11(月) 13:29:57.41ID:/IKdpkbc
rustでググってrustってゲームがトップに来なくなったのはグーグルさんが僕の検索履歴から判定しているだけ
464デフォルトの名無しさん
垢版 |
2019/02/11(月) 14:57:29.32ID:cihDmqOc
https://trends.google.co.jp/trends/explore?geo=JP&;q=%2Fm%2F0zm_2_r,%2Fm%2F0dsbpg6
https://i.imgur.com/7uP3Dl5.png
2019/02/11(月) 16:58:29.92ID:icbaaHgE
Rust初心者です。
リスト構造を使ったスタックの実装で躓いてます。
なぜ間違っているのか教えてください
https://gist.github.com/rust-play/e54d15602fa8a1d8f7a17521f85d1133
2019/02/11(月) 18:46:05.84ID:T+XDi7pv
>>465
http://cglab.ca/~abeinges/blah/too-many-lists/book/first-push.html
かいつまんで言うと、&mutなオブジェクトが一瞬でもinvalidな状態になるから。
mem::replaceを使うと、self.listの値を取り出して代わりに別の値を置く、という処理が一度に行える
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=8d12416b3f7bc4aa44bf360df11de1be
2019/02/11(月) 21:46:27.46ID:icbaaHgE
>>466
ありがとうございます。
変更可能な"参照"で持ってきたもの(&mut self)から所有権をムーブさせることはできないという解釈で大丈夫ですかね。

置き換えるときはmem::replaceを使うようにします。
2019/02/11(月) 23:01:54.99ID:9ECrAI8Q
クソコード教えるんじゃねぇ。Optionの中身をNoneと入れ替えるならOption::take使え
2019/02/11(月) 23:36:00.41ID:T+XDi7pv
アアン?Option::takeのソース見ての物言いだろうなあテメェ
2019/02/13(水) 00:06:54.91ID:VVnL6iyQ
中身見たのならなおのことOption::take使うべきでは
2019/02/14(木) 19:10:47.01ID:25E3pTeL
>>455
OCamlは、文字コードの扱いとWindows環境の扱いが
もう少し良くなってくれると嬉しいな。
2019/02/18(月) 21:15:10.76ID:0Vx/m/dz
インデントのスペース幅は2が良かったなぁ
clang-formatもprettierも2がデフォだし
C#でさえ2を結構見かけるようになってきた
rustに強く影響を与えたであろうocamlもhaskellも2が多い
世界的に2が標準になりつつある気がする
473デフォルトの名無しさん
垢版 |
2019/02/18(月) 21:29:43.93ID:trvxFZJG
漢なら8
2019/02/18(月) 21:30:52.44ID:etvvcICH
Pythonをインデント2で書く奴だけはマジで死ね
あれはガチで読めない
他の言語なら好きにしろ
2019/02/18(月) 21:33:40.63ID:TCe7B/Jv
インデントはTABキー派だな
2019/02/18(月) 21:43:29.91ID:G3oZ5oVt
ocamlからリスト引き継いでくれたらよかったのになあ
しかしそうするならもはやocamlそのものでいいってことになりかねないかな
2019/02/18(月) 22:43:31.80ID:7ubWqY/W
>>474
それだとgoogle連中には全員死んでもらわんとならんな。
2019/02/18(月) 23:22:04.58ID:H1db3n/w
noto sansにindent 3をわかってくれるのはねねっちだけか。
今は源真ゴシック等幅+Source Code Proだけど。
Source Han Codeはちょっと違うんだよ。
2019/02/18(月) 23:32:13.04ID:MF1SsBZy
Cica派です
2019/02/19(火) 02:33:20.94ID:ztl4bw1Y
googleのstyleguideではスペース幅4を推奨してるのにgithubのgoogleのpythonレポジトリはスペース幅2が多いな
pythonはpep8を重視してるイメージがあるけど堂々と無視出来るのは凄い

rustもrustfmt.tomlでtab_spaces = 2を設定してる人が結構いるわ
https://github.com/search?l=TOML&;q=tab_spaces&type=Code
3にしてる人さえいる
481デフォルトの名無しさん
垢版 |
2019/02/19(火) 09:43:14.31ID:+VeRQQni
ちんこことゴッドエイムあきらを探しに来ました。
482デフォルトの名無しさん
垢版 |
2019/02/19(火) 12:32:05.79ID:1Fqwt8so
なんでtab2だとみにくいんだ?
2019/02/19(火) 13:27:47.37ID:D8b3v+Fo
インデントで制御構造を表現する言語だと、深いネストから戻るときにどのレベルに戻ったのか識別できなくなる
2019/02/19(火) 20:11:35.55ID:8ne5Wfny
タブ2で見ずらくなるようなネストの深さと関数の長さになるのが悪いと
言いたいところだがgoogleのオフィシャルコードは結構ど汚くて上の条件を無視してる。
個人的には3が視認性の上では一番良いと思ってはいるが、流石に2,4と互いに素な数だと
プログラム的になんか嫌なこと起きそうで自分では使ってないな。
2019/02/19(火) 21:05:35.97ID:xEsYUfd7
タブ幅小さくして、その分変数名を分かりやすく長くするんだよ
2019/02/19(火) 23:16:38.92ID:8Y/JNp+N
>タブ2で見ずらくなるようなネストの深さと関数の長さになるのが悪いと
2派と4派の対立は4が深すぎるか、2が浅すぎるかなのに「2で見ずらくなる深さ」って想定おかしくね?
3派は間とって3だよ。こっちは普及してないのが問題。
2019/02/19(火) 23:29:48.61ID:5Qp7yTUV
Scalaみたくスタイルガイド作っちゃえばいいのに
そうすれば「スタイルは公式に従うように」の一言で済む
2019/02/19(火) 23:31:07.48ID:DbU8mxgP
ハードタブなら各自好きな幅にすればいいから揉めないのにね。
2019/02/19(火) 23:44:16.88ID:/QLumg1k
回りの多数派にあわせるだけの話
こういうのにこだわるやつは大抵バカ
可読性w
490デフォルトの名無しさん
垢版 |
2019/02/20(水) 00:10:42.00ID:PUv5Mo1S
なんてここでタブ・スペース論争してんだ
どうせ一人でしか書かねえくせによ〜
2019/02/20(水) 00:20:53.21ID:tgLGxeUk
インデントってrustfmtの話?
2019/02/20(水) 09:53:44.02ID:+ywZrRmq
>>489
ほんこれ
見やすさとか人によって違うしどうでもいい
493デフォルトの名無しさん
垢版 |
2019/02/20(水) 15:04:45.66ID:NsAPC4E4
エディタファシストなのでエディタを開発したことないやつは駆除されるべきなのではと考え始めて来た。やばい
494デフォルトの名無しさん
垢版 |
2019/02/20(水) 15:58:40.55ID:agArr1lp
昔々学生の頃に学校のワークステーション使ってXlibでドット編集してXPMファイルで出力するなんてものを作った覚えがある。
あらから29年。時の経つのは早いものぢゃ。
495デフォルトの名無しさん
垢版 |
2019/02/20(水) 19:43:00.89ID:v7iPz90J
29年前にRust使えたんだ
すごいな
496デフォルトの名無しさん
垢版 |
2019/02/20(水) 19:44:18.14ID:sr7oPl81
読み込んで表示するより出力の方がはるかに簡単だしな
2019/02/20(水) 19:52:10.09ID:P8vN2pc3
>>494
xlib ダイレクト記述、とは猛者ですね…
私も最近になって xlib をバシバシ触ろうと思っていますが、いい参考書はありませんか?
2019/02/21(木) 11:19:20.33ID:TingKcVp
XlibってCの悪いところを煮詰めたような設計だったな
Rustとの相性は最悪だろう
2019/02/21(木) 13:00:40.17ID:1Gw0PDsD
日本語の参考書はX11R5の大昔に出た本ぐらいじゃないかな
500デフォルトの名無しさん
垢版 |
2019/02/22(金) 15:32:44.85ID:bcwEHSMY
うん。新しいXlibの本は知らないなあ。
探す気も起きないから知らないだけかも知れないが。
501デフォルトの名無しさん
垢版 |
2019/02/22(金) 15:35:39.38ID:bcwEHSMY
>>498
なんというか、オブジェクトを作って操作するような感じなので今時の言語用のオブジェクト指向に合わせたラッパーは作れると思うが、需要はほとんどないような気がする。
2019/02/22(金) 16:19:45.55ID:aMjiHo6w
xlibの使いやすいラッパーとしてはgtk+などなどがあるんわけで…
503デフォルトの名無しさん
垢版 |
2019/02/22(金) 17:04:13.83ID:PtH+29Wq
GTKはクソ
2019/02/23(土) 05:53:32.47ID:jUbY9V9a
ちゃんとgtk-rsあるやん
2019/02/23(土) 22:01:15.49ID:0ZfqWIIS
>>465です
スタックにpopを実装しました
pop自体はうまく動いているようですが…
popした時の対象の物がどのタイミングで破棄されているのかを調べようと思いstd::ops::Dropを実装しようとしましたがうまくいきません。
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=f1a2a2a35c3dc424f3814557afa5974c
何がいけないのでしょう
2019/02/24(日) 15:19:37.98ID:Vg8zIes/
haskellでの、文字列[Char]を切り貼りみたいな事をするには、
Vec<char>を操作するので合っているのかな?
2019/02/26(火) 12:11:01.89ID:gUDVcbaI
>>487
>>480
2019/02/27(水) 21:22:09.87ID:DI6YZOkq
クローン技術で乗り切った
2019/03/02(土) 01:38:04.42ID:TjOpVvei
>>505 Dropを実装した型の値がdropされるとき、フィールドは全てvalidじゃないといけない。
そのままメモリ解放するだけ=Drop未実装ならいいんだけど、drop中にinvalidなフィールドにアクセスできちゃうのがダメだというのが問題
解決案は、ここでもOption::takeかmem::replaceでNoneにすげ替える

けど、まずはLearning Rust With Entirely Too Many Linked Listsを写経してみた方が良いよ
今のListの定義だと無駄なメモリを食うし、パターンマッチとstructは相性があんま良くないし、これから先も似たような穴にハマると思われる
2019/03/02(土) 15:28:49.59ID:jUIKeWUS
Rustいいらしいですよって話を会社でしたら、
テックリードが「RustでできることはCやC++でもテストとツールで十分やってけるからイラネ」って言ってたけどマ?
2019/03/02(土) 15:50:22.82ID:s27Iehbv
&str で関数に渡すと解放されてしまって使い回すこどができないのですが
使い回す方法ありませんか
2019/03/02(土) 15:52:40.18ID:fWMJYJ6q
コーディングスタイルを徹底的に統制できるならマ
2019/03/02(土) 15:55:37.40ID:rXDVLiGa
>>510
コンピュータでできることは人の手と頭でできるよ
2019/03/02(土) 17:11:13.26ID:ACbQR/xi
>>512
じゃあうちにはたしかに要らんなあ
そんな統制がいるほどの人数でもないし

回答サンクス
2019/03/02(土) 17:40:27.42ID:NCWcHh/2
>>510
そのリードが C++でauto_ptrがdeprecatedになった理由とMove Semanticsと右辺値参照の関係をちゃんと説明できる人なら C++ でいい
2019/03/02(土) 18:53:06.97ID:aD19gS0i
人間が信用できないからこそCよりRustだろ
気を付けてコーディングすればミスはなくなる、ってのは戦前の日本軍的な精神論だ
コンパイラ先生に怒られながら厳しい指導の下にやっとコンパイルしていただくのがRust

この記事とか参考になるかも
https://tomo-wait-for-it-yuki.hatenablog.com/entry/2019/02/05/210746
2019/03/02(土) 19:04:12.47ID:sRR7A1mE
プログラミングは製造業だからな
厳格なチェックは本来あって当然
518デフォルトの名無しさん
垢版 |
2019/03/02(土) 19:10:02.40ID:Zilw84iH
>>511
&str is 何?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況