- 1 名前:デフォルトの名無しさん [2012/01/25(水) 20:05:49.96 .net]
- Mozillaがリリースした、プログラミング言語「Rust」について語るスレです。
www.rust-lang.org/
- 237 名前:デフォルトの名無しさん mailto:sage [2015/04/01(水) 20:39:05.61 ID:cmpu1vG2.net]
- ちょっと見ないでいると新しい構文ができてたり、前の構文が禁止になったりと変遷がまだ激しい
関数定義にも型推論が効くようになったらありがたいんだけど、lifetimeパラメータがあるから当分は無理だろうな
- 238 名前:デフォルトの名無しさん [2015/04/04(土) 10:44:07.36 ID:3u9gfu59.net]
- ttp://blog.rust-lang.org/2015/04/03/Rust-1.0-beta.html
ベータきた
- 239 名前:デフォルトの名無しさん mailto:sage [2015/04/04(土) 17:25:52.34 ID:tHhrzAt2.net]
- これで他所様のcrateがコンパイルできないって事態が減るのか。ありがたや。
- 240 名前:デフォルトの名無しさん mailto:sage [2015/04/06(月) 02:32:19.13 ID:h+YQESxX.net]
- std::fsのPathExt使いたいんだけどどうすりゃいいの?
#![feature(PathExt)]追加してけど今度はこれに対して文句言われるし
- 241 名前:デフォルトの名無しさん mailto:sage [2015/04/06(月) 07:54:14.20 ID:TRGNibS3.net]
- >>240
使ってるrustはbetaとnightlyのどっち? unstableな機能はbetaじゃ使えないから、nightlyを使う必要がある
- 242 名前:デフォルトの名無しさん mailto:sage [2015/04/06(月) 09:14:39.34 ID:SQyZe7Rp.net]
- >>240
#![feature(path_ext)]としたら動かない?あと1.0.0-betaじゃなくてnightly buildだったらunstableがエラーにならない、はず。
- 243 名前:デフォルトの名無しさん mailto:sage [2015/04/07(火) 17:58:26.92 ID:sYJ921on.net]
- nightly buildにして#![feature(path_ext)]にしたら動きました
- 244 名前:デフォルトの名無しさん [2015/04/19(日) 19:52:26.06 ID:KK4Vp0dw.net]
- rust-lang.orgのトップにあるコード、あれでRustに魅力を感じることはないよね……
- 245 名前:デフォルトの名無しさん mailto:sage [2015/04/19(日) 22:55:50.22 ID:Pae6mGZb.net]
- どんなコードなら魅力を感じる?
- 246 名前:デフォルトの名無しさん mailto:sage [2015/04/20(月) 20:41:29.82 ID:SBrGan7W.net]
- パターンマッチはRustくらい低レベルな分野では珍しいから悪くはない。
だけど色くらい付けた方がいいのは確か。
- 247 名前:デフォルトの名無しさん [2015/04/21(火) 12:34:26.69 ID:DovQc0Av.net]
- その程度の輩を入口でフィルタアウトできてちょうどいい
- 248 名前:デフォルトの名無しさん mailto:sage [2015/04/21(火) 20:58:23.87 ID:8SfamI7q.net]
- 完成度高いけど読みづらい
色々詰め込みましたって感じであまりセンスを感じないかな
- 249 名前:デフォルトの名無しさん mailto:sage [2015/04/21(火) 21:13:43.96 ID:t5rHangx.net]
- syntaxにケチつけてセンスとか言ってるのも片腹ポンポンペイン感がある
見た目はC言語ユーザーに合わせてsemanticsは全然違ようにしてあるのに
- 250 名前:デフォルトの名無しさん mailto:sage [2015/04/21(火) 22:17:14.88 ID:p6Hmsc0c.net]
- 構文のC言語風な部分に文句を言ってる訳じゃなさそうだが……
- 251 名前:デフォルトの名無しさん [2015/04/21(火) 22:35:19.48 ID:wBLqiLA1.net]
- 実際、読みづらいし書きづらいだろ。
関数型の感覚で書こうとするといたるところで引っかかる。 直和型に対するenumっていう命名のセンスも シンタクスの話だが、無視できない筋の悪さを感じる。
- 252 名前:デフォルトの名無しさん mailto:sage [2015/04/22(水) 00:19:44.26 ID:G0rTsYMJ.net]
- Mozilla自体、将来性怪しい
- 253 名前:デフォルトの名無しさん mailto:sage [2015/04/22(水) 01:52:28.56 ID:8x+/Tpq3.net]
- GNUもそうだけどだいたいのユーザーは結局利便性>>>思想だから
その思想に属するソフトが最も良い時はその理念を支持してくれるけど そうじゃなくなったら...ねえ
- 254 名前:デフォルトの名無しさん mailto:sage [2015/04/22(水) 03:13:38.70 ID:Itj79n5U.net]
- 泥臭いレベルで考えれば直和型はenumでいいと思う。
以前は、例えばOption型のand_thenとかor_elseがクロージャを取らなかったから繋げるのが面倒だったけど、 今はそうでもないよ。 ただ、プロトタイピングとか手探りでモックアップ的なものを書きながら試すのは相変わらずしんどい。 慣れたら型エラーlifetimeエラー出さずにガリガリ書けるのかもしれんが、「誰が資源の所有者であるか」を意識し続けるのはまだ難しい
- 255 名前:デフォルトの名無しさん mailto:sage [2015/04/23(木) 23:36:44.51 ID:wT/D2HMU.net]
- javaのenumも定数クラスをフィールドと見なせば直和型だがセンス悪いですか・・・。
定義もEnum<E extends Enum<E>>だし クラス使ったオブジェクト指向っぽくやるとそうなるんじゃないかな。
- 256 名前:デフォルトの名無しさん [2015/04/24(金) 12:44:05.34 ID:/IU9j/kd.net]
- enumは直和型の特殊事例として表現できるが、
逆に直和型をenumの拡張とみなしているうちは面白い使い方はできないだろ。
- 257 名前:デフォルトの名無しさん mailto:sage [2015/04/24(金) 22:34:58.83 ID:w/TzYGT8.net]
- 特殊事例じゃなくて表現方法の1つじゃないの?
例えばhaskellの直和型で可能でenumじゃ無理なことって何がある? 面白い使い方って色々とサポートが必要でしょ?特にメモリ周りで。 例えばリストだったらenum List<T> { Nil, Cons(T, Box<List<T>>)}って面倒だったり、 コンストラクタを関数として扱おうとするなら部分評価時のクロージャを誰が保持するのか利用者が注意しなくちゃならない。 そういう細々としたことをGCや遅延評価で隠せない、隠さないのがいいところでもあるんだから。 オーバーヘッド無しにもっと便利にできるよ!っていうなら取り入れられるよ多分。 低レベルな分野で型推論とか自動メモリ管理とか入れようとしたらどうなるの?っていう実験やってるようなもんだし。
- 258 名前:デフォルトの名無しさん [2015/04/25(土) 09:17:20.05 ID:YZfn/g4I.net]
- ServoみたいなRustの大きいプロジェクトでは
ファントム型がよく使われてるが、これが普通に定着するといいな。 ただ、型はすぐ濫用されるからなあ。 Rustで型レベルプログラミングとか見たくないわ……
- 259 名前:デフォルトの名無しさん [2015/04/28(火) 14:45:42.12 ID:TsKA4yAm.net]
- Reenix: Implementing a Unix-Like Operating System in Rust
ttps://twitter.com/rustlang/status/592743898692321280 早速OS作ってる人いたか
- 260 名前:デフォルトの名無しさん mailto:sage [2015/04/28(火) 14:58:13.79 ID:nSrS/3uC.net]
- https://github.com/rust-lang/rust-wiki-backup/blob/master/Operating-system-development.md
Rust OS勢は前から結構いるのでどの程度のものなのか謎である
- 261 名前:デフォルトの名無しさん mailto:sage [2015/04/28(火) 16:10:37.53 ID:TsKA4yAm.net]
- ほんとだ、いろいろいるわ
でもちょっとブートしてみた、とか何とかutils作ってみた系が多くて ガチOS始めた人は少数なのか
- 262 名前:デフォルトの名無しさん [2015/05/05(火) 13:51:43.12 ID:k0XsKdeW.net]
- パーティ行きたいけど遠いな(´・ω・`)
ttp://www.eventbrite.com/e/copenhagen-rust-launch-party-tickets-16663376608 やっと1.0、そろそろ本気出す人多そう
- 263 名前:デフォルトの名無しさん mailto:sage [2015/05/06(水) 06:07:02.36 ID:mzucxP2W.net]
- 日本でもあるよ。枠埋まっちゃったけど
ttp://rust-samurai.connpass.com/event/14649/
- 264 名前:デフォルトの名無しさん mailto:sage [2015/05/06(水) 09:17:16.43 ID:JOkpKlyr.net]
- 自分の使っているディストリはソースからビルドされたrust(1.0.0-beta.3)を使っているため、cargoは入っていない。
で、cargoがnightly(1.1.0系列)に追随している&他のパッケージもnightly追従になっているおかげでcargoのビルドがCargo.tomlを編集しないと通らない。 travis CIに通っているパッケージもnightly準拠。ええい、安定と言うにはまだ色々あるぞ。
- 265 名前:デフォルトの名無しさん [2015/05/06(水) 10:01:59.45 ID:cmDHtTLB.net]
- rust開発チームは何かと前のめりな人が多いのかな
- 266 名前:デフォルトの名無しさん mailto:sage [2015/05/06(水) 11:33:10.40 ID:2ABYi4qj.net]
- 前のめりな人ってどないやねん
- 267 名前:デフォルトの名無しさん mailto:sage [2015/05/06(水) 13:55:18.13 ID:xpDcmA5j.net]
- いろいろあるけどとりあえず1.0にして酒盛りだw
直す所はまだあるとしても、仕様が固まってくれると学ぶ気になれるのでありがたい、けど
- 268 名前:デフォルトの名無しさん mailto:sage [2015/05/06(水) 16:17:50.78 ID:am6Qsc64.net]
- cargo使うにはnightly build使えって事?
- 269 名前:デフォルトの名無しさん mailto:sage [2015/05/06(水) 22:51:00.49 ID:JOkpKlyr.net]
- >>268いや、公式サイトからバイナリ落として使うなら1.0.0-beta.3にcargoが入っているので大丈夫。
自分のLinuxディストリがソースからビルドしたものを提供していたり、自前でrustをビルドしている人は自分でcargoをビルドする必要がある。 で、自分でbeta用のcargoをビルドするのが面倒だねって話。 crate.ioのgetting startedは相変わらずnightlyを推奨しているのは温度差を感じる。 Cargo.tomlにコンパイラのバージョンあるいはstdのバージョンを示すダミーcrateを登録できたらいいのか?
- 270 名前:デフォルトの名無しさん mailto:sage [2015/05/07(木) 00:38:18.86 ID:aZRIIXEP.net]
- >>264
travisはbetaチャンネルのコンパイラとcargo使うオプションあるよ。 フォーラムにやり方の投稿があったはず
- 271 名前:デフォルトの名無しさん mailto:sage [2015/05/07(木) 13:27:05.75 ID:23tsmTPn.net]
- >>263
日本人のcontributorって結構いるの?
- 272 名前:デフォルトの名無しさん mailto:sage [2015/05/07(木) 17:33:22.03 ID:aZRIIXEP.net]
- >>271
GitHubでの開発だからいわゆるcontributorとはずれちゃうんだけど、 PullRequest出してマージされてる日本人は何人か見たことある 今回の主催の人はservoリポジトリへのコミット権持ってて結構活躍している
- 273 名前:デフォルトの名無しさん mailto:sage [2015/05/07(木) 18:24:03.66 ID:ADm0d2/c.net]
- On Lisp 和訳の人の名前を見た気がする
- 274 名前:デフォルトの名無しさん mailto:sage [2015/05/11(月) 03:01:17.51 ID:bJJob3eC.net]
- BetaのドキュメントにComing Soonが多いんだが、Nightly見た方が良いの?
- 275 名前:デフォルトの名無しさん [2015/05/12(火) 01:10:22.42 ID:xKmS5U3V.net]
- どうせ動かないんでしょ
- 276 名前:デフォルトの名無しさん mailto:sage [2015/05/14(木) 00:16:14.10 ID:K0fBW8ZW.net]
- 'The Rust Programming Language' as EBook
ttps://github.com/killercup/trpl-ebook
- 277 名前:デフォルトの名無しさん mailto:sage [2015/05/14(木) 06:37:57.45 ID:HvPUnCOb.net]
- >>263
元日立社員が転職して後悔してさらに転職を計画 yomogi.2ch.net/test/read.cgi/net/1429876526/
- 278 名前:デフォルトの名無しさん mailto:sage [2015/05/16(土) 00:11:55.14 ID:3gBP+Qn+.net]
- Programming Rust Paperback – November 25, 2015
ttp://www.amazon.com/Programming-Rust-Jim-Blandy/dp/1491927283/ ISBN-13: 978-1491927281 ISBN-10: 1491927283
- 279 名前:デフォルトの名無しさん [2015/05/16(土) 02:23:52.03 ID:3gBP+Qn+.net]
- Announcing Rust 1.0
ttp://blog.rust-lang.org/2015/05/15/Rust-1.0.html Today we are very proud to announce the 1.0 release of Rust, ...
- 280 名前:デフォルトの名無しさん mailto:sage [2015/05/16(土) 02:43:58.46 ID:7PFiMYNq.net]
- 正真正銘バージョン1.0リリース! おめでとう。
- 281 名前:デフォルトの名無しさん mailto:sage [2015/05/18(月) 01:33:56.23 ID:sVRosqPI.net]
- sage
- 282 名前:デフォルトの名無しさん mailto:sage [2015/05/18(月) 13:05:27.84 ID:I8sSWQip.net]
- let mut って…
気持ちは分かるが厳密過ぎだろ…
- 283 名前:デフォルトの名無しさん mailto:sage [2015/05/18(月) 14:22:47.25 ID:N0SAwEsK.net]
- 普通だと思うけど... 今までCしか使ったことないのか。
- 284 名前:デフォルトの名無しさん [2015/05/18(月) 14:33:14.59 ID:J+DllwNy.net]
- >>282
それならそもそもmutableな変数が無い方がいい、とな。 なるほど賛成だ。
- 285 名前:デフォルトの名無しさん mailto:sage [2015/05/18(月) 15:22:04.80 ID:I8sSWQip.net]
- >>283
普通は const immutable = 0; または let immut immutable = 0; let mutable = 0; だろ なぜ良く使う変数の方がタイプ数が多いんだよ…
- 286 名前:デフォルトの名無しさん mailto:sage [2015/05/18(月) 15:44:06.55 ID:N0SAwEsK.net]
- >>285
mutableな変数の出番が多いのはあなたの書き方の癖であって、他の全員に当てはまるわけでは無いと思う。 特にRustはifやmatch等が値を返すからmutableと相性が良いと思うけど。
- 287 名前:デフォルトの名無しさん mailto:sage [2015/05/18(月) 15:45:07.29 ID:N0SAwEsK.net]
- >>286
修正: immutableと相性が良い
- 288 名前:デフォルトの名無しさん [2015/05/18(月) 16:26:46.46 ID:J+DllwNy.net]
- >>285
>なぜ良く使う変数の方がタイプ数が多いんだよ… immutableな変数の方をよく使わないのだとしたら、 そもそもRustでのプログラミングには向いてないな。 基本的には破壊的更新をしない関数型スタイルで書かせて、 それをコンパイラが巧く処理してゼロコストにする、 というのがRustの設計思想なんで。 いい機会だから、変数の再代入を一切使わずにコード書いてみるといい。
- 289 名前:デフォルトの名無しさん mailto:sage [2015/05/18(月) 17:11:40.54 ID:hULj5jYE.net]
- つまりC++でconst書きまくるのに疲れてる俺向きということですな!
- 290 名前:デフォルトの名無しさん mailto:sage [2015/05/18(月) 22:19:14.44 ID:eEjXu/P7.net]
- 関数型言語を触ってみるとリフレッシュできるよ。OCamlが緩くてお勧め。
RustはセルフコンパイルできるまでOCamlで開発されてた位にはメジャーで実用的。 パターンマッチや型推論、その他色々なRustの機能は関数型言語由来のものがあるから触ってみて損は無い。 「低レベルな領域に関数型言語の便利なエッセンスを(ゼロコストで)どれだけ入れられるか、入れたらどれだけ楽になるか」 みたいな発送がRustから感じられる。 もっとMLライクな文法でも良かったと思うけどね。
- 291 名前:デフォルトの名無しさん [2015/05/18(月) 23:34:48.44 ID:J+DllwNy.net]
- >>290
>もっとMLライクな文法でも良かったと思うけどね。 せめて型宣言はムリにC系のものにして関数定義の頭に押し込めずに 別立てにしたほうが良かったと思うんだよなあ。 とはいえ、確かにML系つうかOCamlの匂いは強くするよね。
- 292 名前:デフォルトの名無しさん mailto:sage [2015/05/19(火) 15:09:00.81 ID:UYmTOlX3.net]
- >>285
まあそのまま仕様を受け取って、immutな方を自然に使って欲しいんだろう。 命令型言語に関数型の風味を取り込んでみたってことで。 ocamlの方は逆な風味だが命令型取り込んだ無理やり感がする。 rustも一実験言語で終わるのか、伸びるのか
- 293 名前:デフォルトの名無しさん mailto:sage [2015/05/19(火) 21:19:02.97 ID:AGcxeKzS.net]
- 前はマニアのための実験的言語って書いてあったのに今では1.0だなんて感動する
- 294 名前:デフォルトの名無しさん [2015/05/21(木) 00:03:14.73 ID:R841WaTJ.net]
- 今更セミコロンがある謎言語
- 295 名前:デフォルトの名無しさん mailto:sage [2015/05/21(木) 02:10:17.69 ID:gi6AaWSD.net]
- val foo : i32 -> i32とかできると便利よな。前方宣言は一応できるけどCスタイルだから冗長だし、
定義時に同じこと書かないといけないから面倒。 まあ、ML寄りの文法で変数の宣言とか並べるのも汚いかもしれんし、 関数型に近寄るとその分デバッグが難しくなる。誰かがML系rustを作ったら今の文法の良さが見えてくるかもね。
- 296 名前:デフォルトの名無しさん mailto:sage [2015/05/21(木) 11:04:47.93 ID:HQdruXcL.net]
- 正式版でたんで久々に入れてみたら
単純計算ものでも2倍くらい速くなってるな node.jsと同じくらいにはなった
- 297 名前:デフォルトの名無しさん mailto:sage [2015/05/29(金) 01:21:31.51 ID:CYHwmvYd.net]
- The evolution of Rust
lambda-the-ultimate.org/node/5169
- 298 名前:デフォルトの名無しさん mailto:sage [2015/05/30(土) 07:05:58.43 ID:AYzItcLB.net]
- >>296
単純計算だけならC++と同じぐらいだろ 所詮LLVMのフロントエンドなんだし
- 299 名前:デフォルトの名無しさん mailto:sage [2015/05/30(土) 10:56:09.40 ID:qPmgq1NQ.net]
- 言語はけっこう好みだけど仕事はC++だし
趣味用にはもうひと押し欲しい気がする
- 300 名前:デフォルトの名無しさん mailto:sage [2015/05/31(日) 07:07:23.95 ID:QzJY7rQQ.net]
- Rust って let (a,b) = (1,2); は出来ても、
let a = 1, b = 2; は出来ないのか。 何故? 別に何かの文法と衝突でもするのか?
- 301 名前:デフォルトの名無しさん mailto:sage [2015/05/31(日) 09:03:35.54 ID:chRy4RzH.net]
- >>300
let mut a =1, b=2; としたときにbがmutableになるのかならないのか曖昧に見えるから、という理由だった記憶がある とにかく、なにかしら理由があったはずだよ
- 302 名前:デフォルトの名無しさん mailto:sage [2015/05/31(日) 09:58:57.84 ID:QzJY7rQQ.net]
- なるほど。でも、なら let mut を var にして欲しいな。
mutable 変数は var で宣言する方が好みだ。 でググったら当然過去に let mut <-> var 議論あった。 ざっと読んだら、Rust の精神には immutable が根本にあって、 mut は気安く使うんじゃねーよ、的な障壁としての let mut みたいだ。 確かに var だと気安く使っちゃうからね。ってこれスレのすぐ上で話題になってた話だな……
- 303 名前:デフォルトの名無しさん mailto:sage [2015/06/11(木) 07:46:19.89 ID:JhAQPJZl.net]
- mutable参照を共有できないって厳しすぎないか?
警告ならわかるがエラーは勘弁してほしい
- 304 名前:デフォルトの名無しさん mailto:sage [2015/06/11(木) 09:39:17.92 ID:tuFYxFU/.net]
- Rc<RefCell<T>>やArc<Mutex<T>>をどうぞ
- 305 名前:デフォルトの名無しさん mailto:sage [2015/06/11(木) 18:40:49.25 ID:JhAQPJZl.net]
- >>304
なるほどRefCellを使えばある程度は解決しそう ちょっと強引かもしれないけどこんな使い方も出来た // これはエラー(配列やスライスは同時に1つの要素しかmutable参照が作れない) let mut array = [ 0, 1 ]; std::mem::swap(&mut array[0], &mut array[1]); // これならOK let array = [ std::cell::RefCell::new(0), std::cell::RefCell::new(1) ]; std::mem::swap(&mut *array[0].borrow_mut(), &mut *array[1].borrow_mut());
- 306 名前:デフォルトの名無しさん mailto:sage [2015/06/11(木) 19:42:13.90 ID:rjZb8+Jq.net]
- 記述めんどいやろmut使うなという強烈なメッセージを感じるw
- 307 名前:デフォルトの名無しさん mailto:sage [2015/06/13(土) 11:23:17.39 ID:/rtQk4xD.net]
- >>305
試してないけど let array = Rc::new(RefCell::new([0, 1])); じゃだめかな?こっちのほうがまだましかなと思うんだけど
- 308 名前:デフォルトの名無しさん mailto:sage [2015/06/13(土) 22:39:23.60 ID:kJh3Un39.net]
- >>307
RefCellを使えば所有権を動的に貸し借りできるようになるってだけで mutable参照は同時に1つまでというルールは変わってない(2つめを取得しようとしたらpanic) >>305は配列の要素の所有権を取ると配列全体の所有権まで取ってしまうのが 要素毎にRefCellを使えば要素毎に所有権を取れるという話 それとRcは寿命を動的管理するためのものであって所有権とは無関係 ちなみにstd::mem::swapは引数が&mutだけどstd::ptr::swapなら*mutだから所有権を取らない 結局unsafe使うのがベスト let mut array = [0, 1]; unsafe { std::ptr::swap(&mut array[0], &mut array[1]); }
- 309 名前:デフォルトの名無しさん mailto:sage [2015/06/19(金) 11:24:27.05 ID:7YWFihrY.net]
- WebAssembly対応すればブラウザゲーをRustで作れるようになるんかな
- 310 名前:デフォルトの名無しさん mailto:sage [2015/06/26(金) 05:16:57.34 ID:MTQE4YuR.net]
- borrow checkerや型チェックで弾かれるのはまだいいんだけど、unsized typeで怒られるのが面倒。
AsRefとかDeRefとか、traitを多用し過ぎじゃないのか。traitに関する構文(多相型関数の定義とか)も冗長に思ってしまう。
- 311 名前:デフォルトの名無しさん mailto:sage [2015/06/26(金) 22:05:32.88 ID:4tQavpY6.net]
- 久しぶりに見たら1.1になってた
https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-110-june-2015
- 312 名前:デフォルトの名無しさん mailto:sage [2015/06/27(土) 01:28:47.33 ID:F+n2jvy1.net]
- rebuld.fm聞いて、rust触ってみたくて来ました。
今から手を出す場合、どこを見るところから始めればいいです?
- 313 名前:デフォルトの名無しさん mailto:sage [2015/06/27(土) 02:07:48.13 ID:fUkToYrK.net]
- >>312
Rust by Exampleとか? rustbyexample.com
- 314 名前:デフォルトの名無しさん mailto:sage [2015/06/27(土) 05:34:06.57 ID:F+n2jvy1.net]
- >>313
おお、良さ気です。ありがとうございす。 https://www.youtube.com/watch?v=i17doLVXlYU をみてたら、すごく、関数型言語ぽくていいっすね〜 俄然やる気でます。
- 315 名前:デフォルトの名無しさん [2015/06/27(土) 10:51:13.60 ID:nreZwDj/.net]
- 実際に書いてみると全然関数型言語っぽくないのだよなあ。
あと、なんかイディオマティクな標準的コーディングスタイルが 確立されないと辛いと思う。
- 316 名前:デフォルトの名無しさん mailto:sage [2015/06/27(土) 15:58:00.61 ID:rIdxbF5x.net]
- C++テンプレート以来のコンパイラに怒られまくる言語だ
- 317 名前:デフォルトの名無しさん mailto:sage [2015/06/27(土) 16:26:20.28 ID:wfeMnVHy.net]
- https://github.com/rust-lang/rust/issues/25899
これがなぜだか分からん。 fn main() { let a: &mut i32 = &mut 0; { let b = a; } let c = a; } 上が駄目で、下がおkな理由。 fn main() { let a: &mut i32 = &mut 0; { let b: &mut i32 = a; } let c = a; }
- 318 名前:デフォルトの名無しさん mailto:sage [2015/06/27(土) 17:22:32.78 ID:99+F8Q1T.net]
- >>317
下の例はこれと同じになるらしい fn main() { let a: &mut i32 = &mut 0; { let b = &mut *a; } let c = a; } Rustには型推論と暗黙の変換があるせいで分かりづらいね
- 319 名前:デフォルトの名無しさん mailto:sage [2015/06/27(土) 17:34:52.26 ID:wfeMnVHy.net]
- 上では move されるのに、下では borrow されるのか。
#![feature(core_intrinsics)] fn print_type_of<T>(_: &T) -> () { let type_name = unsafe { std::intrinsics::type_name::<T>() }; println!("{}", type_name); } これを入れて型を表示すると、上でも下でも b の型は同じ &'static mut i32 なのに、型注釈するだけで挙動が変わるのは違和感あるなあ。
- 320 名前:デフォルトの名無しさん mailto:sage [2015/06/27(土) 17:35:27.20 ID:wfeMnVHy.net]
- >>318
ありがとう。うーむ悩ましい。
- 321 名前:デフォルトの名無しさん mailto:sage [2015/06/27(土) 18:38:39.26 ID:SbfB1Jvt.net]
- >>310
unsized typeで起こられるのってどんな場合?
- 322 名前:デフォルトの名無しさん mailto:sage [2015/06/27(土) 18:40:12.36 ID:SbfB1Jvt.net]
- >>320
既出じゃなさそうならissue立ててみたら?
- 323 名前:デフォルトの名無しさん mailto:sage [2015/06/27(土) 20:45:16.24 ID:j6fAeiVj.net]
- >>321 いや、超基本的なミスなんだけど、 fn foo(it: Iterator<Item=i32>) { ... } とかすると怒られるの。
traitを引数にするなら、 fn foo<T: Iterator<Item=i32>> (it: T) { ... } みたいにしないといけない。 解決法は知ってるつもりなんだが、Sizedを実装していないからダメよ、と怒られるのは何故なのか未だに理解はしていない。
- 324 名前:デフォルトの名無しさん mailto:sage [2015/06/27(土) 23:20:55.81 ID:SbfB1Jvt.net]
- >>323
Trait型は実際にはそのTraitを実装した何かしらの型が実体になるんだけど、 関数引数とかローカル変数としてスタック上に配置するためには型自体のサイズがコンパイル時に分かってる必要があるから、 Trait型はポインタを経由するなどしないといけない T: Traitとかすると、Tで指定された型それぞれに応じて特殊化された関数が生成されるからコンパイル時に型が特定できてサイズもわかるから問題にならない
- 325 名前:デフォルトの名無しさん mailto:sage [2015/06/28(日) 03:45:02.95 ID:sui11WPz.net]
- やっぱりスタック上に配置が理由なのね。でもそれって人が配慮する必要があるのか?という部分に不満が残る。
コンパイラが自動的に多相型の関数とみなしたら不都合があるのかな。
- 326 名前:デフォルトの名無しさん mailto:sage [2015/06/28(日) 10:13:01.42 ID:6byfIPXR.net]
- foo: Traitを<T: Trait> fooのシンタックスシュガーとみなすのはありかもしれないけど、
スマートポインタ型なんかを定義する時とか本当にunsizedな型が必要なケースに困ってしまいそうな気がする。 自動で&Traitなどに変換してしまうのは、ヒープへのメモリ確保とか仮想関数呼び出しが必要で ゼロオーバーヘッドの原則に反してしまうからrustではやらないと思う。
- 327 名前:デフォルトの名無しさん mailto:sage [2015/06/28(日) 17:45:54.19 ID:l0DVu4po.net]
- ?Sizedが必要な場合もあるし面倒だよね
- 328 名前:デフォルトの名無しさん mailto:sage [2015/06/28(日) 19:16:48.49 ID:l0DVu4po.net]
- トレイトは別のトレイトを継承できるけど
継承しててもトレイトからトレイトにはアップキャスト出来ないっぽい これじゃあオブジェクト指向のような多態性を活かした設計は難しいね
- 329 名前:デフォルトの名無しさん [2015/06/29(月) 09:33:30.50 ID:8+Jbzv8W.net]
- 単なる型クラスになに要求してんのかと。
Rustがオブジェクト指向でないのは結構なことだ。
- 330 名前:デフォルトの名無しさん mailto:sage [2015/06/29(月) 17:09:32.97 ID:9FsJz544.net]
- trait FooExt : Foo { .. } ってのは、単にFooExtを実装する型はFooも実装しなければならない、という意味しかない。
FooトレイトをimplするだけでFooExtトレイトも使えるようにしたい、という目的なら、 impl<F: Foo> FooExt for F { ... } とすると良い。 struct STFoo; impl Foo for STFoo { ... } とかすると、STFooはFooExtのメソッドも呼び出せる。 FooとFooExtに同じ名前のメソッドdo_foo(&self)があったときは、呼び出し側でFoo::do_foo(&foo)とかしないといけない。 OOPでアップキャストが必要な場面ってあったっけ?
- 331 名前:デフォルトの名無しさん mailto:sage [2015/06/30(火) 22:00:52.85 ID:5IIg4rdj.net]
- 暗黙のアップキャストてOOPの基本の一つじゃね?
- 332 名前:デフォルトの名無しさん mailto:sage [2015/06/30(火) 22:32:05.66 ID:uCmnNLIn.net]
- どの言語のOOPかにもよるのでは。知らんけど。
- 333 名前:デフォルトの名無しさん mailto:sage [2015/06/30(火) 22:34:50.83 ID:OotDes5f.net]
- Rustって強力なトレイトという名の型クラスを導入することでOOP(のRustにとって必要な部分)が(綺麗に)できるというだけで、別にOOPするための言語では無いと思う。
ちなみにアップキャストってこれじゃいかんの? stackoverflow.com/questions/28632968/why-doesnt-rust-support-trait-object-upcasting
- 334 名前:デフォルトの名無しさん mailto:sage [2015/07/01(水) 01:38:30.43 ID:Co4dDuJ+.net]
- インターフェースを拡張した場合において、拡張元のインターフェースにアップキャストできるかどうかは、OOPL次第。
同一のメソッド名であれば実装を一本にまとめてしまうJavaはできるが、 同一のメソッド名だが異なるインターフェースで異なる実装をもてるDelphiはアップキャストできない。 C#はどうだったかな? 後者だった気がする。
- 335 名前:デフォルトの名無しさん mailto:sage [2015/07/01(水) 01:51:50.96 ID:paBhA78F.net]
- アップキャストできない場合て、多態できなくね?
多態出来ないと、OOPの1/3位の価値が失われる気がするんだが… ま、別にrustにOOPを求めてはいないんだけどね。
- 336 名前:デフォルトの名無しさん mailto:sage [2015/07/01(水) 05:52:25.11 ID:/48a4Fba.net]
- >>334
DelphiもC#もできるぞ……なんか勘違いしてそう
- 337 名前:デフォルトの名無しさん mailto:sage [2015/07/01(水) 06:53:23.75 ID:va2KIQhQ.net]
- >>335
Derived→Baseというtrait間のキャストができないだけで、 traitを実装した型を&Baseへキャストすることはできるけど、 それだけではたりない?
|

|