Rust part8

レス数が1000を超えています。これ以上書き込みはできません。
2020/01/24(金) 11:47:52.41ID:9oO1hUHl
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 Part7
http://mevius.5ch.net/test/read.cgi/tech/1563114707/
2デフォルトの名無しさん
垢版 |
2020/01/24(金) 12:03:40.01ID:ytRnz1Ft
このスレにバグがある確率
3デフォルトの名無しさん
垢版 |
2020/01/24(金) 13:58:51.88ID:rcCZSgTk
この世のC/C++プログラムにバグが一つでもあるぐらい%
2020/01/24(金) 15:10:27.64ID:2IgFvbdV
>>2
このスレの仕様が定義されてないから
バグがあるかどうかは不定です
2020/01/24(金) 23:17:19.37ID:CbfOEjVR
質問です。
こんな構造体を作っていました。

struct Iter<T: Iterator> {
buffer : Option<char>,
iter : T
}

このとき T::Item が char であるような制限を表現する方法はありますか?
2020/01/25(土) 00:04:14.38ID:m3Nt4oA+
struct Iter<T: Iterator<Item=char>>
2020/01/25(土) 00:07:06.67ID:NV/40SqZ
>>6
ありがとうございます。
上手くいきました。
8デフォルトの名無しさん
垢版 |
2020/01/25(土) 09:25:49.56ID:yPlwm7j6
どういたしまして
9デフォルトの名無しさん
垢版 |
2020/01/25(土) 10:02:56.84ID:cxLY0DeL
ミスがある前提で作られたソフトウェアなんぞ使いたくないわ。
2020/01/25(土) 10:26:45.49ID:m3Nt4oA+
個人のミスが重大な問題にならないようシステムで防ぐんだぞ
1つのミスがそのままProductionのバグになるわけじゃないから

個々の部品が予期しない故障をする前提で設計したシステムと
個々の部品は想定外の故障はしない前提で設計したシステムと
どちらのほうが高い信頼性を実現できるのかは歴史を見れば明らか

だから優れたプログラマーは自分がミスを犯す前提で
そのミスが重大な問題につながらないよう個人単位でもシステムを構築してる
2020/01/25(土) 10:50:03.15ID:hZDj10w+
ミスをしないエンジニアは存在する

俺だ
12デフォルトの名無しさん
垢版 |
2020/01/25(土) 10:53:31.57ID:cxLY0DeL
>>10
おまえの関わった製品には署名しといて。
絶対使わないから。
2020/01/25(土) 10:59:09.24ID:cUlFTyRf
>>11
5chに書き込んでる時点で
何か人生ミスってる気がする
14デフォルトの名無しさん
垢版 |
2020/01/26(日) 03:02:59.13ID:0RGBrSLm
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=511e2be2ae90342a9c36f759e73108b6
勉強がてらたらい回し関数をメモ化仕様で書いてみたんですけどあってますかね…自信がないです
2020/01/26(日) 14:50:16.22ID:0RGBrSLm
返す変数間違ってました
2020/01/26(日) 15:15:02.80ID:0RGBrSLm
あーなんかいろいろ間違ってたんで出直します
2020/01/26(日) 17:36:36.36ID:HuWRexcG
プルリクとかも出す前にさんざん確認してんのに出してからすぐ「あ、ここ間違ってた…」みたいになるよね(´・ω・`)
18デフォルトの名無しさん
垢版 |
2020/01/26(日) 21:41:08.18ID:afCDhAgp
Vec<String> を拡張すると定義外ってエラー出るんですけどなんでかわかる人います?
他のライブラリでVec拡張してるソース見ると特殊なことせずにimplできてるんですけどどうすればこのエラー取り除けますか?
impl From<Vec<&str>> for Vec<String> {
fn from(v: Vec<&str>) -> Self {
v.into_iter().map(String::from).collect()
}
}
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
88 | impl From<Vec<&str>> for Vec<String> {
| ^^^^^---------------^^^^^-----------
| | | |
| | | `std::vec::Vec` is not defined in the current crate
| | `std::vec::Vec` is not defined in the current crate
| impl doesn't use only types from inside the current crate
|
2020/01/26(日) 22:08:40.96ID:ux8Vy6ZU
>>18
ざっくりいうと
外部crateで定義された型 + 外部crateで定義されたtrait
の組み合わせでインプリするのは無理
どっちか片方が自crateで定義されたものなら問題ない

coherence ruleとかorphan ruleとかいうやつ
https://doc.rust-lang.org/error-index.html#E0117
20デフォルトの名無しさん
垢版 |
2020/01/26(日) 23:22:19.61ID:afCDhAgp
>>19
おお、ありがとう
impl Vec<&str> の単体でも駄目だったから自trait作って実装した!
結構制約厳しいな
外部トレイトに実装するならめんどくさいけどマーカーつけとけよって意味かな
2020/01/27(月) 17:44:19.37ID:e3ktUGSY
こんな関数は書けますか?
@ イテレータを受け取る
A 受け取る引数は @ のただひとつのみ
B 条件を満たす範囲を「スライスで」返す

スライスを作る記法は &s[1..10] みたいな感じなのでスライスの元になるオブジェクト s が必要なように見えますが、
スライスを返したいというのはいかにもありそうなことなので出来ないはずはないだろうという思いもあります。

イテレータは実際にはなんらかのシーケンスをたどるものではなく値の生成器である場合もありますが、
それらを区別するような制約を表現できますか?
2020/01/27(月) 18:55:02.93ID:Ad8VU0Ek
>>21
無理じゃね?
スライスじゃなくtakeやskip使ってイテレータを返すべきケースだと思うけど
2020/01/27(月) 22:07:00.22ID:0eef+IwM
スライスは連続したメモリ領域である必要があって
任意のイテレータがその条件を満たすのは不可能。
たまたま連続した場合だけスライスを返すのはunsafe使えば書ける。
ただ普通はイテレータ返してランダムアクセス必要なタイミングでcollectすると思う。
2020/01/27(月) 22:21:05.46ID:0eef+IwM
あと標準のイテレータは特に値の生成方法に関する型制約はないので
区別したいなら独自のイテレータ型を作って
標準イテレータへの変換を実装する感じかな。
2020/01/27(月) 22:29:13.49ID:ZEgWdqLw
入力が連続したメモリ領域だってんなら引数をイテレータじゃなくてスライスにすればいい
当たり前だけどスライスを作れるもの以外からはスライスは作れないからな
2020/01/27(月) 22:46:49.78ID:ZEgWdqLw
ごめん、なんか変なこと言ってるわ・・・スルーして
2020/01/27(月) 23:06:14.69ID:Ad8VU0Ek
>>23
>たまたま連続した場合だけスライスを返すのはunsafe使えば書ける。

イテレータを受け取ってスライスを返すとした場合
スライスの元になってるシーケンスのlifetimeが関数内に閉じるから
unsafe使ったとしてもborrow checkerにひっかからない?
2020/01/27(月) 23:19:10.77ID:2FR/nuYZ
>>27
from_raw_partsでスライスを作った場合は元のポインタ由来のライフタイムは関係なくなるので
ボローチェッカは通るんじゃないかな?
もちろんそのスライスの実体が生きているかどうかは
自己責任になるけど。
2020/01/28(火) 00:18:00.02ID:nzUBCcWX
>>28
なるほど
イテレータからイテレータの元のシーケンスが取得できればそれでいけるってことか
ちょっと見てみたらslice::Iterのas_sliceとかも内部でfrom_raw_parts使ってた

自分では使わないと思うけど勉強になった
30デフォルトの名無しさん
垢版 |
2020/01/28(火) 10:36:24.22ID:ijxMtirO
RustでOSのkernel描いてる例ある?
3121
垢版 |
2020/01/28(火) 10:56:11.58ID:jIEBko3c
>>22-29
ありがとうございます。
スライスの役目や Rust の習慣について誤解していたみたいです。

【誤解】
 スライスは範囲を表現する高級なオブジェクト
 Vec にも配列にも使えるのでコンテナ全般に使えると思った

【正解】
 スライスは「メモリの」範囲を表現するオブジェクト
 実体としてはいわゆる fat pointer

【背景】
 Vec は内部的に連続したメモリ領域で管理しているので普通の配列のようにスライスを作れる
 C++ でいえば vector の data や string の c_str みたいなもの

【見落とし】
 配列でも Vec でもスライスの型表記は同じなのでどうしてだろうと気にかかってはいたが掘り下げて調べなかった
 型が同じなのは実際に同じだからなわけですね
32デフォルトの名無しさん
垢版 |
2020/01/28(火) 12:14:44.10ID:w1x5kgyo
質問あると自分の理解が怪しいのが分かって助かるわ。
33デフォルトの名無しさん
垢版 |
2020/01/28(火) 19:57:36.65ID:DC7dbBDx
let template = if spaces { "{1}{0}{1}" } else { "{1}{0}" };
format!(template, 1, 2);
これだとリテラルかけってエラー出るだけど、解決方法ないかな?
2020/01/28(火) 20:03:41.33ID:UeuUZ8OR
iter[1..4]とか書けた方がiter.skil(1).take(4).collect()よりシンプルでええやん!
とは思ったが、そういう使い方したらそもそも駄目よ、という意思が表れているのかもしれん
2020/01/28(火) 20:21:31.82ID:F/6MF06M
>>33
標準のformatでは無理だね。templateのパースエラーを返す手段がないので。
dynfmtクレートとかならいけると思う。
36デフォルトの名無しさん
垢版 |
2020/01/28(火) 22:00:20.47ID:DC7dbBDx
>>34
range(&self, from: usize, to: usize) -> Option
があればいいのにね

>> 35
ありがとう、リテラルのみは統一感出るけどかなり不便だね。
デバッグ用じゃなくともDisplayとかもあるからResult返すマクロも入れといてくれたらいいのにね
2020/01/28(火) 22:12:59.36ID:hojGZimv
>>36
いえいえ
2020/01/28(火) 22:31:23.29ID:KmVlGMrW
>>34
Rust的にはcollectによるメモリコピーみたいな
重い操作は見た目上も重くしたいんだと思ってる。
39デフォルトの名無しさん
垢版 |
2020/01/29(水) 00:56:46.27ID:OlGAjZi3
collectを二度書くと罪悪感で一度にならないか一生懸命考える
2020/01/29(水) 02:14:46.64ID:V4INQ4I7
>>33
単純な用途ならリテラル返すマクロを書くといいかも
複雑な用途ならテンプレートエンジンかな

macro_rules! my_format {
(true) => ("{1}{0}{1}");
(false) => ("{1}{0}");
}

println!(my_format!(true), 1, 2);
2020/02/01(土) 18:37:08.80ID:saBYxsru
https://tech-blog.optim.co.jp/entry/2019/07/18/173000#%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%A9%9F%E8%83%BD%E3%81%AE%E6%B4%BB%E7%94%A8

のデバッグ機能の追加のところを読んで一通り導入してみたんだが、ブレークポイントで止まったところがなぜかバイナリ表示になってしまう


解決策を教えてください
2020/02/02(日) 05:59:15.53ID:DhujQgFD
Slackで聞け
2020/02/02(日) 19:09:35.21ID:Ng7YaIlp
>>41
CodeLLDB初めて使ってみたがオレ環では特に問題なく使える
ソースマップ定義してないから標準ライブラリとかにstep inすればバイナリで表示されるけど
自分のソースのブレークポイントでバイナリ表示はされない

単純にdebug symbolが有効になってないとか?
launch.jsonのcargoのコマンド確認してそれでbuildしたバイナリを
rust-lldbでデバッグできるかどうかで切り分けてみたら?
2020/02/02(日) 21:47:21.49ID:RNwzrPPX
解決しました
上記はMac用のデバッグのやり方のようです
2020/02/04(火) 01:45:10.19ID:5y86WC+2
vscodeでrust始めたんだけどオートコンプリートがまともに働いてくれてない気がする
メソッド内の変数だと候補を出したり出さなかったりする
2020/02/04(火) 02:12:55.41ID:Pt7gvJNj
>>45
vscodeやめてインテリなんとか使えば?
2020/02/04(火) 02:38:52.83ID:w9dkRQaa
vscode での Rust の補完って LSP を使うんでないの?
処理系と連携するって最強じゃんと思ってたんだが。
2020/02/04(火) 20:47:39.21ID:3rIDek9/
コンパイラから出てくる補完情報が成熟してないんで、まだ完璧には遠い
独自の解析はracerとintellij rustがやってて、精度はintellijの方が高い

あんまIDE使いたくないからrlsには頑張って欲しい
49デフォルトの名無しさん
垢版 |
2020/02/04(火) 21:22:29.69ID:YIjVTtZH
本体のソース見たいけど/* compiler built-in */ってなってて読めない。
どうやったら見れる?
2020/02/05(水) 23:43:19.76ID:85RuEno5
Rust の char::is_ascii とかは pub const fn is_ascii(&self) -> bool なのに is_whitespace とかは pub fn is_whitespace(self) -> bool みたいになってるのなんでだろ?
&self でも self でもどっちかに統一してよさそうな気がするんだけど。
2020/02/05(水) 23:45:58.49ID:D4pcZnSz
なんかツイッターで以下2つについてコンパイルできねーっていうつぶやきがあったんですが、
試してみたらコンパイルできちゃったんですがどういうことなのでしょう
Rust2015/2018どっちでもコンパイルできちゃいました

//その1
let y: &i32;
let x = 5;
y = &x;
println!("{}", y);

参照元yの変数宣言が参照先のxより先に変数宣言されたからエラー。


//その2
let mut x = 5;
let y = &mut x;
*y += 1;
println!("{}", x); //これがエラー
2020/02/05(水) 23:58:35.71ID:sFY5zr3G
>>50
is_asciiはstrやsliceにもあるからそれに揃えたんじゃないかな
2020/02/06(木) 00:18:39.33ID:yO6jvvKT
>>51
NLLで救えるようになったケースだね。
Rust1.30くらいまで戻せばエラーになるけど
今は2015でも2018でもNLLがデフォルトなのでエラーにはならない。
2020/02/06(木) 00:30:48.24ID:kEyn3Q9D
drop順でエラーになってたやつだね
2020/02/06(木) 00:59:10.03ID:jSrTrJa0
>>52
なるほど、全部を &self に揃えなかったのは、やっぱ self の方が効率的って判断なのかな?

ワイはまだ初心者で Rust 脳になりきれてないんだけど、参照渡しってのは実質的に (C/C++ で言うところの) ポインタをやりとりしてる感じでしょ?
(単純な場合は最適化で消えると思うけど。)
char 程度の大きさならポインタを渡すのでもコピーして渡すのでも差はないし、ポインタだと間接参照になる分だけ無駄っぽい。

という理解をしてて、 char のメソッドは全部 self でいいくらいじゃないかと思ってた。
2020/02/06(木) 01:31:54.89ID:yO6jvvKT
>>55
ascii系は昔はAsciiExtってトレイトに別れてたから
その名残だと思う。
2020/02/06(木) 01:51:52.29ID:jSrTrJa0
>>56
歴史的経緯ってやつか。
比較的新しい言語なのに、やっぱりそういうこともあるのね。
58デフォルトの名無しさん
垢版 |
2020/02/06(木) 11:48:46.94ID:GExFx9na
The Rust Programming Language 第2版で勉強中なんだけど
この内容に連動した練習問題か使用例みたいなのどこかにないだろうか?英語でいい
2020/02/06(木) 14:10:02.33ID:kEyn3Q9D
https://www.rust-lang.org/learn
このページの上のほうにある3つのボタンがそれそれ
1. The Bookの最新版
2. Rustlings course(練習問題的なやつ)
3. Rust by Example(使用例)

英語で問題ないなら2018対応してる最新のThe Book読んだほうがいいかも
2020/02/06(木) 14:27:06.44ID:jSrTrJa0
英語がしんどい人 (日本語しかわからん人) にオススメなのはありますか?
2020/02/06(木) 15:54:58.65ID:kEyn3Q9D
The Bookの日本語版かオライリーの訳本
https://doc.rust-jp.rs/book-ja-pdf/book.pdf
https://www.oreilly.co.jp/books/9784873118550/

原著で読んだから訳の良し悪しはわからないけど
The Book含めて数冊読んだ中ではオライリー本が圧倒的にわかりやすかった
6258
垢版 |
2020/02/06(木) 17:27:24.00ID:xuuHNC+j
>>59
ありがと
こんな感じの欲しかった
って言うかPDFだけ読んでたから思い付かなかったけど本家にあったのか
2020/02/06(木) 20:07:27.95ID:oYYwjpH2
手を動かしたいなら自転車本もあり
オライリーはちょっと古くなってるからなー
2020/02/06(木) 22:23:34.76ID:kEyn3Q9D
オライリー本の古くなってる箇所はEdition Guide読めば問題ないよ

多少古くてもOwnershipやLifetimeあたりの重要コンセプトをわかりやすく書いてるものがおすすめ
2020/02/06(木) 22:57:58.42ID:ui7lN2G4
>>58みたいに英語でいいならrustupでインストールしたら付いてくるdocとそのリンク先にあるやつ読んだほうが良いぞ。

// ランタイム持ってないからasync/awaitがゼロコスト理論斬新すぎる
2020/02/07(金) 16:10:10.85ID:Q1mDvO6J
自クレートの名前やバージョンを取得するマクロって無かったっけ?
2020/02/07(金) 16:23:48.41ID:BIRgOLIs
Rust のライブラリって検索できるようになってるじゃん?
あれって名前だけじゃなくて引数の型とかで検索できたりしないのかなぁ。
Haskell (GHC) の Hoogle みたいに
2020/02/07(金) 16:25:17.48ID:BIRgOLIs
>>67
あ、 Inparameters ってやつをクリックすれば出てくるのか。
2020/02/07(金) 16:30:12.12ID:aVy5/bny
>>66
これ?
https://doc.rust-lang.org/cargo/reference/environment-variables.html#environment-variables-cargo-sets-for-crates
2020/02/07(金) 16:36:53.27ID:Q1mDvO6J
>>69
それだ!ありがとう
2020/02/07(金) 16:54:52.66ID:BIRgOLIs
>>69
へー。
そのための専用のマクロってわけじゃなくて cargo が環境変数を設定してくれるって話なのね。
Cargo.toml を見ないとわかるはずもないからなんらかの連携があるのは当たり前といえば当たり前だけど。
2020/02/10(月) 11:00:28.83ID:V3dAq4mT
io::Errorとかってprintln!("{:?}", err )とかしても
Os { code: 13, kind: PermissionDenied, message: "Permission denied" }
みたいに出るだけで「どのファイル」かが分からないんですが、外部のクレートの関数から上のようなエラーが帰ってきた場合それが「どのファイル」によって起きてるのかというのはどうやって知れば良いんでしょうか?
2020/02/10(月) 18:06:05.22ID:cKG4UD69
>>72
自分が明示的にパスを渡してるケースじゃなければ
クレートの作者にファイルパスも入れてクレメンスするしかないかも
74デフォルトの名無しさん
垢版 |
2020/02/10(月) 20:19:23.72ID:vX14wve5
バイナリサイズはまだCの方が全然小さいけどRustはC以上になにが含まれてるの?
もちろん標準ライブラリとかは使ってないやつはバイナリに含まれないよね?
2020/02/10(月) 21:25:29.97ID:XC+zOH9l
>>74
明らかに大きいのはbacktrace用のデバッグシンボル。
これはstripすれば縮む。
それ以外はC側が共有ライブラリとしてどれだけ外に出してるかによるかと。
2020/02/10(月) 22:55:31.36ID:t0EW4OCb
メモリ管理がランタイムにあるしdrop checkerもあるからランタイムはデカイよ。
77デフォルトの名無しさん
垢版 |
2020/02/10(月) 23:49:02.35ID:vX14wve5
>>75
backtrace用のデバッグシンボルってreleaseでもついてくるの?

>>76
drop checkerってborrow checkerの書き間違え?borrow checkerってcompile-time以外でも走るのって一部の実装だけって認識だけど
ARCとか使うとランタイムとか増えるの分かるけど使ってないハロワだけのやつでもCより多いのが疑問
2020/02/11(火) 00:10:31.83ID:v/oRLdRM
https://www.reddit.com/r/rust/comments/bzdwru/hello_world_executable_size_268k_in_rustrelease/
79テトリス ◆SYKnw8OJpw
垢版 |
2020/02/11(火) 00:36:46.52ID:DhLQ/nua
Windows10のキャラクターがゴミ過ぎて無駄に苦労する
やっぱLinux使うしか無いんか?
でもゲームしたいからWindows環境が良いんだよな…
2020/02/11(火) 01:09:07.15ID:qG/miOyM
>>77
releaseでもデバッグシンボルはついてくる。
取って欲しいってIssueは立ってるけど
stripすればいいって感じなのか、あまり動きはない。
あとCのHelloWorldが小さいのはコードの大半が
libcにあるせいなのでは。
2020/02/11(火) 01:18:02.99ID:v/oRLdRM
バイナリサイズを小さくしたいならここを読む
https://github.com/johnthagen/min-sized-rust
2020/02/11(火) 18:54:33.07ID:Vv3Ln0ZS
組み込みで使おうなんて本気で考えてる奴はこんなところで聞いたりせんだろ。
2020/02/12(水) 12:54:11.29ID:F/O7jTJS
>>70
いえいえ
2020/02/17(月) 17:53:09.28ID:qpTD/rYC
cargo install mdbook

としたとき、依存するライブラリクレートも一斉にインストール (というかキャッシュみたいな扱い?) されたようです。
ローカルに入ったライブラリクレートのドキュメントから一斉に、網羅的に検索する仕組みはありますか?
標準ライブラリのドキュメントは名前や引数で検索できますが、それを手元に入っているライブラリ全てに拡大したようなものが欲しいです。
2020/02/17(月) 18:00:40.10ID:4asOCOmT
>>84
ビルド用の一時ディレクトリ以下に展開されただけで他から使えるようにはなってないよ
2020/02/17(月) 18:17:09.06ID:qpTD/rYC
>>85
そうなんですか。 Windows でやってるんですけど、
C:\Users\<ユーザー名>\.cargo\registry\src
に入っているのはビルド時の一時ファイル扱いという理解でいいんですかね?

他のプログラムをビルドしたときに必要になるライブラリクレートに共通するものが (このフォルダに) あったときでも
使いまわしはされないんでしょうか?
見かけ上は独立してるけど cargo が裏でうまいことやってくれるって感じなんでしょうか?

本当は Cargo book を読めばいいんでしょうけど、英語がわからなすぎて基本的な理念がよくわかってないです。
2020/02/17(月) 20:49:03.97ID:P9Oy3OK5
$ cargo doc --open
doc生成すればプロジェクトの依存クレートすべてWeb形式で検索できるけど
そういうことではない?
2020/02/17(月) 22:42:46.96ID:ksspevQp
>>84
cargo installはバイナリクレートをインストールするためのワンライナーなんで
ライブラリクレートをどうこうする為のものではないよ。
バイナリのビルドに成功したら.cargo\binにコピーしてゴミは削除する。
バイナリクレートのドキュメントを読みたいならそれ自身を読みに行くんだよ。
rustdocは開発者向けでユーザー向けじゃない。

mdbookのrustdocが読みたいなら単にソースコードをクローンして自分でcargo doc叩けばビルドしてくれるけど。
2020/02/18(火) 00:10:35.64ID:AiY0lHAj
構造体のメソッドでメンバ変数の値ひっぺがすのにstd::mem::take使うの面倒だな
9084
垢版 |
2020/02/18(火) 10:09:42.44ID:Nm2LYTxd
>>87
「そのプロジェクト (に依存する全ての)」ではなく「ローカルに残っている全ての」というつもりでした。

>>88
> cargo installはバイナリクレートをインストールするためのワンライナーなんで
> ライブラリクレートをどうこうする為のものではないよ。

「為のものではない」ということは察していたんですが、
ライブラリのソースコードは残っているので裏で Cargo が動くために情報を残してもいるのだろう
と考えて特定のプロジェクトに限定せず横断的な処理をする方法があるのかどうかということを考えていました。

バイナリクレートをアップデートするときのために残してあるだけなんですかね……?
とりあえず、プロジェクトごとに独立していると考えておきます。
2020/02/18(火) 10:18:22.88ID:dnK/GzEr
>>90
.cargoは全プロジェクト共通のキャッシュなので
プロジェクトまたいでも再利用はされる。
ただcargoコマンド自体はプロジェクト毎の操作しか提供しない、という感じ。
そういうツールを作ること自体は可能と思うけど。
9284
垢版 |
2020/02/18(火) 10:59:25.45ID:Nm2LYTxd
>>91
なるほど。
見かけ上はプロジェクトの独立性があるように抽象化されているという感じですね。

なるべくなら過去に使ったことのあるライブラリクレートから使えそうなものを
探した方がキャッシュ (?) の増大を抑えられるし、
よく使われるライブラリの方が信頼性が高いだろうというのが元々の動機でした。

ツールの使い方もおぼつかないので定番と言えるのがどのあたりなのかとかいった肌感覚もなくて、
実際のコードを色々と見て回るのにどういうやり方が良いのか模索しています。
2020/02/20(木) 05:16:24.39ID:xc5wKacK
https://ideone.com/6mGYO9

これの14行目15行目のところを10行目のところのように1つの文で書ける方法ってありますか?
2020/02/20(木) 19:48:24.79ID:s7d9UeaP
Haskell の default 宣言みたいなのは Rust にありますか?

たとえば関数 foo が返す値の型が a もしくは b の可能性があり、
関数 bar が受け取る値の型が a もしくは b のときに bar(foo()) という式で型が定まりません。
このときに a と b の間での優先度を決める方法があるかという質問です。

具体的な状況があるわけではなくて、言語機能を学ぶ中で生じた疑問です。
2020/02/20(木) 20:19:05.71ID:s7d9UeaP
>>93
こんな感じかな。

buf = buf.replace(ch, &<String as std::iter::FromIterator<&char>>::from_iter(&[' ', ch, ' ']));
2020/02/20(木) 20:57:27.42ID:xc5wKacK
>>95
thanks!
2020/02/20(木) 21:07:18.17ID:uEuAMc9c
俺だったらformat!(" {} ", ch)にするかforを[" ( ", " ) ", ...]で回すかな
2020/02/20(木) 21:09:56.45ID:NbeJLDuu
>>94
>たとえば関数 foo が返す値の型が a もしくは b の可能性があり

Rustで戻り値の型が1つに決まらない関数書ける?
2020/02/20(木) 21:27:49.34ID:ftgOjFn2
型が曖昧な時はだいたいターボフィッシュでなんとかなるやろ
2020/02/20(木) 21:55:52.56ID:nsHNq1aE
>>94
型が定まらない関数は定義不能。
aまたはbを返したいならenum c {a, b}にしてcで返すしかないかと。
2020/02/20(木) 22:48:30.93ID:OjLUij7y
>>94
rustはsum typeしかない。それだと実行時に型を評価する方法とunion typeがいる。
102デフォルトの名無しさん
垢版 |
2020/02/21(金) 01:30:08.71ID:8YUMmgA9
正直TypeScriptの1 | 2 の型記法欲しい
2020/02/21(金) 08:48:56.60ID:jEzn3g3M
>>94 って多分こういう事では?

trait X { ... }
impl a for X { ... }
impl b for X { ... }

fn foo<T: X>() -> T { ... }
fn bar<T: X>(_: T) { ... }

bar(foo())

Rust の文法詳しくないんで間違ってたらすまん
2020/02/21(金) 09:15:56.88ID:6JU7BGK2
>>103
もしそうならdyn Xで返せばいいね。
その場合は型がAかBかの評価は実行時になるけど
どちらにしてもAとBのどっちを優先する、みたいなのはないな。
10594
垢版 |
2020/02/21(金) 10:40:19.65ID:zBjm2h3y
>>103-104
近いですが a と b との関係がもっと無関係なもの (仮想関数を使えない) を考えていました。
コードにするならこんな感じです。

struct Foo {}
struct Bar {}
trait X<T> { fn foo(&self) -> T; }
trait Y<T> { fn bar(&self, T); }
impl X<Foo> for Foo { fn foo(&self) -> Foo {Foo{}} }
impl X<Bar> for Foo { fn foo(&self) -> Bar {Bar{}} }
impl Y<Foo> for Bar { fn bar(&self, _x: Foo){} }
impl Y<Bar> for Bar { fn bar(&self, _x: Bar){} }
fn main() { Bar{}.bar(Foo{}.foo()); }

いずれにせよ方法はなさそうですね。
型を明記すればよい話ではあるのですが、ふと疑問に思ってしまったもので。
106デフォルトの名無しさん
垢版 |
2020/02/21(金) 13:18:50.41ID:sx356ht7
いや、こちらも勉強になるよ。
2020/02/21(金) 15:11:57.88ID:RiyafmFC
型推論でどの型のメソッドを呼び出せばいいか決まらないときに
特定の型のメソッドを優先させるような記述方法があるかってことだったのか
>>99のエスパー力すごいな
2020/02/21(金) 15:21:44.11ID:RiyafmFC
ターボフィッシュで指定するか型指定した変数で一旦受けるかだね
https://play.rust-lang.org/?gist=3d288900b3f655687d0ba22cc37cbb23

逆にこのケースでdefaultの型が決まっちゃうのってちょっと怖い
10994
垢版 |
2020/02/21(金) 18:02:02.28ID:zBjm2h3y
Rust の型システム (Hindley-Milner) は ML 系言語で実績があるやつなので、
(型に関して) ML 系で出来ることはおおよそ出来るのではないかと思いつつ、
Rust 的には明記させたい場面かもな……みたいな気持ちでした。

やはり勝手に決まって欲しくないというのが Rust ユーザの感覚なんですね。

※ Haskell が ML 系と言えるかどうかは諸説あります
110デフォルトの名無しさん
垢版 |
2020/02/22(土) 01:53:24.77ID:eI8xgqVo
これ出来たらかっこいい見たいな型推論の活用ってある?
2020/02/22(土) 12:47:45.08ID:T3jMerUl
ファントムタイプは(名前が)かっこいい
2020/02/22(土) 16:08:52.19ID:5jIrjfcF
C++ をやってた感覚から言うと Rust の str::parse っていいよね。

C++ は返却値の側からの推論が無いから普通の関数 (メンバ関数) として parse みたいなものを書けない。
いや、書けるけど型が推論されないからいちいち型を明記しなけりゃならない。
昔は演算子でやる C++ のスタイルを上手い案だと思ってたけど、
普通に関数 (メソッド) でやれるもんならその方がいいわ。
2020/02/25(火) 12:01:50.32ID:35/v8OB/
異なる関連型を持つ複数のトレイトオブジェクトを1つのVecに入れるのはAnyとかを使わないと無理でしょうか?
2020/02/26(水) 07:52:56.79ID:Es0cXQkx
IntelliJのRustプラグイン、ここのところぶっ壊れてないですか?
2020/02/28(金) 06:03:14.29ID:4nSGV1YY
1.41.1
2020/02/28(金) 12:10:25.14ID:Pr6ovKv/
これは大失態だな
117デフォルトの名無しさん
垢版 |
2020/03/03(火) 21:00:42.72ID:aQWPV0PM
static TEST = &'static str = "test";

このTESTの文字列の最後の一文字だけを参照として&'static charで作ることってできる?
型レベルで一文字ってことを保証したいのとメモリ節約したい
2020/03/03(火) 21:53:23.53ID:NDXXif57
>>117
charは4byteで&strはutf-8でasciiの部分は1byteだから無理そう。
2020/03/03(火) 22:01:05.88ID:Bj/i6Nw/
charは4バイトでポインタ(参照)は8バイトだから節約するどころかむしろメモリ食ってるなwww
2020/03/03(火) 22:09:48.50ID:lzYVFoFM
charにする場合は’staticは無理なんじゃないかな
&strをsliceして1文字分にしたほうが素直だと思う

let x: &'static str = "test";
let y: &'static str = &x[x.len()-1..];
let z: &char = &x.chars().next_back().unwrap();
2020/03/03(火) 22:48:24.81ID:EQ8N775K
そこまでメモリ節約したいって組込系か何かか
2020/03/03(火) 23:11:15.82ID:VHyE3ijH
charでなくu8を使うシーンに思える
2020/03/03(火) 23:13:54.10ID:EQ8N775K
asciiと分かってるなら u8 だよね
どっかで u8 ベースの文字列操作ライブラリ見かけた気がする
2020/03/03(火) 23:14:25.42ID:YHPxp8LF
>>120
それだと最後の1文字が2バイト以上の時に死ぬから
結局全体をcharsするしかないような。
2020/03/03(火) 23:30:49.39ID:EQ8N775K
これだ
https://crates.io/crates/bstr
作者が有名人なので前にチェックしてた
126デフォルトの名無しさん
垢版 |
2020/03/04(水) 00:03:26.33ID:g8GJiSIM
おお、いっぱい回答くれた ありがとう
レス止まってたけど見てる人はいるんだね。

素直にsliceしようと思ったけど、
str.chars.last()
このlastって消費されないけどなんで?
型的には
fn last(self) -> Option<char>
だけどなんで消費されないか分かんない
&strみたいな元々消費不可能ならコンパイルエラーでると思ってたんだけど。
https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.last
2020/03/04(水) 00:12:13.85ID:/mNi51EN
消費されるのは&strじゃなくてそのイテレータだからね。
"abcd".chars()で得られるのは、{ String : source, index : 0 }みたいな形のChars型で、これがindexをインクリメントしながら文字を取得してくれる。
128デフォルトの名無しさん
垢版 |
2020/03/05(木) 00:35:43.70ID:cMoNZaaE
use std::fmt::{self, Display, Write};
このselfってどういう意味?
2020/03/05(木) 00:38:13.00ID:S5c20Dqb
>>128
use std::fmt;と同じ。
130デフォルトの名無しさん
垢版 |
2020/03/06(金) 00:28:35.73ID:s+8hbWLf
まさにこの質問と同じ状況でコンパイル出来ないんですけど、分かる人いますか?
https://stackoverflow.com/questions/46393890/mutable-borrow-in-loop
2020/03/06(金) 01:12:13.19ID:n2xpzai7
>>130
回答に書いてあるじゃん・・・
dostuff()やfixme()が受け取るselfに’aでlifetimeアノテーションをつける理由ないよね
132デフォルトの名無しさん
垢版 |
2020/03/06(金) 19:38:23.62ID:s+8hbWLf
>>131
ライブラリ側が同じデータ構造しててループで回したいけど同じエラーで出来ません
これって並列にループ回す可能性があるからシングルスレッドでも禁止されるんですか?
すみません、初心者で
2020/03/06(金) 21:38:26.09ID:n2xpzai7
>>132
ある値に対するmutable referenceは同時には1つしか存在できない
ってのはRustの基本ルールの1つ
この場合は並列に回す可能性があるかどうかは関係ない

Test構造体自体のライフタイムが’aで
dostuff()が&’a mut selfを取るなら
1回目のdostuff()呼び出し時にselfをmutableに借りてくるけど
Test構造体のライフタイムと同じだけ借りることになるから
2回目のdostuff()呼び出し時には1個目を借りたまま2個目を借りようとしてることになる
だからエラー
134デフォルトの名無しさん
垢版 |
2020/03/07(土) 13:13:11.28ID:e127m1PH
>>133
なるほど。
ライブラリ側なので修正できないんですが、AcとRefCell使って解決できる問題ですか?
2020/03/08(日) 08:35:20.95ID:MryPyRvf
>>134
どのライブラリのどのメソッド?
2020/03/08(日) 11:34:51.20ID:gavt1hh0
その構造体の意図が分からんので、あんまりアドバイスできない
単にライブラリ作者がrustに慣れていないだけなら、適切な形に直してもらうのがシンプルで合理的だし、
>>130のTest::fixme相当のメソッドは誰にも呼び出して欲しくないのかもしれないなら、使うべきじゃない
Test::dostuffを繰り返し呼び出したいだけならRefCellで何とかなる
2020/03/08(日) 11:38:51.13ID:gavt1hh0
Rustで型パズルみたいな状況になるのは、見落としている前提があったり、設計レベルで何か考慮が足りないことが原因な事が多いと個人的には思ってる
姑息な解決をしてたら余計にドツボにはまる
138デフォルトの名無しさん
垢版 |
2020/03/09(月) 04:03:43.73ID:FXqsuorv
>>135
>>136
このライブラリです。
https://github.com/fulmicoton/kuromoji-rs
https://github.com/fulmicoton/kuromoji-rs/blob/master/src/lib.rs#L246-L256

こういう風に使おうとしていて、Testと同じ状況です。
let mut tokenizer = kuromoji::Tokenizer::normal();
for s in ["Example", "Example2"].iter() {
tokenizer.tokenize_str(s);
}
2020/03/09(月) 06:35:47.93ID:wpD0c2Sy
>>138
Tokenizer自体は'aで定義されてないからTestとは状況違うんじゃない?
2020/03/09(月) 10:07:04.49ID:KfBbpF5w
コンパイラをだましても本質的な解決にはならん。
そろそろrustマンセーしてる輩も気づくころだろうね。
2020/03/09(月) 12:37:33.41ID:DOrcZre+
なんかトレイトの命名でなるべく名詞ではなく動詞を使う(WriterではなくWrite、ReaderではなくRead)みたいなのがオフィシャルの文書で有ったような気がするんだけど見つからない
そんな指針って無かったっけ?
2020/03/09(月) 12:52:18.51ID:lyteAeVl
>>141
オフィシャルにはapi-guidelinesだと思うけど特になさそう。
このissueで議論されてるけど特に結論はでてないし。
https://github.com/rust-lang/api-guidelines/issues/28
2020/03/09(月) 13:05:24.07ID:CscrLobz
>>141
話し合いしている様子は見つけた。
https://github.com/rust-lang/api-guidelines/issues/28
どちらを優先するという話ではなく、使い分けがあるっぽい。
2020/03/09(月) 21:11:10.09ID:tRF5zhFi
一年くらい前に挫折して最近また勉強し始めたんだけど参照周りの仕様変わった?
https://doc.rust-jp.rs/rust-by-example-ja/scope/borrow/freeze.html
これとかエラーにならないし
2020/03/09(月) 21:47:20.13ID:oO+VEyrl
>>144
昔は一度借用するとスコープアウトするまで借りっぱなしだったけど、今は使われなくなった時点で返すようになってる。
non lexical lifetimeというやつ。
英語版だとちゃんとエラーになるように修正されてるね。
https://doc.rust-lang.org/rust-by-example/scope/borrow/freeze.html
2020/03/09(月) 22:32:56.28ID:Wg77JZ2S
>>138
試しに触ってみた感じだけど、戻り値をVecに格納しようとすると怒られるよね。
で、よく見ると引数のtextはtokenizer自身と全く関係の無い寿命であって良いのに、tokenizerとtextの寿命が同じであるってシグネチャで言ってるから何かマズそう
多分もっと理解できる人も居るだろうけど、selfとtextの寿命を無関係にしたら動くってなんとなく分かる
pub fn tokenize_str<'s, 'a>(&'s mut self, mut text: &'a str) -> Vec<&'a str> {
ってやったら動くよ。省略ルールで
pub fn tokenize_str<'a>(&mut self, mut text: &'a str) -> Vec<&'a str> {
と同義。

俺の頭の中の理解じゃプルリク送れるほど明快に説明できないが、適当にローカルに落とすかgithubでforkして使っても良い
2020/03/09(月) 22:35:30.43ID:tRF5zhFi
>>145
non lexical lifetimeっていうのね。Rust日本語情報が少ないので助かるわ。thx
2020/03/09(月) 23:22:38.75ID:hlMkZByK
>>147
しかしそもそも借用によるフリーズって意味なくなってるから
そのページ全体書き直した方がいい感じ。
フリーズするならシャドーイングによるmut外しかな。
2020/03/10(火) 15:02:44.20ID:eonxFH18
>>138
Linderaってのがkuromoji-rsの後継らしいからそっち使えば?
https://qiita.com/mosuka/items/0fdaaf91f5530d427dc7
https://github.com/lindera-morphology/lindera

該当箇所のライフタイムは修正されてるのでtokenizerのインスタンスをループで使っても問題ない
https://docs.rs/lindera/0.3.4/src/lindera/tokenizer.rs.html#163-173

ただドキュメントは整備されてないし
ライブラリ自身のテストも通らない状態になってるから
本格的に使うなら自分でメンテするくらいの覚悟が必要かもしれん
150デフォルトの名無しさん
垢版 |
2020/03/10(火) 19:42:21.39ID:jwXWuMzy
>>149
ありがとうございます、後継なんてあったんですね。
最近出来たみたいですがそれほどメンテされてないみたいですしこの先不安なので素直にPython使うことにします。
日本関係依存のライブラリはRustユーザー少ないので確立されたものがないのが辛いですね...
2020/03/10(火) 19:58:15.03ID:uPXabSQ0
rustも字句解析も相当知ってなきゃそれ使うの無理だろ。。
2020/03/11(水) 18:46:16.77ID:TDIek7NK
vecのinto_iter呼んだらconsumeするって
fn into_iter(self) -> イテレータ {self}
こういうふうになってるってこと?
よく分かってない質問ですみません。
2020/03/11(水) 18:56:11.75ID:TDIek7NK
あ、consumeじゃないわこの場合
moveって言いたかった
2020/03/11(水) 19:43:34.97ID:TDIek7NK
自己解決?

https://doc.rust-lang.org/std/vec/struct.Vec.html#impl-IntoIterator
impl<T> IntoIterator for Vec<T>

こうなってるからそのまま self を返してるに違いない
よーわからんけどなんとなく納得
155デフォルトの名無しさん
垢版 |
2020/03/11(水) 19:46:02.45ID:vu1i9ieU
よく分からないのに納得してしまうのはよくない
2020/03/11(水) 20:15:44.69ID:aaR0sYBN
>>154
ソースで理解したいんならここ。

https://doc.rust-lang.org/src/alloc/vec.rs.html#1934-1952

Vecのポインタを使ってIntoIterを構築して、元のVecはforgetでメモリ管理対象から外してる。
157デフォルトの名無しさん
垢版 |
2020/03/11(水) 20:40:35.00ID:TDIek7NK
>>155 おっしゃるとおり
>>156 おおおお!!!
想像とは違ってunsafeの中であれこれしてた!
impl<T> IntoIterator for Vec<T> {
type Item = T;
type IntoIter = IntoIter<T>;
fn into_iter(mut self) -> IntoIter<T> {
unsafe {
let begin = self.as_mut_ptr();
let end = if mem::size_of::<T>() == 0 {
arith_offset(begin as *const i8, self.len() as isize) as *const T
} else {
begin.add(self.len()) as *const T
};
let cap = self.buf.capacity();
mem::forget(self);
IntoIter {
buf: NonNull::new_unchecked(begin),
phantom: PhantomData,
cap,
ptr: begin,
end,
}
}
}
}
いやあ勉強になります
2020/03/11(水) 22:03:42.73ID:JP1MFGqI
fn into_iter(mut self) -> IntoIter<T>

このmut selfのmutの使い方について
意味は理解してるんだけど公式で解説してる箇所ある?
159デフォルトの名無しさん
垢版 |
2020/03/11(水) 22:44:26.55ID:PgaAGaoo
なんでextern crate crate_name;ってuse crate_name;に統合されたの?
2020/03/11(水) 23:04:39.68ID:JP1MFGqI
>>159
RFCに書いてある理由はこの辺り
https://github.com/withoutboats/rfcs/blob/modules/0000-modules/motivation.md#underlying-problems
2020/03/12(木) 06:53:02.39ID:/EHADneN
serde, reqwestとかを使ってるだけの小さいツールなのに
targetディレクトリ以下がいつの間にか2GB以上喰ってて驚いた
無駄遣いしすぎだろ
162デフォルトの名無しさん
垢版 |
2020/03/12(木) 09:00:30.33ID:TSUJe0Rk
ぜろこすとおーばーへっど(笑)
2020/03/12(木) 09:20:01.92ID:mBaP1v85
>>158
公式系のやつを一通り検索したけどなさそうだね。
確かに頻出パターンではないし、mut selfが必要になる頃には
それくらい分かるだろってことなんだろうか。
2020/03/13(金) 01:08:14.21ID:Guh/z+Wu
容量くうのってインクリメンタルコンパイルのせいかしら?
165デフォルトの名無しさん
垢版 |
2020/03/13(金) 16:12:49.45ID:uMGbn/tA
cargo run --bin bin_a で bin_a から a にバイナリ名をrenameできる方法ない?
オプションとかで
2020/03/13(金) 17:20:18.20ID:1gFsIjGl
>>165
標準ではないと思うから以下の三択
1. コマンドを自作する
2. プラグインを探す
3. Cargo.tomlの編集で我慢する
167デフォルトの名無しさん
垢版 |
2020/03/13(金) 17:48:43.18ID:uMGbn/tA
>>164
インクリメンタルコンパイルの内部構造知らないけど、仕組み的に一個前の状態しかもたないから関係なさそう
2020/03/13(金) 20:50:49.12ID:WvGu/USG
お前らのtargetディレクトリは何GBあるんだ?
2020/03/13(金) 21:21:22.50ID:1gFsIjGl
duとかdustでどのcrateが容量食ってるのか
きちんと確認したほうがいい
2020/03/13(金) 22:52:16.46ID:xYdxtME8
dustで一番ディスク喰ってるプロジェクトを調べてみたよ

target/debug/depsの下に
lib(serde|derive_more|syn|reqwest|chrono_tz)-xxxxxxx.(so|rlib)
が各ライブラリごとに3つずつぐらいあって、それぞれ21〜38MBぐらいあった
その他、依存ライブラリの依存ライブラリと思われる *.rlib ファイルが260個
これだけで 1.4GB

target/debug/build の下が400MBぐらい
target/debug/incremental の下は100MBもない

同様のファイルがtarget/releaseにもあって合わせると 2.3GB
2020/03/14(土) 01:08:40.11ID:7CRfyKLY
エコシステムが充実してるのはいいが、
ぞろぞろと依存を引き連れて落ちてくるのはしんどいな。
2020/03/14(土) 09:57:16.83ID:C6o8FCtt
う、うん…
2020/03/14(土) 13:30:22.96ID:Bfptd6Kx
Rustに限らず誰が書いたかも知らないまま誰がチェックしたかも知らないまま何がダウンロードされるかも知らないままインストールするのが当たり前になっちゃってるよな
ソースが公開されてるとは言えこれじゃいかんよなぁとは思いつつ楽だからまぁいっかな…って感じだわ(´・ω・`)
2020/03/14(土) 13:52:26.42ID:C6o8FCtt
わからないまま終わる。そんなのは嫌だ(´・ω・`)
2020/03/14(土) 13:58:57.65ID:fsLvYgsF
実際なんかの言語で問題起こしていたような
176デフォルトの名無しさん
垢版 |
2020/03/14(土) 14:53:10.70ID:XTUayws2
node.js
177デフォルトの名無しさん
垢版 |
2020/03/14(土) 15:14:32.21ID:kPfIlYV/
誰が書いたかも知らないまま誰がチェックしたかも知らないまま何がインストールされるかも知らないままOSをインストールするのが当たり前になっちゃってるよな
2020/03/15(日) 11:00:03.22ID:OT/9HDtv
公式アプリストアしか使えないとか真逆の動きだろ
何指してるんだ?
2020/03/15(日) 12:03:48.31ID:WbKVgqmu
実際のところ、そんなのいちいち精査してられんだろう。
180デフォルトの名無しさん
垢版 |
2020/03/16(月) 23:59:03.20ID:krhm4ltp
arrayvecとsmallvecってどっち使えばいいの?
2020/03/17(火) 04:52:34.09ID:fexMQ7hH
好きな方。
182デフォルトの名無しさん
垢版 |
2020/03/17(火) 10:23:26.40ID:6zUWJLLj
arrayvecとsmallvecよく見てないけど同じぐらい人気だからどっちでもよさそう
それよりもロガー周りが何選んだらいいか分からん(env_logger抜きで)
ファイル保存したいからlog4rsかfernかslogで迷ってる
ライブラリ選びはホントにRustの欠点だよな
2020/03/17(火) 11:06:35.06ID:fexMQ7hH
まあねぇ。 部品は連携してこそのものだから、
どっちでもいいものでもどちらかには決まってた方がありがたいってのはあるわな。
自由の強さと統率の強さは両立できないのでしゃーない。
2020/03/17(火) 11:30:02.19ID:0EWfgnGX
確かに選びにくいんだけど、型が強いのとコンパイルエラーが見やすいから、移行コストが結構低い気はしている。
なので最近はあまり気にせず適当に選ぶことにしてるな。
2020/03/17(火) 13:15:29.64ID:4299LfVU
スタック上に確保するStringライブラリってあるの?
2020/03/17(火) 17:38:45.49ID:7aqG0pP2
rust-avって今どういう状況なん?
だいぶ前にlibavの人たちがMozillaから数万ドル支援を受けて始めたとかニュースになってたけどgithub見ても実質的にはほぼ何も進んでないようなコミットばっかだしlibavすらほぼ放置みたいな感じだし
非公開の場所で着々と進んでてそのうち公開されるんやろか
187デフォルトの名無しさん
垢版 |
2020/03/18(水) 05:43:30.43ID:1FpZgrTM
C++の負の仕様引きずってるなってRustの特徴とかある?
2020/03/18(水) 09:41:00.53ID:0NsruLdQ
C++の負の仕様って何?
2020/03/18(水) 21:47:04.33ID:ygvPU+jd
winapi 0.3.8 の環境にて、CoCreateInstanceを行いたいのですが、
REFIIDの指定部分をどのように書けばよいか教えてくださいませ
190デフォルトの名無しさん
垢版 |
2020/03/19(木) 00:16:54.84ID:i16Q86hT
なんでassert_neはあるけどassert_notはないの?
2020/03/19(木) 01:43:10.57ID:2ajU8oVE
notと!が続いて少し紛らわしい
なくてもそんな困らない
必要なら作ればいい
とかかな

macro_rules! assert_not {
($cond:expr) => { assert!(!$cond) };
($cond:expr,) => { assert!(!$cond) };
($cond:expr, $($arg:tt)+) => { assert!(!$cond, $($arg)*) };
}
192デフォルトの名無しさん
垢版 |
2020/03/19(木) 15:19:47.59ID:dnKvjYNt
assert!(!false);
の方が紛らわしくないか?
assert_not!は関数名の方に!あるから見間違えないしスッキリするし直感的な気がする
それにneが内部的に反転してるだけならnotあったほうがいいな
2020/03/20(金) 07:03:37.86ID:6UN4nNu/
usize同士の差の絶対値を求めるのがすごくだるいんですけどなんかいい方法ないすか
2020/03/20(金) 07:38:59.81ID:4VHKiEg+
if x > y { x - y } else { y - x }
じゃ駄目かい
2020/03/20(金) 08:14:22.57ID:6UN4nNu/
やっぱそうするしか?
2020/03/20(金) 16:54:06.07ID:ShTr86MM
そういう関数を作っておけばええやん。
197デフォルトの名無しさん
垢版 |
2020/03/21(土) 19:08:12.84ID:d5Yv109I
let mut v = vec![1,2];
std::mem::swap(v[1], v[0]);
assert!(v == vec![2,1]);
こうしたいんですけど、どうすればいいですか?
2020/03/21(土) 19:19:05.58ID:HIaSqchS
Vec::swap使え->
Vec::swapは中でunsafe使ってるじゃないですか結局unsafe使わなきゃろくなこと出来ないんですねRustってクソですね

ってやりたい荒らしだろ?
氏ねばいいと思うよ
2020/03/21(土) 19:32:13.45ID:g81eKbe5
標準ライブラリ内でunsafe使うのと
自前でunsafe使わされるのとは雲泥の差があると思うんだがw
200デフォルトの名無しさん
垢版 |
2020/03/21(土) 20:27:19.94ID:d5Yv109I
ヤクザかな?
2020/03/21(土) 20:38:04.64ID:HIaSqchS
ほら、万が一の荒らしじゃないケース用に答えも同時に提示してあげたのにそっちには見向きもしないでしょ
そりゃそうだよね、実際はやりたいことの質問じゃなくてRustをディスるための質問なんだもんね

つかそもそも本当に質問のことがやりたいなら提示したコードをコンパイルしようとしてるはずだよね
そしたら親切なコンパイラが&mutで借用しろって教えてくれてるよね
そしたらそれに従ったら今度は親切なコンパイラが同時に2つmutな借用は作れないって教えてくれてるよね
じゃあどうしたら良いですか?ってなるのが普通だよね

それがないってことは質問を装っていながらコンパイルすらしてないってことだからね
荒らすんなら荒らすでもうちょっと頭使おうね☆
2020/03/22(日) 13:10:01.70ID:HvrypJyW
Rustにも、次のような「言語定義された smart pointer」があり、
~ : 一回だけ(unique) 参照する smart pointer。
@ : 複数回参照できる smart pointerで、GC を使っている。
drop なるものが、C/C++ の free()やdeleteの機能を持つ。
という認識で正しいのでしょうか。
2020/03/22(日) 14:01:25.52ID:HvrypJyW
>>202
参照カウンタを1引くようなDeref や、C/C++の単項演算子の方の「*」と
全く同様な「参照はずし演算子」の「*」もあるようですね。
また、~ や @ よりは少し高レベルになった smart pointer として、
Box<T> が、参照カウンタ方式の smart pointer として Rc<T> が、
さらに、動的(?)になった smart pointer としてRef<T>やRefMut<T>
があるようです。
凄く複雑です。
2020/03/22(日) 14:28:20.92ID:HvrypJyW
参照型の変数 r への代入は、普段は、
r = 1;
などでよいようですが、なぜか、*r と書かなければなら無い事があるようです。
また、&i32の変数rとi32の変数aを比較する場合比較する場合、
前者には *r を付けないといけないようです。
難しいです。
2020/03/22(日) 15:43:22.86ID:thEQOCMJ
6年以上前に削除された仕様の良し悪しを語りたいのか?
206デフォルトの名無しさん
垢版 |
2020/03/22(日) 15:57:03.70ID:DNfY/SCe
rustの未来教えて
2020/03/22(日) 16:08:02.82ID:HvrypJyW
>>205
詳しくお願いします。
2020/03/22(日) 16:50:19.83ID:thEQOCMJ
>>207 いやbook読んでよ。もし@とか~についての記述があったら逆に教えて欲しいくらいだ
2020/03/22(日) 17:28:44.77ID:HvrypJyW
>>204
&と*は常に逆の関係にあるようです。
The opposite of referencing by using & is dereferencing, which is accomplished with the dereference operator, *.

vがvecへの参照型の場合でも
v.push(5);
と書けてしまうのは、実体vとポインタ pV に対して
v.push(5);
pV->push(5);
と区別していたC++と違っているために個人的に混乱していただけのようです。

もう一つは、参照ではなく、
let a = 5;
let a = a + 1;
のように shadowing を行う例が個人的に混乱の原因になっていたようです。

参照型 &T の場合には、
let r : &mut TYPE = &a;
のようにした後は、
*r = xxx;
のように、原則的に * を付けて参照を一段階戻す必要があるようです。
*をつけなくていいのは、メンバ関数呼び出しの、
r.func();
のような例の場合だけで、もしかすると、
(*r).func();
としてもコンパイルが通るかもしれません。
2020/03/22(日) 17:30:53.65ID:HvrypJyW
>>208
https://pcwalton.github.io/2013/03/18/an-overview-of-memory-management-in-rust.html
Rust の 2種のスマートポインター、^ と @ に詳しいです。

「book」と言えば、詳しく学ぶには、まさに
https://doc.rust-lang.org/book/index.html
が初心者には分かり易いようです。
この本のことでしょうか?
2020/03/22(日) 17:52:06.65ID:qATPJDe3
7年も前の情報を無条件に信じられるピュアさが俺にも欲しいよ
2020/03/22(日) 17:52:35.28ID:ufFd2vaY
>>210
Rustの1.0リリースは2015年なので
それより古い資料は「昔そういう検討がなされたことがある」程度の意味しかない。
この5年の間に変わった仕様も結構あるし。
213デフォルトの名無しさん
垢版 |
2020/03/22(日) 18:32:23.24ID:DNfY/SCe
初心者なんだけど
もし1つの変数(所有権)にマルチスレッドで書き込みをしようと思ったら、
Rustの借用のルールだと不可能ですか?
複数のイミュータブルな参照を作る事になりますが、できないんですよね?
214デフォルトの名無しさん
垢版 |
2020/03/22(日) 18:40:28.26ID:DNfY/SCe
あまちがえました
訂正:
複数のミュータブルな参照を作る事になります
2020/03/22(日) 18:53:15.15ID:I5Su+SV6
>>213
同時じゃなければ可能なので
他のマルチスレッドプログラミングと同じく排他制御をすればいい
216デフォルトの名無しさん
垢版 |
2020/03/22(日) 19:02:35.81ID:DNfY/SCe
実行時にデータ競合系の問題が生じない代わりに
コーディング時に借用チェッカーとの戦いをするという感じになるんですかね
2020/03/22(日) 19:17:35.15ID:thEQOCMJ
>>210 そのbookだよ。オフィシャルのドキュメントを読まずにどうして深入りできようか
1点だけ。rustではobj.method()とするとメソッドの引数の型(&とか&mutとか)に合うようにobjに*とか&とか付ける仕様になってる
メソッド呼ぶ時のobjに対してこっちが*とか&とか付ける必要は特に無い
2020/03/23(月) 01:35:58.42ID:bf1cRh+B
>>217
bookの話、了解しました。
後半、「メソッドの引数の型」とは、た第一引数 thisのことでしょうか。
219デフォルトの名無しさん
垢版 |
2020/03/23(月) 01:39:22.78ID:h1jHr6GN
所有権、借用、ライフタイムについて勉強してみた。
でも他の言語でも排他制御とか非同期処理用クラスで非同期処理に対応できるわけで、
結局どれくらい御利益があるのか分からなかった。
2020/03/23(月) 02:29:29.77ID:bf1cRh+B
Rustの変数束縛、所有権、借用などで自動化されるのは、
「スタック変数」のポインタが、ブロックの外や関数の外に不用意に出ない
事だけで、Heapから確保されたオブジェクトの自動解放は、
参照カウンタや Garbage Collection を用いずに静的解析のみで行うことは出来ない、
という認識で正しいのでしょうか??
2020/03/23(月) 02:39:09.37ID:bf1cRh+B
>>220
例えば、Cだと、
int *func()
{
 int a;
 return &a;
}
としても警告は出る可能性はあってもコンパイルエラーにはなりませんが、
Rustでは同等のことはできないようになっていますね。
でも、Heapから確保したオブジェクトは、それを参照している変数の個数は
動的に変わります。というのは、Heapとは解放のタイミングを後に遅らせる
ための仕組みな分けですから。
オブジェクトを参照している変数の個数は静的に決まらないと言うことは、
参照カウンタやGarbageCollectionのような動的な検査の仕組みが全く無ければ
解放できないはずですね。

もし静的に解放タイミングを決められる可能性があるとすれば、参照の個数に上限を
設けることによってです。簡単な例ではそのオブジェクトを参照する変数が1つしか
ないなら、その変数にnullや別の値が代入されたり、その変数が削除されるタイミング
だけを静的に調べれば自動解放できるはずです。
しかし、2つ以上になった場合、参照カウンタ無しで静的に削除タイミングを決定するのは
かなり難しくなります。
222デフォルトの名無しさん
垢版 |
2020/03/23(月) 03:10:34.91ID:h1jHr6GN
私が読んだ説明記事では所有権やライフタイムはローカル変数かつシングルスレッドの例しかなかったんですが、
それだとRustがどう非同期処理に強いのかイメージできませんでした。
グローバル変数やマルチスレッドでライフタイム等の概念が活用されている例ないですか?
2020/03/23(月) 06:41:08.54ID:jGS2rL5b
Rust では所有権が移るから、資源を共有しないからだろ

資源を共有すると、アクセスするタイミングで、バグってしまう。
A を更新 → B を更新 → Aを読み取り

間に、Bが入ったことで、AはBの値を読み取ってしまったけど、
その場ではエラーにならず、かなり後になって、データが何かおかしいと誰かが気づくかも知れない。
気づかないかも知れない

だから、あちこちで排他制御をせざるを得ない。
そうすると、デッドロック・タイムアウトも考えないといけない
2020/03/23(月) 09:52:06.45ID:9RbShf99
資源を共有しないんじゃなくて、共有していい資源かどうかを型(SendとSync)で区別している。
なので排他制御が必要な箇所に入ってなかったらコンパイルエラーにできる。
だからデッドロックなんかは起きるけど、レーシングは起きないって感じ。
ライフタイムはそれほど関係ない。
2020/03/23(月) 12:20:19.11ID:bf1cRh+B
マルチスレッドの話は置いておいて、そもそも Rustでは、Heapから確保したオブジェクトの解放は自動化されてますか?
226223
垢版 |
2020/03/23(月) 12:54:01.89ID:jGS2rL5b
>>223
修正

>A を更新 → B を更新 → Aを読み取り
スレッドA が共有資源を更新 → B が更新 → Aが読み取り
2020/03/23(月) 13:43:29.57ID:xOZDOjnM
基本的なことが理解出来てない人はまずThe Bookを読もう

次からテンプレに書いといたほうが良さそう
2020/03/23(月) 15:20:59.29ID:bf1cRh+B
読んでそこまでたどりつくのは大変過ぎますので、どなたか分かる方が >>225 に答えていただければ幸いです。
2020/03/23(月) 15:33:10.24ID:iGWxNb08
>>225
自動で解放される。なぜされるのかが気になるならいろいろ想像してないでthe bookを読んだ方がいいと思う。
2020/03/23(月) 15:33:45.55ID:3KZHweI3
贅沢は敵です。
2020/03/23(月) 15:38:31.12ID:bf1cRh+B
Rc<T> は参照カウンタ方式で自動解放されますが、循環参照があった場合には自動解放されず、メモリーリークするそうです。
つまり、RustはHeapのメモリーを完全自動では解放できないのです。
C#やJavaは遅いですが、循環参照がある場合でも、GarbageCollectionにより完全自動で解放されます。
2020/03/23(月) 15:39:33.51ID:bf1cRh+B
つまり、「Rustは、GarbageCollectionがなくてもメモリ解放が自動化されている」
というのは嘘です。
2020/03/23(月) 15:40:41.93ID:FLdc410A
>>228
その部分だけの説明は出来ない。 そこにたどり着くまでの説明は関連してるから。
体系立てて説明している文書が公式にあるのにそれより上手い説明が出来るわけないだろ。
2020/03/23(月) 15:41:06.82ID:bf1cRh+B
>>231
https://stackoverflow.com/questions/55553048/is-it-possible-to-cause-a-memory-leak-in-rust

[Q] Is it possible to cause a memory leak in Rust?

Is there any way of causing a memory leak in Rust? I know that even in garbage-collected
languages like JavaScript there are edge-cases where memory will be leaked, are
there any such cases in Rust?

[A1]

Yes, leaking memory in Rust is as easy as calling the std::mem::forget function.

You can also leak memory if you create a cycle of shared references:

A cycle between Rc pointers will never be deallocated. For this reason, Weak is used to break cycles.
For example, a tree could have strong Rc pointers from parent nodes to children, and Weak pointers
from children back to their parents.
2020/03/23(月) 15:45:50.08ID:bf1cRh+B
>>233
結論的に言えば、Heapから確保されたオブジェクトのメモリの解放は自動化されてません。
2020/03/23(月) 15:49:21.93ID:iGWxNb08
なんだ。真面目に聞いてるのかと思ったのに。
まぁご自由にどうぞ。
2020/03/23(月) 16:15:56.91ID:bf1cRh+B
>>236
実際に自動化されていませんよね。
2020/03/23(月) 16:28:50.38ID:rbTK8rb1
真面目に回答した相手が荒らしだった時って「何だよ荒らしかよ」みたいな反応より「クッソ抜けるwww」からの「すいません誤爆しました」みたいなレスで「真面目に回答したわけじゃないぞ、シコりながら適当に回答したんだぞ」的な雰囲気を出してったほうが良さそうじゃない?
2020/03/23(月) 16:58:35.58ID:bf1cRh+B
Rc<T> だけを使って循環リストを作った場合、循環参照が生じます。
その場合、その循環リスト全体が誰からも参照されなくなって、つまり、不要に
なっても「循環参照問題」が起きるために自動解放できないのです。

C#やJavaでは、この循環参照問題を解決することを主目的として、
遅さを犠牲に Garbage Collection を使っています。
これは「動的解析」に分類されます。

一方、Rustの場合は静的解析だけで済まそうとしていますが、結局、循環参照問題のために
完全自動化は出来ず、解放べきメモリが解放されずに残ってしまうという現象がおきえます。
これを防ぐには、人間側が 循環リストの最後と最初を結ぶためには、weak pointer を使う
などの注意深いプログラミングをすることで防ぐしかありません。
つまり、人間の注意深さでメモリーリークを防いでいるだけです。
2020/03/23(月) 17:09:05.71ID:IXWRbkqI
都合の悪いことには誰も答えません。
2020/03/23(月) 17:35:19.10ID:FLdc410A
>>239
リークしない保証が欲しいならそういう言語 (処理系) を使えばいいじゃん。
Rust はリークを確実に排除することを保証しないし、
Rust の定義するメモリ安全にはリークの排除が含まれないことは明言されている。
https://doc.rust-lang.org/book/ch15-06-reference-cycles.html

GC を使えばメモリリークが起きないってわけでもないし、
「どのような保証を与えるか?」の線引きが違うだけで
きちんと学んできちんと使いこなさなきゃなんだって駄目だよ。
2020/03/23(月) 18:36:24.14ID:bf1cRh+B
>>241
別に駄目とは言ってません。
「静的解析でメモリ管理を自動化した。」
というのは言いすぎだと言うことです。
2020/03/23(月) 18:54:37.87ID:+m59DBar
そりゃ循環参照とかウンコード書けばの話だろ、何か問題有るのか?
2020/03/23(月) 18:56:19.36ID:y/3c+R5y
Heap=Rcだと勘違いしてんのかな?
2020/03/23(月) 19:00:04.36ID:iyDg9ARV
荒らしにかまうやつも荒らし

暇なおじいさんが各言語に難癖つけて回ってる
Kotlinの次はRust
2020/03/23(月) 19:15:41.65ID:cjB95B7K
おかしな奴に絡まれるからRustはダメ言語
2020/03/23(月) 19:16:56.45ID:FLdc410A
>>242
結局のところライフタイムは人間が書くし、それを元にいくらかのチェックと推論をするだけ。
今まで自動化できてなかった分 (の一部) を新しいやり方で自動化したってだけのことで、
何もかも自動でやってくれるような最強解析能力を持ってるなんて誰も言ってないよ。
ストローマン論法はやめろよな。

もう一度書くけど、 Rust のシステムはメモリリークの排除を目的にしていない。
2020/03/23(月) 20:19:04.31ID:kJWIzarl
藁人形クッソ抜ける?
2020/03/23(月) 21:49:49.89ID:urYmb4Ir
リソースの開放をプログラム内で完璧にやろうとせずに
プロセスの再起動とかの水準で考えてしまえばいいこともあるかもね
2020/03/23(月) 22:15:27.45ID:0TZC4jF8
メモリ以外のリソース回収に関してはGCよりRust(あるいはC++のスマポ)がはるかに優秀なんだよな。
Rustに慣れると他言語でusingとかするのが面倒になってくるし、ついつい付け忘れて困る。
2020/03/24(火) 00:09:09.52ID:PY48eDSf
Kotlinスレでnullポインタの方が良いと
荒らしてたのと同一人物だったのか
2020/03/24(火) 02:50:53.94ID:T0vrM+QL
体制側と違う意見は大事。
自分の頭で考えない人は、効能書きや権威やネットで書かれたことを鵜呑みにしてしまう。
253デフォルトの名無しさん
垢版 |
2020/03/24(火) 10:04:19.30ID:cgACDOV9
メモリ以外のリソース回収なんてむしろなくね
2020/03/24(火) 10:37:53.99ID:1n+V7cka
いやファイルポインタ、コネクション、スレッドなどいくらでもあるだろ。
2020/03/24(火) 12:20:20.31ID:T0vrM+QL
>>250
こんな出てきたばかりの言語に慣れてる人なんているかい。
2020/03/24(火) 12:43:11.53ID:I6AqzmeH
ファイルハンドルくらいならusingでもいいけど、デバイスコンテキストみたいな微妙に寿命が長いのが困る。
Disposeとか呼び忘れても大抵GCが回収してくれてぱっと見動くけど、
時々回収してくれなくて再現性の低いバグになるとか。
2020/03/24(火) 14:22:30.48ID:T0vrM+QL
Box<T>のソースを見ていたら、Box::new が次のような1行だけのソースで、
box キーワードを調べてみたら、組み込みの Box::new の実装とだけしか
情報がない。つまり、ソースがあるようで実質的には無い:
impl<T> Box<T> {
 pub fn new(x: T) -> Box<T> {
  box x
 }
}


同様に Vec<T> のソースを見ていたら、RawVec なるものが出ていて、
RawVecのソースもあったがそこで、core::ptr なるものが使ってあり、
そのソースはないようだ。

Cにとってかわるシステム言語と言いながら、本質的には組み込み関数ばかりで
ソースを追っていくことができない。
Cは最初から理解できて、このような闇が存在しないので、高級アセンブラであり、
システム言語であった。
Rustにはその代わりは務まらないのではないか。
2020/03/24(火) 14:31:46.69ID:e2obE13Z
ツッコミどころ満載だけど
荒らしの相手したら負け
259デフォルトの名無しさん
垢版 |
2020/03/24(火) 14:40:33.66ID:JQ7YmFwi
正しく
怖がる
260デフォルトの名無しさん
垢版 |
2020/03/24(火) 14:43:56.87ID:oKMcqgHf
巨大学術掲示板群 - アルファ・ラボ
ttp://x0000.net

物理学 化学 生物学 数学 天文学 地理地学
IT 電子 工学 言語学 方言 国語 など
2020/03/24(火) 14:44:12.30ID:T0vrM+QL
Rustは概念が整理されてない。
Cは、ポインタという概念さえ理解すれば(そしてそれは、プログラミングに適性が有る人にはそんなに難しいわけではない)、それだけを頼りにあらゆるものが構築できた。
ところが、Rustはいくら学んでも終わりが無いくらい基礎の部分が難しい。
Box<T>が何をやっているかは、自然言語で説明されるばかりで肝心の
コードも擬似コードもなかなか見つからない。
2020/03/24(火) 15:04:27.63ID:T0vrM+QL
Box<T>のデストラクタである所の Drop trait の drop 関数を調べてみると、
次のようになっており、compilerの埋め込み処理というコメントになっている。
恐らく、Box<T>が削除される際にコンパイラが何らかの処理を入れているが、
ソース中には書いてない。
こんな状態で Cの後釜を名乗ってほしくない。

unsafe impl<#[may_dangle] T: ?Sized> Drop for Box<T> {
  fn drop(&mut self) {
    // FIXME: Do nothing, drop is currently performed by compiler.
  }
}
263デフォルトの名無しさん
垢版 |
2020/03/24(火) 15:45:47.44ID:noFaRAc6
>>257
それは悔しいけどちょっと理解できる
コンパイラーのソースみるとcompiler builtinで見れないやつとかあるし
いや、どこにあんねんと
2020/03/24(火) 16:11:12.01ID:T0vrM+QL
Option<Box<T>> で、Some(Box::new<xxx>)
とした場合に、どういう状況の時に このメモリが解放されるのか、
その仕組みも分かりにくい。
2020/03/24(火) 16:46:57.83ID:T0vrM+QL
>>264
誤: Some(Box::new<xxx>)
正: Some(Box<T>::new(値))
2020/03/24(火) 17:02:53.60ID:SD2kTFQw
なんぼ間違えんねん落ち着けや
2020/03/24(火) 17:20:04.56ID:T0vrM+QL
Rustでの代入記号は、i32/f32/bool/str などのprimitive型以外は原則的に copy動作
ではなく、move 動作のようなもので、所有権の移動が発生する。
例外は、Copy traitsが実装されている型の場合で、その場合も copy動作になる。

Option<XXX>は、Copy traitsが実装されているらしく、Optionが他動詞で代入記号
を使うと、copy動作になるらしい。
ただし、これは文書で明確には述べられてないのでよくわからない。
根拠は、Optionのソースは以下のようになっていて、#[derive(Copy, ...)]の部分が、
Copy traitsを自動実装する、という意味になるらしいからだ:

#[derive(Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)]
#[rustc_diagnostic_item = "option_type"]
#[stable(feature = "rust1", since = "1.0.0")]
pub enum Option<T> {
/// No value
#[stable(feature = "rust1", since = "1.0.0")]
None,
/// Some value `T`
#[stable(feature = "rust1", since = "1.0.0")]
Some(#[stable(feature = "rust1", since = "1.0.0")] T),
}
2020/03/24(火) 17:21:21.85ID:T0vrM+QL
>>267
誤:Optionが他動詞で
正:Option型同士で
2020/03/24(火) 17:31:35.81ID:UBy3gEYu
>>263
compiler builtinはコンパイラのソースの中にあるよ

コンパイラのソースでcompiler built-inは見たこと無いけど
270デフォルトの名無しさん
垢版 |
2020/03/24(火) 18:30:07.73ID:le7GgsxJ
>>278
ないよ
https://github.com/rust-lang/rust/blob/master/src/libcore/macros/mod.rs#L1196-L1200
https://doc.rust-lang.org/src/core/macros/mod.rs.html#1146-1150
271デフォルトの名無しさん
垢版 |
2020/03/24(火) 18:46:17.48ID:8wuqSfIx
汽車 汽車 チンポ チンポ
シコシコ チンポッポ
チンポを出して シコシコ チンポッポ
2020/03/24(火) 19:01:03.96ID:SD2kTFQw
>>278
期待してるぞ
2020/03/24(火) 23:11:28.78ID:UBy3gEYu
>>278
それコンパイラのソースじゃないよ
2020/03/25(水) 01:18:57.46ID:COJzGufp
Rustは、コンパイラ時エラーに悩まされる反面、実行時エラーに悩まされるのを減らす
などと言われる。
しかし、コンパイル時エラーが出ると言うことは、裏を返せば、書けないアルゴリズムが存在するということだ。
直感的ではない回りくどい書き方が必要となり記述量が多くなる。
他の言語では好きな書き方が出来て、それはどれも正解だが、Rustでは正解が非常に狭くなる。
正解が狭いことがエラーを減らすなどという人がいるが、実際には、Rustは
書けるアルゴリズムが狭い、と言うことなのである。
これは言語設計の問題である。

なお、ここで言っているアルゴリズムは、全体的なものではなく、細かいミクロ的なものである。
通常の言語では、1つの仕事を細かい変数の使い方まで含めれば数万通り以上に書けるだろう。
そして、そのどれもが正解であり、結果が正しくバグも無いのだから、内のどれかが悪い書き方という
ことは特にない。
ところが、Rustでは、その大部分の書き方が出来ないのである。
駄目だから敢えてできなくしているのではなく、Rustが設計上、書けないアルゴリズムがあるということに他ならない。
つまり、Rustは書けるアルゴリズムが、本来コンピュータが書けるアルゴリズムの内の、非常に狭いサブセットに限られてしまうということである。
これは、Rustの大きな欠陥である。
2020/03/25(水) 01:25:39.41ID:COJzGufp
>>274
「駄目な書き方だからエラーにしている」
と言うのは間違いで、正しくは、
「Rustコンパイラの静的解析能力では、書き方を非常に限定しないと
 正しいことを保障できなかったり、自動化できなかったりするため、
 しょうがなく狭い書き方しか出来なくしている」
と言うことに他ならない。
人間には脳内の静的解析で明らかに正しいことが分かる書き方でも、
Rustコンパイラではでは同じことができないため、敢えて
変数束縛、借用、単一参照など、コンパイラでも解析できる程度の
範囲に書き方を限定して無理やり人間のプログラミングの可能性を
狭めているに過ぎない。
2020/03/25(水) 01:26:44.15ID:atIoOIeM
コピペじゃなかったのか…ウケるw
277デフォルトの名無しさん
垢版 |
2020/03/25(水) 07:56:19.45ID:B3ciLpqT
みんなドキュメントコメントで日本語も一緒に書くときってどうしてる?
こんな連ねた感じでいいのかな?
/// Returns a Person object
/// Personオブジェクトを返す
2020/03/25(水) 08:01:15.06ID:ukHBAVn8
例が悪いわ。
そんな糞コメント書くな、になってしまう。
2020/03/25(水) 08:57:55.31ID:3gLrCiKq
>>278
期待を裏切りよって
2020/03/25(水) 09:06:21.89ID:99YP/w74
言いたいことも言えないこんな世の中じゃポイズン
2020/03/25(水) 11:14:11.00ID:mufeRxy0
Cからprintln使ってるRustの関数呼ぶとメモリリークしよる(´・ω・`)
2020/03/25(水) 12:42:04.62ID:gIHmoeQz
>>277
それコメントの意味なくね?
2020/03/25(水) 14:08:14.89ID:rak19Gqk
>>277
Personオブジェクトを返すって
-> Person
-> Box<dyn Person>
どっちのこと?
284デフォルトの名無しさん
垢版 |
2020/03/25(水) 16:36:38.82ID:6bd+J6i5
今だにCopyトレイトの命名は失敗だと再確認する
2020/03/26(木) 02:55:12.87ID:q1LILc/b
Box<T> は copy ではなく move なんだとさ。
2020/03/26(木) 02:58:28.01ID:q1LILc/b
>>267
Option<T> は、Copy。
Box<T> は、Move。
だから、
Option<Box<T>> は、外側が Copy で、中身が Move らしい。
2020/03/26(木) 03:37:08.94ID:lC9OKNgA
中身がCopyのときだけOptionもCopyになるんじゃないの??
2020/03/26(木) 03:46:23.72ID:2WcXgaRB
>>287
分からない。
2020/03/26(木) 03:48:11.78ID:2WcXgaRB
>>285
ソースを示しておくと、以下の公式(?)サイトに、
「because Box isn't Copy」という言葉が書かれている:
https://doc.rust-lang.org/nomicon/checked-uninit.html
2020/03/26(木) 04:59:35.60ID:2WcXgaRB
struct のメンバに local 変数を代入した場合、エラーになる?
2020/03/26(木) 12:36:34.09ID:Rq1Q9bYl
https://doc.rust-lang.org/std/option/enum.Option.html#impl-Copy

impl<T> Copy for Option<T> where T: Copy {}
2020/03/26(木) 14:56:26.41ID:RidRralQ
>>291
それは >>267 とちゃんと整合しているな。
Option<T>は、Copy と Cloneの両方が実装されていると言うことで、
ならば、原則論からすればOptionは代入演算子でMove動作「ではなく」Copy動作
だということになる。
2020/03/26(木) 15:33:44.04ID:5np4UAxw
>>292
>ならば、原則論からすればOptionは代入演算子でMove動作「ではなく」Copy動作
は?
where T: Copyって書いてるやん
オレオレ原則論書き散らかして荒らすのやめてくれ
2020/03/26(木) 17:17:35.74ID:mwwmClxG
c++の代替というけど、rust理解するにはc++でメモリイメージ固めた方が学習速いんじゃねーの?
2020/03/26(木) 18:48:36.88ID:Rq1Q9bYl
>>292
Optionは型ではない
Option<T>は型
区別してくれ
2020/03/26(木) 21:50:13.71ID:HC2i5ubn
ML系列の記法に慣れるとrustがどうしてalgol系列の記法にしたのか納得できなくなる。どんだけカンマ打たせるねん。
少し頑張れば関数の型も推論できると思うんだけど人まかせにしてるのが好きじゃない。せめて、勝手に挿入できるような記法にしとくべきだったと思う
297デフォルトの名無しさん
垢版 |
2020/03/27(金) 00:25:53.78ID:GUIIkCWN
インスタンスでフィールドアクセスにカンマ使わない場合どんなのがいいの?

推論は関数で境界作りたかったんでしょ
298デフォルトの名無しさん
垢版 |
2020/03/27(金) 00:33:57.86ID:GUIIkCWN
>>282
日本語のコメントはどう書くだけなのか聞きたかったから特に意図はない例だよ

>>283
完全な例だからあれだけどBoxではない
struct Person {
name: String,
}

impl Person {
pub fn new(name: &str) -> Self {
Self {
name: name.to_string()
}
}
}
2020/03/27(金) 00:47:04.38ID:4wGUX1E+
型推論の能力的には関数も全部できるけど、ドキュメント目的であえてしてないはず。
2020/03/27(金) 01:16:32.86ID:xxRyEnpG
TypeScriptは戻り値の型を省略できるけど、書かないと訳が分からなくなるので言語的には省略出来てもコーディングルールで強制してるわ
Cみたいに変数宣言含めて型を全部書くのも面倒だけど、行き過ぎた省略もメンテナンス性を損なうと思う
2020/03/27(金) 03:32:10.02ID:xTSSnKrR
>>296
どういうカンマの事?
302デフォルトの名無しさん
垢版 |
2020/03/27(金) 15:34:02.04ID:9RtDMjhb
C/C++に疲れた人が使って幸せになれるのがRustだと思ってたけど
実態は全然違うってことか
2020/03/27(金) 17:00:38.31ID:pa89frlH
C++17に疲れた人なら結構幸せになれるんじゃない。
C89に疲れた人だと厳しそうだが…。
304デフォルトの名無しさん
垢版 |
2020/03/27(金) 18:51:24.66ID:JRwFCn2R
RustのコンパイラソースをCloneしてそれをベースに名前も違うプログラミング言語作るのってライセンス的にどうなの?
rustcの構文解析の部分を変えてからそのrustcも全部その言語に変換したいんだけど
2020/03/27(金) 18:57:46.96ID:VaiYZBCN
>>304
そういう考えだから、人を馬鹿にするんだな。
ちょこっといじっただけの癖に全体を自分が造ったみたいな態度をとる。
2020/03/27(金) 19:49:39.79ID:oRj/lH5B
>>299 あえてやらないなら、せめてコンパイラが推論した結果を教えてくれよと思う
この処理のこの部分だけ一旦切り出して別の処理にしてみたい、とかやるときにすげー大変

Haskellでも型表記は省略できるけどしない方が良いねって作法がメジャーなのは知ってるけど、型推論でサポートしてくれるからrustよりストレス少ない
ちょいとクロージャを関数として外に出しとこう、とか、ここ切り分けて別パターン用意して比較してみよう、とかやるのが面倒くさい

あ、まずクロージャにして型エラーを起こして教えてもらう、とかやればできるんかな…
2020/03/27(金) 19:59:43.89ID:Pf+eY36z
>>306
型を自分で書くのが面倒なときは()とかi32とか適当な型で埋めておいて、エラーメッセージから正しい型を持ってくるというのはありだよ。
(逆に言えば正しいエラーメッセージを出せるということは、関数プロトタイプまでちゃんと型推論できているということでもある)
2020/03/27(金) 21:21:00.05ID:aLfv28Wa
関数の型を推論するのを捨ててるから
Deref coercionだったりFrom/Intoだったり中身を書くときに型を省略できるんじゃないの?

owned/shared/mutの違いに加えてlifetimeもあるから
それらも含めて推論することになると現実に使えるレベルになるのかどうか怪しい
少なくとも現時点で注力するようなポイントじゃないと思う
2020/03/27(金) 22:30:46.16ID:TRjL1ru9
>>304
ライセンス的にも道義的にもなんの問題もないんで、ぜひ面白言語作ってくれ。
Rust/Cargoの名前やロゴ使うと商標権には引っかかるのでそこだけちゃんと変えてればOK。
310デフォルトの名無しさん
垢版 |
2020/03/28(土) 02:49:23.51ID:7+pamnWR
>>309
コミットも常に最新を本家からチェリーピックして最新機能とか享受大丈夫?
道理的に叩かれそうじゃない?
2020/03/28(土) 09:49:38.92ID:laMmnOq7
HACK言語の成り立ちを参考にしたら
答えが見えてくるかもしれないよ
2020/03/28(土) 19:16:01.84ID:9p87l6KY
WebKitとBlinkみたいな感じでしょ?へーきへーき
2020/03/28(土) 20:00:00.22ID:KbJ2BCU2
githubのissueのタグで頭についてるE-easyとかT-compilerみたいな大文字のアルファベットってどういう意味があるの?
2020/03/28(土) 21:27:53.53ID:+WXFsbEZ
>>313
https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.md#issue-triage
2020/03/28(土) 21:34:01.64ID:+WXFsbEZ
>>310
ライセンス的には問題ない
道義的にはライセンス踏襲してRustを元にしてるよって書いとけば問題無いと思う
316デフォルトの名無しさん
垢版 |
2020/03/29(日) 13:50:06.97ID:c6UG4oSX
この引数に&つけるのって
iter.map(|&i| i * 2)
これと同等?
for i in iter {
let i = &i;
}
317デフォルトの名無しさん
垢版 |
2020/03/29(日) 15:02:02.33ID:sFvWmixp
巨大な学術掲示板群 アルファ・ラボ
ttp://x0000.net

物理学 化学 生物学 数学 天文学 地理地学
IT 電子 工学 言語学 方言 国語 など
2020/03/29(日) 15:16:29.91ID:u3wksM39
>>316

let &i = i;
319デフォルトの名無しさん
垢版 |
2020/03/30(月) 03:34:27.53ID:QPHAwv8T
>>318
let i = 1;
let &i = i;
これだとコンパイル通らないよ
2020/03/30(月) 03:44:28.46ID:Oymj8mf6
記法の問題で、>>318は、C++ と勘違いしたんでは。
Rustだと
let i = 1;
let j = &i;
が正しいはず。
2020/03/30(月) 03:57:10.09ID:Oymj8mf6
iter.map(|i| i * 2)
と書いた場合、|i| i * 2 の部分は、closure や Lambda expression, lambdas
と呼ばれるものなんだろうけど、|&i| と書く形式はなかなか検索では出てこない。
2020/03/30(月) 04:01:22.73ID:/1SwYHDd
>>318が書いてるの合ってると思うけど?
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=6d886f2d3b944871c18856f0e19da71c

iterがshared referenceをイテレートするから
パターンマッチで`&`を1枚剥がした型にして使ってる
for &i in iterと同じ
2020/03/30(月) 04:40:37.32ID:Oymj8mf6
>>322
ところで、
let &x = y;
ってどういう意味ですか?

let y:i32 = 5;
let x:&i32 = y;
とは違うんでしょうか?
2020/03/30(月) 04:45:30.74ID:Oymj8mf6
誤: let x:&i32 = y;
正: let x:&i32 = &y;
2020/03/30(月) 11:38:27.40ID:/1SwYHDd
>>323
左辺に代入する時にパターンマッチ使ってDestructuringしてる
例えばyが&i32ならxはi32になる

let i = 1;
let &i = i;
これがコンパイル取らないのは
右辺がintegerで左辺がreferenceを要求しててマッチしないから

let i:i32 = 1;
let i = &i;
let &i = i;
let i:() = i;
↑こうやって試せば3行目の&iへの代入でiが&i32じゃなくi32になってるのが分かる
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=1d23370e99b388e2205c43e863885315
2020/03/30(月) 14:27:14.40ID:Oymj8mf6
>>325
let i:() = i;
はどういう意味でしょう。
2020/03/30(月) 14:34:27.40ID:yinACqvq
>>326
C で言う void みたいなもんだよ。
あり得ない型を指定してエラーメッセージを出させたら
メッセージに右辺の側の型も表示されるという
型確認のテクニック
2020/03/30(月) 15:23:14.22ID:/1SwYHDd
1.38からはstd::any::type_nameがstabilizeされてるので
エラーメッセージやnightly使わずに変数の型をprintして確認できるみたい
(consumeしないようにreferenceで渡すから少し分かりにくいかもだけど)

fn type_of<T>(_: &T) -> &str {
std::any::type_name::<T>()
}

fn main() {
let i = 1;
let i = &i;
let &i = i;
println!("{}", type_of(&i));
}

type_name_of_valってのも追加されてるけど
こっちはまだstabilizeされてない
2020/03/30(月) 16:45:46.87ID:Oymj8mf6
>>327
なるほど。貴重なテクニック有難うございます。

>>328
それを使えば構造体(?)や参照型などの lifetime も表示できますでしょうか?

何か lifetimeを確認する方法をご存知の型がいらっしゃればご教授頂ければ幸いです。
2020/03/30(月) 18:21:13.55ID:/1SwYHDd
>>329
聞く前に試せばわかるよね
331デフォルトの名無しさん
垢版 |
2020/03/30(月) 18:43:59.32ID:QPHAwv8T
/1SwYHDd氏やるなぁ
こういう細かいことまで知ってる人のRust歴気になる
2020/03/31(火) 00:49:28.04ID:bdtzxXSI
さっきオナラしようとしたらウンチが少し出てしまったんだけど
ばれてないからいいよね ごめんね
2020/03/31(火) 03:36:52.65ID:Hb9bQaKd
在宅だったら放屁は自由
2020/03/31(火) 13:51:38.31ID:Ow5tuxOJ
う〜ん。 ちがうなぁ。
2020/04/01(水) 05:04:17.87ID:2vQ3PjhV
やりたいこと
Optionからの安全な値の取り出しを構文レベルで保証、およびNone時に数行の処理と戻り値を伴う正常の早期returnをしたい

if Some(v) = foo.get() {
安全に取り出せるがネストが嫌すぎる
} else {
位置が遠すぎる
}

let v = if Some(v) = foo.get() {
v        安全取り出しだが冗長すぎて嫌
} else {
}

let v = match foo.get() {
Some(v) => v    安全取り出しだが冗長すぎて嫌
None => { }
}

if foo.is_none() {
構文で保証されずプログラマの注意力次第で嫌すぎる
}
let v = foo.get().unwrap();

let v = foo.get().ok_or_else(||{
は?正常終了つってんだろが?エラー値で返すんじゃねえよバカか?
})?;
2020/04/01(水) 08:10:52.28ID:3tt/1DhK
let v = foo?;
2020/04/01(水) 08:19:02.46ID:2vQ3PjhV
は?
2020/04/01(水) 09:19:54.63ID:yrAQuZWY
構文を調整したいならマクロじゃない?
let v = safe_get!(v, {
失敗した
return Ok (());
});
みたいな。ベタ書き以外でearly returnしたいならマクロか?演算子みたいにコンパイラサポートがいると思う。
339デフォルトの名無しさん
垢版 |
2020/04/01(水) 10:13:55.16ID:0Fs3VJge
なんでboolって1byteあるの?
340デフォルトの名無しさん
垢版 |
2020/04/01(水) 11:20:10.79ID:5VJq6KKK
C は bit field あるのにな
2020/04/01(水) 11:25:37.12ID:qjrNWUcZ
>>335
map_or_elseでSomeの時とNoneの時に適用するクロージャを渡せる
でもどうしても1行で書きたいとかchainしたい場合じゃなければ普通にmatchかif-else使うな

fn foo(){
get().map_or_else(|| bar(), |x| baz(x))
}

fn foo(){
match get() {
None => bar(),
Some(x) => baz(x)
}
}

https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=dd9040426e54f1dfc6e39d07bbd219fb
2020/04/01(水) 11:30:33.60ID:eoE2gHM2
>>341
クロージャ渡しじゃearly returnできないって話では?
2020/04/01(水) 12:21:13.46ID:qjrNWUcZ
>>342
んん?
map_or_elseの結果戻せばいいんでは?
2020/04/01(水) 13:43:58.79ID:npfcBiID
>>343
それはearly returnって言わなくない?
そりゃ結果は同じだけど、元の人は構文的なことを言ってるわけで。
345デフォルトの名無しさん
垢版 |
2020/04/01(水) 14:12:02.37ID:Wuhu+msT
ネストが嫌なんだから無理でしょ
ネストしないコードを書く人なんだろうけど
2020/04/01(水) 17:06:40.66ID:qjrNWUcZ
>>344
なるほど理解した

どうしてもearly returnがしたくてunwrapも嫌なら
if letを2回やるか、is_none+if let Someでもいい気がする
マクロ書いてもidiomaticな形に比べて読みやすくなるかっていうと微妙なので

fn foo(x: &str) -> Result<()>{
let v = safe_get!(get(x), { …; return Ok(()) });
let v = baz(v)?;
qux(v)?
}

fn foo(x: &str) -> Result<()>{
if let Some(v) = get(x) {
let v = baz(v)?;
qux(v)?;
}
Ok(())
}
2020/04/01(水) 19:39:22.27ID:2vQ3PjhV
"処理と戻り値"を伴う""正常""の早期returnをしたいといってるだろがErrでラップして返すとかバカか?

こういうSomeから取り出すだけの部分が冗長だから消えてなくなれつってんだよ
is_none()でやるのは構文保証ではなく"プログラマーの注意力"による保証だからクソだつってんだよ

let v = match foo.get() { Some(v) => v, None => {
bar.modify();
baz.modify();
return Ok(bar, baz);
}};

let v = if let Some(v) = foo.get() { v } else {
bar.modify();
baz.modify();
return Ok(bar, baz);
}};
2020/04/01(水) 20:41:14.76ID:SX13wyIA
>>347
だからその冗長な部分はマクロで潰せと言ってるんだが。
マクロが嫌なら無理としか言いようがないが。
2020/04/01(水) 20:49:40.54ID:/Onfa91A
宣言的な書き方の基本が分かってないんやろな
Rust以前のレベル
2020/04/01(水) 21:05:02.98ID:SX13wyIA
これだな。
https://docs.rs/ward/2.1.0/ward/
2020/04/01(水) 21:36:42.23ID:SEIF3iTR
言語としても長い間議論があったみたいだけど、まとまらなかったみたいね
https://github.com/rust-lang/rfcs/pull/1303
2020/04/01(水) 21:36:47.02ID:qjrNWUcZ
>>347
>"処理と戻り値"を伴う""正常""の早期returnをしたいといってるだろがErrでラップして返すとかバカか?

えっ、 Errでラップして返してる?

まぁそれはいいとしてearly returnだけじゃなく
戻り値の型と取り出した値をどうするかをセットで考えてないから
そうなっちゃうんだと思うよ
2020/04/01(水) 22:01:23.20ID:SX13wyIA
RFCざっと見てきたけど、あっちでも
「map_errでいいんじゃ?」「return;できねーよ」ってやってるな。
そんなに難解なリクエストでもないと思うんだが。
354デフォルトの名無しさん
垢版 |
2020/04/01(水) 22:20:38.50ID:0Fs3VJge
fn check<T>(mut f: impl FnMut(T) -> bool)

fn check<T, F>(mut f: F)
where F: FnMut(T) -> bool
って同意義ですか?
2020/04/02(木) 03:46:30.54ID:0zdT1xZ7
>>354
恐らくだけど、前者は必ずその関数を定義する。
後者は、Fがその型の場合にのみその関数を定義する。
2020/04/02(木) 03:48:18.19ID:0zdT1xZ7
なお、このような場合の whereは、日本人感覚からすれば、ifと読み替えてもいい。
357デフォルトの名無しさん
垢版 |
2020/04/02(木) 05:35:03.07ID:zwgg3bUK
前者の場合 check::<T, F>() でコールできるが後者はできない
358デフォルトの名無しさん
垢版 |
2020/04/02(木) 17:07:56.47ID:SaXsz2/b
前者と後者が逆?
2020/04/02(木) 20:28:06.36ID:7RFFBbbD
これ
https://docs.rs/try_or/0.2.0/try_or/macro.try_opt_or_else.html
Unwraps an Option. If the result is None, calls the function $or_fn and returns its result.
360デフォルトの名無しさん
垢版 |
2020/04/02(木) 21:53:44.49ID:zwgg3bUK
>>358
逆にだったすまん
361デフォルトの名無しさん
垢版 |
2020/04/02(木) 23:30:20.89ID:SaXsz2/b
そもそもcheck::<T, F>()じゃ引数渡してないから呼び出せなくない? 試してないけど
2020/04/03(金) 00:13:24.70ID:RIPEgpHK
構文で解決すべきところを皆が俺俺マクロで解決して統一感ない状態を生むのが良いと考えるやついるのか?
363デフォルトの名無しさん
垢版 |
2020/04/03(金) 00:44:31.97ID:11HfTHW1
if foo.is_none() {
シンプルにこれでいいと思うんだが...
これぐらいの細かい挙動で構文拡張しろとかマクロ書けとかなったらC++みたいになっていくのが目に見えるしから嫌だわ
しかもこんな嫌だ嫌だ言ってて質問する立場なのにこんな逆ギレもしてて救いようがない
2020/04/03(金) 00:44:38.25ID:8O7qKRUc
現状は335が冗長と言う状態で統一されてるんだからいいんじゃないの。
その冗長さをどうしても許容できない人は(少数派である以上)マクロで解決するしかないし、もし大多数が賛同できる新構文を思い付いたならRFC出せばいい。
365デフォルトの名無しさん
垢版 |
2020/04/03(金) 14:52:15.88ID:11HfTHW1
test bench_test ... bench: 111,111 ns/iter (+/- 11,111)
ベンチマークの +/- ってどういう意味?
366デフォルトの名無しさん
垢版 |
2020/04/03(金) 15:47:04.36ID:uTu5qR57
>>363
is_none()は==NULLや==nilと同じ書き忘れのリスクを伴う"プログラマの注意力"を消耗するだけのゴミだろ
2020/04/03(金) 17:29:34.32ID:q/cvlU88
>>365
サンプルのmax - min
https://github.com/rust-lang/rust/blob/master/src/libtest/bench.rs#L57

min, maxは上下5%の外れ値処理をした後のものみたい
368デフォルトの名無しさん
垢版 |
2020/04/03(金) 19:54:55.15ID:CGYa3yhA
if letやmatchにしないとSomeだったときの処理書けないしょ
2020/04/03(金) 23:35:51.11ID:gSdeIOHU
最近勉強し始めたんだけどムズすぎ😭
2020/04/04(土) 00:07:28.35ID:cnL2FB3T
rust実用化に成功したプロジェクトって何があるの?お前らの会社では成功してるの?
2020/04/04(土) 00:29:58.91ID:hnhE9+15
実用化って何
2020/04/04(土) 01:42:27.61ID:R4+HYdkE
rustで作ったメカの中でセックスしましたみたいな
373デフォルトの名無しさん
垢版 |
2020/04/04(土) 04:16:29.04ID:aJleCvsu
use chrono::{Utc, TimeZone};
assert_eq!(Utc.ymd(2015, 5, 15).to_string(), "2015-05-15UTC");
なんでこれって静的メソッドじゃないのにself省略で使えるんですか?
https://docs.rs/chrono/0.4.11/chrono/offset/trait.TimeZone.html#method.ymd
374デフォルトの名無しさん
垢版 |
2020/04/04(土) 08:43:05.69ID:ziV4A0+Z
Utcはフィールドを持たないstructだから
イメージ的にはUtc{}.ymdとしているかんじ
2020/04/04(土) 11:37:00.81ID:oHbtMe0Y
Unit-like structsってやつだね
376デフォルトの名無しさん
垢版 |
2020/04/04(土) 16:49:30.52ID:aJleCvsu
公開されていないLoopStateっていうenum使いたいんですけどコンパイラーオプションとか属性とかで使う方法ありませんか?
https://doc.rust-lang.org/src/core/iter/mod.rs.html#371-422
2020/04/04(土) 17:26:12.04ID:9lNQDQEm
pub が付いてないものをそんなに簡単に使えたらモジュールの意味がないやろ……。
2020/04/04(土) 17:26:43.72ID:9lNQDQEm
そのモジュールをコピペして新しいモジュールを作れば自由に出来るんとちゃう?
2020/04/04(土) 20:00:52.19ID:BQ+xJjAs
Docs.rsのメソッドの引数の見方がわからん
具体的には
https://docs.rs/image/0.23.2/image/struct.Frames.html
pub fn new(iterator: Box<dyn Iterator<Item = ImageResult<Frame>> + 'a>) -> Self
2020/04/04(土) 20:42:49.37ID:oHbtMe0Y
iteratorを受け取ってSelfを返す。
iteratorは各要素がImageResult<Frame>のもの

Box<dyn …>してるのはコンパイル時にTrait ObjecのSizeが決まるようにするため
(Generics使えば不要)

‘aはiteratorのlifetimeをSelfのlifetimeにするため
2020/04/04(土) 22:54:06.10ID:BQ+xJjAs
>>380
解説ありがとう
上二行は理解できたんだが他がイマイチ・・・
2020/04/05(日) 10:19:35.11ID:LNp8foc9
>>381
dyn は C++ で言う抽象クラスみたいなもんだよ。
トレイトオブジェクトというのは実際にはそのトレイトを実装している様々な型の可能性があって、
それら全てを格納可能な大きさはわからない。
Box は C/C++ でいうポインタみたいな用途で使われる。
大きさがわからなくてもオブジェクトの場所を指すことは出来る。

「そのトレイトを実装している型ならなんでも」と「そのトレイトを実装している型のいずれか」というのは違う意味で、
ジェネリクスは後者。
言い換えると、実行時にディスパッチされる多相とコンパイル時にディスパッチされる多相ってこと。
コンパイル時に型がわかるのなら大きさもコンパイル時にわかる。
大きさがわかるなら Box を経由しなくていい。

ライフタイムの 'a は Frames の型引数の 'a と同じだから、
new の返り値 (Self) の寿命は iterator の寿命と同じになる。
383デフォルトの名無しさん
垢版 |
2020/04/05(日) 11:42:45.53ID:/6aVgV0B
Boxと&dynの違いって参照元がヒープかスタックかの違い?
2020/04/05(日) 14:13:55.26ID:8bGOOvBY
>>383
そう
2020/04/05(日) 14:35:00.95ID:8bGOOvBY
>>381
大前提として変数や関数の引数や戻り値はコンパイル時にサイズが決まってないといけない

Iterator Traitを実装してる型を引数として受け取りたいからといって
`pub fn new(iterator: Iterator<…>) -> Self` と書くと
Iterator Traitのサイズがコンパイル時にはわからないのでコンパイルエラーになる
`let foo: str;`でエラーになるのと同じ

Box<dyn Trait>か&dyn Traitの形にすれば
Iterator Traitへの参照(=Trait Objectというfatポインタ)になって
受け渡しするサイズが固定されるのでエラーにならない

ジェネリクスを使って
`pub fn new<T: Iterator<…>>(iterator: T) -> Self` と書いた場合は
実際の呼び出しに使われているTの型ごとにコンパイラがバイナリを生成するので
コンパイル時にTのサイズが決まってる (impl Trait使った場合も同じ)

>>382も書いてるように前者は動的ディスパッチ、後者は静的ディスパッチなので
異なる型が混在するコレクションを使いたい時やバイナリサイズを小さくしたい時以外は
ジェネリクスを選ぶほうが一般的
2020/04/05(日) 17:53:06.31ID:fOt2g8TG
あーなんとなくわかってっきた
ジェネリクスと同じことがトレイトオブジェクトでも実現できて、その書き方がBox<dyn...>ということか
2020/04/05(日) 19:06:03.32ID:LNp8foc9
同じことって言っちゃうと語弊がある気がするなぁ。
388デフォルトの名無しさん
垢版 |
2020/04/05(日) 21:52:05.83ID:/6aVgV0B
そもそもRustはかなり型のサイズに厳しいけどなんで?
コンパイラの最適化のため?
2020/04/05(日) 22:38:29.83ID:8bGOOvBY
>>388
他言語なら暗黙的に参照として扱われるようなものも
明示的に&を付けたりBox化することを求めるから厳しく感じるんだと思う

明示的に求めるのはowned/shared/mutableの3つを
一貫性を持って区別して書くようにっていう設計選択じゃないかな

>大前提として変数や関数の引数や戻り値はコンパイル時にサイズが決まってないといけない
↑これ他言語でも常識かもしれないけど自分はRustやるまで意識したことなかったよ
2020/04/05(日) 23:09:09.40ID:/qXmUwFk
> pub fn new(iterator: Box<dyn Iterator<Item = ImageResult<Frame>> + 'a>) -> Self
入力にimpl Traitってまだ無理なんだっけ?

>>386
同じではない。
ジェネリックスはパラメトリック多相の事だから静的ディスパッチになるけどtrait objectは動的ディスパッチそのもの。

>>388
そう。
リージョンでメモリ管理するときリージョンのサイズが事前に決まるなら
リージョンはヒープじゃなくてスタックに確保できるからrustは型システムが
サイズが事前に決まる事を強制してる。
rustでは
2020/04/05(日) 23:12:44.10ID:/qXmUwFk
途中で送ってしもた。

rustでは当たり前に見えるけどこんな事してるのrustくらいでヒープが必要ならクロージャさえも自分でbox化する必要がある。
2020/04/05(日) 23:13:46.13ID:dvIeqTXE
スタック上に長さ不定のデータが作れるとバグの温床になる。
他の言語だと大体の値がヒープに乗せること前提で動いているんで気にしたことが無いのだと思われる。
C/C++でも非推奨なんだけど、初心者向け釣りサイトでは平気でやってることがあるし、できちゃうから面倒
393デフォルトの名無しさん
垢版 |
2020/04/06(月) 00:16:34.72ID:WU94L+3C
配列サイズが決められてないかつ、関数内で配列生成するけど返り値はサイズ固定のスライス記法の書き方するようにする方法ってない?
つまりはVecのアロケートが嫌な場合
fn name(v: Vec<A>) -> Vec<A> {
v.iter().map(***).collect
}

これだとスタック確保できるけど無駄なデータ入ってるし、動的なサイズの配列を返せない
fn name(v: Vec<A>) -> [i32; 10] {
let mut arr = [0; 10];
for (i, x) in v { arr[i] = x}
arr
}

こういうスライスのスタック版みたいな感じのことがしたい
fn name(v: Vec<A>) -> [A] {
let mut arr = [0; v.len()];
for (i, x) in v { arr[i] = x}
arr
}
2020/04/06(月) 00:54:32.32ID:jrbG9hxT
>>390
impl Traitは引数にも使えるよ

>>393
[A]だとサイズがコンパイル時に決まらないから&[A]か&mut [A]を返すのはできる
ただ入力がVecで長さが不定なので
出力の参照元にその長さの配列を使うのは無理じゃないかな
2020/04/06(月) 00:59:52.27ID:jrbG9hxT
あと関数内部で配列生成したら
そのlifetimeが関数内に閉じるので参照も返せないね
2020/04/06(月) 01:07:26.57ID:jrbG9hxT
やるとしたら
外側のスコープで固定サイズの配列をバッファとして作っておいて
関数ではバッファを満たして返すイメージ
2020/04/06(月) 01:16:22.32ID:FD55gb+K
C言語でいうところの if ( (c=foo()) == bar) { ...(cを使う処理)
みたいなことやりたいんですがどうすればいいですか?
fooが結構重くて2回呼び出したくないのですが、
let c = foo();
if c == bar {...
とやるしかない?
398デフォルトの名無しさん
垢版 |
2020/04/06(月) 01:49:32.44ID:JJIxYQHA
matchとifガード使えば似たようなことは出来る
399デフォルトの名無しさん
垢版 |
2020/04/06(月) 02:48:45.03ID:WU94L+3C
>>396
何かしらのライブラリでなんかないかな?
static使うぐらいなら素直にVec使うわ...
2020/04/06(月) 03:03:32.80ID:jrbG9hxT
>>397
@ bindingってのを使う

https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=b2a16356c2c790985ddd937ccc2ca826
2020/04/06(月) 04:04:37.66ID:FD55gb+K
>>398
match foo() {
c if c == bar => { .. },
_ => (),
}
こういう感じでしょうか。この場合だと記載量としてはかなり微妙ですが何かに使えそうなので覚えときます。
ありがとうございます。

>>399
今回の場合はfoo()がboolじゃないのと、barが変数なのでシャドーイングされてうまくいかないようです・・・。
if let foo @ bar = foo() { ...
みたいなことやろうとしましたがダメでした。
https://play.rust-lang.org/?version=nightly&;mode=debug&edition=2018&gist=d580f91c98f26cf52a23791489914ec3
2020/04/06(月) 22:14:10.89ID:/YOLus+e
>>390
うーん難しいな

プログラムの動作としては同じになるんじゃないのか
2020/04/06(月) 22:57:49.62ID:2RUK7fME
Vecとかのコンテナ系の使い方は大分変わるよ
例えばイベント駆動の何かを作るときには考えた方が良いかと思う
struct XEventSource {
listeners : Vec<Box<dyn Handler>>,
...
}
trait Handler { fn handle(ev: &XEvent) -> () }

impl XEventSource {
fn addLisnter(&mut self, listener : Box<dyn Handler>) -> () {
 self.listeners.push(listener);
}
fn emit(&self) -> () {
 XEvent ev = ...;
 for listener in listeners.iter() {
  listener.handle(&ev);
 }
}
}
みたいに作ると、利用者が好きに作った構造体でもHandlerをimplすればlistenersに足せる
ジェネリクスだとイベントリスナの実際の型1つしかaddできないので不便
2020/04/06(月) 23:45:59.83ID:TaQVQ6iW
>>402
実行時に型を振り分けるとなると仮想関数テーブルを辿る必要があるんで実行時コストが少し増えるよ。
(Rust では仮想関数って言わないのかな? 正確な用語がわからん。)

トレイトを実装している型を実際には一種類しか使わないのだったら、
実行時間を除けば見かけ上の動作で違いはないかもしれんな。
でも基本的にはやりたいことを出来る範囲で制約は厳しい方がいい。
間違いの検出される可能性が高まるから。

制約をどのように表現するかというのはプログラミング言語の設計においては重要なトピックで、
構造化プログラミングが提唱されたのも goto だと制御をどこへ移動するのか制約を付けられないってのがある。
さらにそれを発展させた形として型で制約を付けようってのが色々と考えられてきたし、
Rust では更にオブジェクトの寿命に制約を付けようという考えが実現された。

その関数では何ができるのか、そして「何をしてはいけないのか」ってのを考えると
Rust らしいプログラムが出来ると思う。
405デフォルトの名無しさん
垢版 |
2020/04/07(火) 08:14:23.99ID:FPXvnSDp
APIサーバーでJSON受け取るときに値の型が違ったりオーバーフローするときってどうしてる?
serde_json::from_str で構造体の属性でエラーメッセージとかつけれたらいいのにな
406デフォルトの名無しさん
垢版 |
2020/04/07(火) 15:06:01.62ID:+YUDNjw9
from_strの結果そのまま使ってるけどダメなの
シンタックスエラーとか含めると大変じゃない
407デフォルトの名無しさん
垢版 |
2020/04/07(火) 15:54:15.51ID:FPXvnSDp
海外向けサーバーだったらいいけど日本向けサーバーの場合は?
serde_jsonのエラーメッセージcustomizableじゃないから辛い
408デフォルトの名無しさん
垢版 |
2020/04/07(火) 16:02:31.28ID:+YUDNjw9
serde_json::Error を見ると行と列と大雑把な原因はとれるみたい
細かくやるなら置換するしかなさそうだね
409デフォルトの名無しさん
垢版 |
2020/04/08(水) 10:01:13.64ID:qyTF9Er6
reached the configured maximum number of stack frames
でスタックフレームの制限にかかるんだけどオプションとかで変えれる?
410デフォルトの名無しさん
垢版 |
2020/04/11(土) 23:13:20.24ID:EhWtF4tX
impl<'_, T> Drop for std::collections::vec_deque::Drain<'_, T>
こういう風にちゃんとパス書かれたのもあれば、デフォルトインポートされてないのに省略されてる型あるけどどうなってるの?
https://doc.rust-lang.org/std/ops/trait.Drop.html
2020/04/11(土) 23:59:49.19ID:Ni1vKiQd
フルパス書かなくてもいいように
mod.rsに指定されてるものとされてないもの
2020/04/12(日) 23:38:47.63ID:dFThPQBr
クロージャの再帰呼び出しってできないんですか?
2020/04/13(月) 09:02:25.60ID:45YCco/F
それが必要な理由は?ここはお前の便利帳じゃねーんだから
有益な使い方が有れば紹介してから聞け
2020/04/13(月) 10:22:01.83ID:6kXZCaEk
>>412
Yコンビネータ

Rust で適切に型がつけられるかどうか知らんけど
2020/04/13(月) 11:59:07.30ID:WFzH9Pd8
>>413
データ入ったVecと各種定数とメモ化用のmutなHashMap使ったDFSするときとか、引数がむっちゃ長くなるんです

>>414
全然わからんのであきらめます・・・
416デフォルトの名無しさん
垢版 |
2020/04/14(火) 07:17:51.31ID:WrIQImmd
Copyでの関数呼び出しとポインタ作成ってコスト的にはプリミティブのどの型からが処理重い?
ここらへんCSの知識ないからわかんない
2020/04/15(水) 02:35:11.54ID:rawye3jg
Rust仕事で使ってる人〜
ウチはコロナの影響でプロジェクト吹き飛んだよん( ;∀;)
2020/04/15(水) 02:44:45.60ID:hMxv+37E
あらら(´・ω・`)
2020/04/15(水) 05:30:29.65ID:SZSUFLJC
組み込みで試験的に導入したけどムズイ
まあ慣れの問題もあるのだろうけど
2020/04/15(水) 21:10:37.56ID:mcKFmUGe
組み込みでrustに似た言語。ATS2が。
421デフォルトの名無しさん
垢版 |
2020/04/15(水) 21:11:58.85ID:60TKpqE+
Nimは?
2020/04/15(水) 21:27:25.14ID:8I3eMZIA
ATS2ってRust以上にドキュメントが少なくてHaskell以上に難解なアレじゃないですかやだー!
2020/04/15(水) 23:28:51.38ID:hMxv+37E
やだー!
424デフォルトの名無しさん
垢版 |
2020/04/16(木) 09:03:49.64ID:YGIESbh5
Rust界隈で一番貢献度高いのってAlexとかになるかな?
2020/04/17(金) 14:41:30.42ID:SjHnVlOc
Microsoftに期待してるんだが今はそれどころじゃ無さそう
2020/04/18(土) 00:35:43.07ID:Dq0Xmd2Y
Alexは人の話聞けっていう
2020/04/18(土) 07:35:23.99ID:mN+EtaBg
これはいずこへ
https://doc.rust-lang.org/1.1.0/std/slice/struct.Permutations.html
2020/04/18(土) 15:23:13.66ID:8wM3wY+l
勉強がてらこちらの二分探索木を真似してみたのですが、コンパイルエラーが出てしまいます。
https://codereview.stackexchange.com/questions/133209/binary-tree-implementation-in-rust

playgroundで試してみた結果がこれです。
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=fc1fe0d2a4c39c6b28d017539419fa2a


どうやら古いRustならコンパイルが通るようなのですが、今のRustでコンパイルを通すにはどうすればよいのでしょうか?
429デフォルトの名無しさん
垢版 |
2020/04/18(土) 18:14:53.19ID:EW6Y9RQI
Alexが人の話聞かないってこと?
2020/04/19(日) 10:46:13.87ID:8Q+7ObaB
ダメ出しよろ https://ideone.com/fswv4P
2020/04/19(日) 12:14:31.72ID:lAlWodFD
非常に良いと思います。flagの意図を読み解くのが少し難しいくらいです。
432デフォルトの名無しさん
垢版 |
2020/04/20(月) 08:24:43.01ID:JR6Mr590
確かにflagが読みづらいからコメントは欲しいかな
個人的にはuse Exp::*;とExp::V => Exp::Valueにするのとテストケース増やしてmod testsにするかな
let exp = Value("MITSU").add(Value("MITSU")).add(Value("MITSU")).eql(Value("CORONA"));
let solver = Solver::new(exp);
// prints solved exp
solver.solve();
最初のインスタンスは読みにくいからこうするかも、それかマクロかビルダー作るか
2020/04/23(木) 19:29:00.20ID:WjWrG05V
トレイトって機能を追加するときどういう機能であるかの特徴を一見して分かりやすくするためだけのもの?
2020/04/23(木) 20:53:30.42ID:87GHMCpD
振る舞いや
2020/04/23(木) 22:36:03.84ID:5udoMUF9
>>433
とりあえずはJavaやC#のインターフェースっぽいものとして捉えておけばいいんじゃないのかな
やってるうちに違いも分かってくる思うので
2020/04/25(土) 02:58:36.79ID:FXjmUrQ8
これライフタイム記述を省略できないのなんで? https://git.io/JfL6t
2020/04/25(土) 21:29:12.23ID:2AkpFzKs
省略してコンパイラ通るけどstableは無理なん?
2020/04/26(日) 00:34:16.68ID:eoUYVhAX
関数内で同じ一連の処理を複数回実行するときマクロにまとめるのが一般的?それともクロージャ?
他にやりかたある?
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=30449f979231232b68016cab5cd1fb1e
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=e5fc7f66785bb3794df19104d5c479ff
2020/04/26(日) 01:44:31.54ID:bgNhzTiH
>>438
関数

あとサンプルだからかもしれないけど
spilt_whitespace()とかでイテレータ使ったほうが読みやすい
2020/04/26(日) 01:49:37.98ID:bgNhzTiH
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=b03bef5cb6f98821032c5fb1cce618a1
2020/04/26(日) 08:01:37.17ID:eoUYVhAX
そのコードは実際に使うコードじゃなくてさあ、変数が何個もあったりすると関数切り出しは引数が地獄になるじゃん
2020/04/26(日) 11:00:13.57ID:bgNhzTiH
その例でマクロかクロージャの二択ならクロージャだけど
>>438のは外側の変数をキャプチャすることで複雑化してるから&tangoを渡すようにする
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=ec760be4190e2ad4ab21fbea3c84b0ed

そうすると結局クロージャも関数と同じように適切なシグニチャを考える必要があるから
関数化に比べて楽ってことはないんじゃないかと思う
2020/04/26(日) 12:20:05.30ID:9haVb0dh
Rustの問題集みたいなのってあったりする?
2020/04/26(日) 12:50:17.90ID:9haVb0dh
この連休である程度かけるようになりたい
445デフォルトの名無しさん
垢版 |
2020/04/26(日) 14:52:26.46ID:WcQXqCZk
連休だけでRustかけると思うことが間違ってるよ
2020/04/26(日) 15:59:36.18ID:bgNhzTiH
公式のGithubにrustlingsっていう簡単な練習問題がある
The Bookを読んだ後に基本文法をおさらいしたい人向け
https://github.com/rust-lang/rustlings
2020/04/26(日) 16:01:54.22ID:9haVb0dh
>>446
うおおおおおおサンクス
2020/04/27(月) 05:09:42.36ID:4dCrlHPD
↓Vecだと動くのに配列にするとコンパイルできないの何で?
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=6321129e5cc3853ef1421d706e19a136
2020/04/27(月) 06:06:02.00ID:9c9dxgXm
配列にinto_iterしてもmoveされずに参照が返るから
2020/04/27(月) 09:24:11.80ID:xj40wisa
rustいつのまにか蟹のイメージになってるけど、オライリーの影響?それとももっと前から何かあるのかな?
2020/04/27(月) 09:35:35.74ID:qLbh0tK5
よくしらんけどこれじゃね?
https://rustacean.net/
452デフォルトの名無しさん
垢版 |
2020/04/27(月) 12:48:32.95ID:vsE9eV5m
let mut heap = BinaryHeap::new();
heap.push(10);
heap.push(9);
heap.push(20);
for x in &heap {
println!("{:?}", x);
}

これでバイナリヒープすると
20
9
10
ってなるんだけどバグ?
2020/04/27(月) 12:51:07.20ID:On5R6UtW
>>448
配列のIntoIteratorは
&[T; N]と&mut [T; N]に対して実装されてるが[T; N]に対しては実装されてないのでmove不可

対してVecのIntoIteratorは
&Vec<T>と&mut Vec<T>だけでなくVec<T>に対しても実装されてるので
moveが必要なコンテキストならIntoIterator for Vec<T>が選択されmove可能
2020/04/27(月) 12:53:27.20ID:ucpPL8Eb
>>452
ドキュメントに書いてある通り、iterは適当な順序で出てくるので仕様。
https://doc.rust-lang.org/std/collections/struct.BinaryHeap.html
2020/04/27(月) 13:16:59.92ID:On5R6UtW
>>448
配列でやりたい場合はFooにClone実装してfoo.clone()
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=8fdb065f764ac7a0be3a3de161bfa984
456デフォルトの名無しさん
垢版 |
2020/04/27(月) 14:12:45.55ID:ZRv/ULjO
学術の巨大掲示板群 - アルファ・ラボ
ttp://x0000.net

数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など

PS 連続と離散を統一した!
ttp://x0000.net/topic.aspx?id=3709-0
457デフォルトの名無しさん
垢版 |
2020/04/27(月) 15:43:57.57ID:vsE9eV5m
>>454
thx 見逃してた
2020/04/27(月) 17:58:08.76ID:4dCrlHPD
配列のIntoIteratorにmoveが実装されてないの何で?
2020/04/27(月) 18:30:46.65ID:On5R6UtW
>>458
詳しいことはよくわからないけど実装が難しかったみたいよ
興味あればこのissue読んでみて
https://github.com/rust-lang/rust/issues/25725

nightly使えばmoveできる機能はあるみたい
https://play.rust-lang.org/?version=nightly&;mode=debug&edition=2018&gist=6a22ab054f5ec52ea942a1186710a516
2020/04/27(月) 22:17:40.40ID:e7WQ8CRR
>>457
型制約見ればええんやで。

`pub fn iter(&self) -> Iter<T>`は`impl<T> BinaryHeap<T>`。

`impl<T> BinaryHeap<T> where T: Ord,` に`pub fn into_sorted_vec(self) -> Vec<T>`てあるやろ。
rustのOrdは全順序や!
2020/04/28(火) 01:18:27.68ID:barKq4nx
この場合はifを使うのとmatchを使うのとどっちがおすすめ?

if nanika_shori().filter(hoshiimonokana).is_some() {
hoge();
mitsukatta();
} else {
fuga();
mitsukaranakatta();
}

match nanika_shori() {
Some(butsu) if hoshiimonokana(butsu) => {
hoge();
mitsukatta();
}
_ => {
fuga();
mitsukaranakatta();
}
}
2020/04/28(火) 01:37:40.02ID:aaB86vh6
>>461
後者は関数型言語風ってだけでしょ
関数型言語で is_some() にあたる関数は存在しなかったり、有るけど使うなって扱いだったりする
2020/04/28(火) 02:09:21.04ID:nfkWT3p7
テレワーク中なのか連休入ったせいなのか知らんけど猛者が全部回答してくれるから助かるわ
464デフォルトの名無しさん
垢版 |
2020/04/28(火) 07:51:49.83ID:SJTliuFD
>>461
前者
2020/04/28(火) 11:46:15.82ID:nnss28av
>>461
match nanika_shori().filter(hoshiimonokana) {
Some(x) => {…},
None => {…}
}

if let Some(x) = nanika_shori().filter(hoshiimononanoka) {…} else {…}

boolを返す関数作ってif else
fn are_aruka(hoshiimono: Hoge) -> bool {
match nanika_shori() {
Some(x) if x == hoshiimono => true,
_ => false
}
}
466デフォルトの名無しさん
垢版 |
2020/04/28(火) 12:32:50.40ID:GQyYGa/W
filter(...).is_some()
って形はかなり読みにくい
ようは設計が悪い
2020/04/29(水) 02:11:05.39ID:mpM8GrXg
ResultやOptionが複数ネストしたやつをイイカンジにmapとかやれるか
2020/04/29(水) 18:51:17.07ID:F+b7zcTP
flatMap 的な?
2020/04/29(水) 20:08:03.11ID:lsvcqJYy
Rustやる前に軽くScalaとかHaskellやっとけば
コレクションライブラリ見たときに「あっ、これ進研ゼミでやったところだ!」って
なるから理解が早いよ
2020/04/29(水) 23:56:45.59ID:VSyDHJCJ
ゼミ講習の変態度が高過ぎるわ
2020/04/30(木) 05:16:29.11ID:yR2jzUGm
このコードがコンパイル通って実行できて期待した実行結果にならない
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=4472067bedcd681b8154620b3023f278
2020/04/30(木) 11:08:02.17ID:aC6sOq5z
>>471
警告を消しなよ
2020/05/01(金) 05:37:23.81ID:+OCTqmPQ
HashMapでキーを参照にしたときキーがアドレス値にならないのなんで?
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=9f33505748c782a7b5a2cd22481e5b68
2020/05/01(金) 09:19:46.17ID:xXuuls7c
>>473
&strのEqはアドレス比較じゃないから
475デフォルトの名無しさん
垢版 |
2020/05/01(金) 10:58:05.97ID:gc2qK0CV
>>471
酷いAPI
stdがどうなってるかぐらい見たほうがいい
2020/05/01(金) 12:59:00.58ID:wrmDV0oq
Rustは、Releaseモードでも、Runtimeをstatic linkする場合は、61MB、
dynamic linkする場合は、8.2MBになるらしい。
dynamic linkで、さらにサイズ重視最適化した場合、4.6MB、strip した場合、
3.1MBになる。
でも、C++に変わる言語を標榜するにしては大きすぎる。

https://www.quora.com/Why-are-the-Rust-and-Go-binaries-so-large-compared-to-C-or-Pascal
2020/05/01(金) 13:58:13.26ID:xXuuls7c
>>476
>Rustは、Releaseモードでも、Runtimeをstatic linkする場合は、61MB、
>dynamic linkする場合は、8.2MBになるらしい。

Debugモードが61MB
Releaseモード(デフォルト設定)が8.2MB って書いてるよ
それにlinkするのはRuntimeではない
もう少しちゃんと読もう
2020/05/01(金) 13:58:40.83ID:i4mzH/oB
>>476
デフォルトでサイズが大きいという結論は間違ってないけど
もうちょっと英語ちゃんと読んだ方がいいと思う…。
あとその回答には書いてないけど、頑張ればCにサイズで勝つことは可能だったはず。
2020/05/01(金) 20:43:43.74ID:suCtdez/
>>476
Cで書いたプログラムが小さいのは標準ライブラリを利用しているから、だったと思うんだけど違った?
rustはmallocも自身に含めてたはずだし、Cの標準ライブラリ使うならもっと小さくなるはず

って>>476のQuoraの回答にちゃんと書いてあるじゃん!Cで15kb、Rustで14kbって!
自分でリンク貼るならちゃんと読め!もう!
2020/05/01(金) 21:17:00.16ID:iuGoF6Kh
https://lifthrasiir.github.io/rustlog/why-is-a-rust-executable-large.html
これとかは結構限界まで削ってる感じかな。ちょっと古いけど。

あと
https://github.com/johnthagen/min-sized-rust/blob/master/README.md
にサイズ最適化したいときのやり方一覧がある。
2020/05/02(土) 00:00:07.90ID:rieFiUeI
release profileでもデバッグシンボル含めてるからprofileオプション安定化までお預けかな。
2020/05/02(土) 01:05:23.19ID:RJOTvgjs
アイデアありませんか?
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=88804aace268a5d6adbdf8a8e4423fe4
2020/05/02(土) 02:00:10.73ID:HIdampCl
scanでどうでしょ
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=0092b046fa5b3fa9f1aba90d35a93f4a
2020/05/02(土) 10:05:59.92ID:8Sc54whm
お前らおっぱいだって大きいほうが好きなくせに何バイナリのファイルサイズが大きめだからって文句言ってるんだよ
2020/05/02(土) 10:07:50.85ID:aaZCC6Sm
貧乳が至高
これだけは譲れない
2020/05/02(土) 11:59:56.20ID:UBE5VHp1
バイナリサイズの話題ってずーっと昔に出てたよな
ここで出たのかどこで見たのか忘れたけど

Why are Rust executables so huge?
https://stackoverflow.com/questions/29008127
これかなぁ?
2020/05/02(土) 12:05:15.40ID:UBE5VHp1
Noob question: why are Rust binaries so big
https://www.reddit.com/r/rust/comments/9m2dwo/

こっちだったかも
2020/05/02(土) 15:10:30.93ID:f7vdsp57
let hoge = match s {
  "hage" => hage,
  "moge"=> moge, // 何かの関数や構造体を返そうとしたがhogeは一意の型しか受け取らないから無理
  _=> return
}
loop {
  hoge()
}

的な事やろうと色々試したけど、超絶複雑な事になってヤバい匂いしかしない。
ループの外でループ内で呼ぶ関数の分岐を書くのは何かのアンチパターンなのか
そもそも、ループの中でMatch書いても外からイミュータブルな値を渡すの分かってるなら
コンパイラが最適化してループ毎に分岐なんてしないから普通に入れて書けば良い?
2020/05/02(土) 16:28:13.09ID:0Y98m9EQ
>>482
inclusiveなtake_untilは標準では無いみたいだから自分で作るかcrate探すかになるっぽい

https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=b74ec6655adc38e1e790a35485eee01c
https://github.com/rust-lang/rust/issues/62208

既存Traitを拡張するのはめんどくさいから
自分ならイテレータを受け取ってイテレータを返す関数で我慢する
2020/05/02(土) 16:54:44.18ID:4YXjnjKT
>>488
hoge用にhageかmogeをとれるenumを定義すれば型は一意に定まる。
別にループ内でmatchしても分岐予測はほぼ当たるだろうし
性能的に問題はないと思うけど。
2020/05/02(土) 16:58:06.87ID:4YXjnjKT
あるいはFnとかにして型を揃えれば
loop内の分岐はなくなるかな。
たださっきも書いた通り分岐をなくすことに
それほど意味があるとも思えない。
2020/05/03(日) 03:41:22.86ID:HKq7AyzP
こういうパターンマッチの使い方ってマイナー?保守性が悪い?
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=29945c6422cbc643197b73631691211b
2020/05/03(日) 14:40:33.37ID:CQw0w+cb
>>488
enumで紐つけても結局hogeでmatch使う事になる。
Fnで返すと所謂if文と関数ポインタどっちが早い?的な事になって
最適化するとif文のが早くなる。つまりループの中でMatchしとけば良い。
2020/05/03(日) 21:48:29.60ID:zX3s2fU5
rustのenumはsum typeだからjitがあればmegamorphicでもtracingじゃなくてもjit効いて
インラインキャッシュも必要ないからそのままインライン展開出来るんだが、この辺がAOTの限界だな。
まあ、分岐予測外れるような呼び出しなら初めからvtable使うだろう。

Rust/WinRT見てc++と違っていきなりマクロ出てくるからMFCの悪夢が蘇った。
2020/05/03(日) 22:46:23.02ID:zpY+Khfl
>>492
ローカルにあるcrateとrustのソースをgrepしてみたがほとんど使われてないね

シグニチャに書くことで可読性が高まるケースであれば使えばいいと思うけど
そうじゃなければ一旦受けてから関数内で分割したほうがよさそう
496デフォルトの名無しさん
垢版 |
2020/05/04(月) 11:52:28.65ID:sauq4xLT
レンジ自体にマッチしたいんだけど書きかたって今はない?
match 1..3 {
2..3 => println!("2..3"),
1...3 => println!("matched!"),
_ => println!("_"),
}
2020/05/04(月) 12:22:11.14ID:au6sJ5VU
>>496
use std::ops::Range;

match 1..3 {
Range{start: 2, end: 3} => println!("2..3"),
Range{start: 1, end: 3} => println!("matched!"),
_ => println!("_"),
}
498デフォルトの名無しさん
垢版 |
2020/05/05(火) 02:10:07.89ID:em9v0/Ay
>>497
ありがとう。
でもなんで
match 1 {
1...2 => println!("matched!"),
_ => todo!(),
}
こっちのマッチは ... で一個点々多く使わないといけなくなったの?
Range{start: 2, end: 3}をつかうなら1...2じゃなくて1..2でもよかったんじゃ
2020/05/05(火) 03:39:54.86ID:ZuBK36Gv
...ってまだ使えるのか。..=に置き換えられたのかと
2020/05/05(火) 09:01:40.68ID:uTsiWylk
>>498
matchのarmでrangeを使うケースはほぼ100%inclusive rangeなので
half openのexclusive rangeとは区別して利便性を上げつつ
不用意なバグをコンパイル時に弾けるようにしたのが理由だと思うよ

>Range{start: 2, end: 3}をつかうなら1...2じゃなくて1..2でもよかったんじゃ
んん?
そもそも「レンジ自体にマッチしたい」ってどういう用途?
2020/05/06(水) 11:12:57.23ID:exILxtx0
Rust の API についてはメソッドのシグネチャとコメントからドキュメントを生成できるけど、
バイナリクレートにユーザー向けのドキュメントを付けるときの作法とかってあるの?
2020/05/06(水) 22:11:17.73ID:Rwb7Dx/N
i32とかにあるdiv_euclidってどういうときに使うものなの?
2020/05/06(水) 22:52:21.93ID:A+GAumiz
>>502
「負数の剰余」で調べると違いが分かるかと。
504デフォルトの名無しさん
垢版 |
2020/05/07(木) 16:40:36.21ID:82eQknS5
ドキュメントコメントでのassetでのテストとmod testsってどう使い分けたらいいの?

ドキュメントテストすればユニットテスト書かなくていい?
ドキュメントは使用例だけで、assertでのテストって意味なくね?って思ってしまう。無視もできるし
2020/05/07(木) 17:28:34.50ID:k47Mu4KT
>>504
ドキュメントテストはドキュメントであってテストではない。
説明上分かりやすいならassertしてもいいけど、別になくてもいい。
それでもドキュメントテストを通すのは、古いサンプルコードがいつの間にかコンパイル通らなくなっている、というのを防ぐため。
ユニットテストは普通にmod testsで書けばいいよ。
2020/05/07(木) 18:37:23.38ID:ywncHnjy
doit()はclone()が入るとエラーが出るんだけど何で?
TにCloneが必要って出て来るけどTの実体をCloneしないのに必要ないだろJKって感じのエラーなんだが?
これどうしたらいいの?

https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=31635004c1ad9fd9e5ba0f859f28ceb0
2020/05/07(木) 19:32:09.83ID:ywncHnjy
>>506
derive使うのやめて自分でClone実装したわ
deriveのCloneがおバカということがわかっただけ収穫とするわ
2020/05/07(木) 19:52:47.71ID:ywncHnjy
これdoit()のget()がTに'static必要ってコンパイル失敗すんだけど
Tを直接扱ってないんだからTに'static要らんだろって感じなんだが?
関数ポインタくらい静的に解決できんだろJK
どうしたらいいんだよ
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=b69fe063a3cc2fae6f1cc7536007fe8e
509デフォルトの名無しさん
垢版 |
2020/05/07(木) 21:47:17.14ID:82eQknS5
>>505
てことはドキュメントで書いたコードは普通のコンパイルエラー検知しなくてassertのエラーだけ検知するの?
なんかそれはそれでやばくないか
510デフォルトの名無しさん
垢版 |
2020/05/07(木) 21:48:25.25ID:TSVqZJLC
コンパイル通さずにどうやってassertだけ通すんじゃ
2020/05/07(木) 22:52:31.79ID:ufUjH0LD
>>508
doitのTにstaticを指定すればいい。fn <T:'static> doit ....
2020/05/07(木) 23:07:35.28ID:k47Mu4KT
>>509
いやいや、コンパイルエラーは検知したくてassertはどっちでもいいって話。
コンパイルできないサンプルコードを検出したいんだから。
513デフォルトの名無しさん
垢版 |
2020/05/08(金) 15:31:13.15ID:2R+BCvOe
なんで型って大文字始まりなのにi32とかは全部小文字始まりになってんの?
初期のデザインミス?
2020/05/08(金) 15:47:25.70ID:Pb0t26ee
primitiveは小文字で統一したんじゃないの?
2020/05/08(金) 22:20:21.51ID:UFFnLRtI
0u32
みたいにサフィックスとしても使うし
516デフォルトの名無しさん
垢版 |
2020/05/09(土) 06:11:48.26ID:gxFlq1V3
Rustみたいに標準ライブラリは最小に留めてるような言語って他にありますか?

それとコンパイラ内部のCargo.tomlにライブラリのバージョン書けば別に最小に留めなくてもと思うんですが、どうでしょうか?
2020/05/09(土) 10:20:58.87ID:MmeKQuXy
>>516
Lua とか
2020/05/10(日) 04:53:09.49ID:aajKhScH
>>516
どこまでを最小というかによるがC++は似たようなもんじゃないかしら
519デフォルトの名無しさん
垢版 |
2020/05/12(火) 08:44:05.53ID:l1cRSbJI
これってなんで&mut になんの?
n: mut &i32のほうが差分的にも視覚的にもいいと思うけど、どっかに理由とか書かれてないかな?
fn example(n: &mut i32) {
}
let mut r = &10;
example(mut r);
2020/05/12(火) 10:47:54.41ID:yEVh4LKg
>>519
https://stackoverflow.com/questions/29672373/what-is-difference-between-mut-a-t-and-a-mut-t
2020/05/12(火) 11:12:17.10ID:rr7jvTFY
>>519
変数がmutableなのか、immutableなのかと
変数の型がownedなのか、shared referenceなのか、mutable referenceなのかとは別

mutable referenceを表す記号として`&mut`で一塊なのでmut &i32は微妙
n: mut i32みたいに型として意味のないコードを書いて
何が悪いのかわからないってことになりにくい

コンパイラ的にも`&`が先にあったほうが処理が簡単そう
522デフォルトの名無しさん
垢版 |
2020/05/12(火) 17:14:57.85ID:pSulPVQF
なるほど
2020/05/12(火) 17:49:29.28ID:jco3JkFf
>>521
微妙というかmut &i32だとimmutableなi32へのmutableな参照になるから意味が違うのでは?
もとのi32は変更不可だが別の参照を再bindは可能という。
2020/05/12(火) 18:24:06.26ID:rr7jvTFY
>>523
変数のmutabilityと変数の型をごっちゃにしてない?

`let x: &mut i32`と書くところを
`let x: mut &i32`と書くような文法にしたほうがよかったのでは
ってのが>>519の意見
2020/05/12(火) 19:18:36.86ID:j2+Ql/jy
>>524
その場合、今の文法でmut &i32と書くケースはどうすべきなの?
そこだけ変えちゃうと、全体的に整合性が取れなくなるのではないかと思うけど。
2020/05/12(火) 21:20:08.42ID:rr7jvTFY
>>525
今の文法でmut &i32と書くケースは無いよね?

`let x: &mut &i32`って書くべきケースのことなら
`let x: mut &&i32`になるんじゃない?
2020/05/12(火) 21:34:24.99ID:FmqTBss/
>>526
確かに勘違いしてた。今の文法だとmut x: &i32だった。
なので今は
x: &mut i32
mut x: &i32

x: mut &i32
mut x: &i32
にしても別に問題はないのか。なんとなく両者の区別はしにくくなってる気はするけど。
528デフォルトの名無しさん
垢版 |
2020/05/12(火) 21:45:24.39ID:l1cRSbJI
>>521
パース負荷はおいておいて、mut i32ってかいてあったら普通にコンパイルエラーでよくないか?
エラーの親切さはRustの特徴だし。
mut 書いてる時点で参照なのは当然なんだから書き忘れってすぐわかるじゃん
それに語彙的にmutable referenceとも一致して自然だから前から疑問だった

>>526 のパターンとかも今までの書き方だとかなり読みにくいよね
2020/05/12(火) 22:06:14.36ID:rr7jvTFY
本当の理由は知らないけど、その区別しにくくなるってところがポイントだったんじゃないのかな

mut i32はコンパイルエラーだろうけど、今はエラーメッセージ見ても
&mutがあれば型、mutがあれば変数のmutabilityって詳細読まなくてもすぐ分かる

慣れかもしれんが俺は今の文法のほうが読みやすいと感じる
let mut x: &mut &i32
let mut x: mut &&i32

let mut x: &mut &mut i32
let mut x: mut mut &&i32
2020/05/12(火) 22:08:09.55ID:tQMnmew/
tokio使ってる人いる?
2020/05/12(火) 22:36:30.89ID:RlXY9TUm
>>530
使いたくなくてもネットワーク使うcrateがtokioにべったり依存してて
非同期にこだわる意味ないアプリでも使わざるを得なくなるのがRustのダメなとこ
2020/05/13(水) 00:29:51.86ID:HS9NS6av
actix-webでも中で使ってるしtokio単体でも使ってる
533デフォルトの名無しさん
垢版 |
2020/05/13(水) 01:28:10.47ID:IZIPIE/9
非同期に拘らないならstd::net使えばよくない
2020/05/13(水) 14:58:18.04ID:n4QRUOl7
今の主流は tokio か async-std だけど io-uring 対応でまた勢力図に変化が起きたりするのだろうか
2020/05/13(水) 22:46:58.63ID:0Q+bejh+
乗り遅れた。
tokioは使ってないけどデスクトップでnon-blocking file ioが欲しい。ブロックしたら並列の意味がない。

>>531
ランタイムと付いてくるapiで肥大化するのが問題なんだよね。
2020/05/14(木) 04:55:54.76ID:hWqHBFy5
cargo clippyが通ってcargo buildが失敗するケースってある?
2020/05/14(木) 09:41:17.62ID:WpNijTVY
望まぬ非同期は一応 tokio::runtime::current_thread::block_on_all() で回避できるか
それでもビルドが一気に遅くなる
2020/05/14(木) 15:47:47.58ID:yNXnSs4i
>>536
リンクでエラーになる場合とかはある
539デフォルトの名無しさん
垢版 |
2020/05/14(木) 18:17:46.89ID:nGNfHuw+
なるほど
540デフォルトの名無しさん
垢版 |
2020/05/14(木) 21:36:47.59ID:AoVs9mpY
日本のRust界隈で有用なRust関連のツイートしてる人教えて
2020/05/14(木) 23:31:33.96ID:W3KxELdZ
おれおれ
542デフォルトの名無しさん
垢版 |
2020/05/15(金) 09:40:19.45ID:OlE2WbGd
543デフォルトの名無しさん
垢版 |
2020/05/16(土) 07:49:09.76ID:4fgNGNa5
io-uringと今までの非同期処理の違いってなに?
パフォーマンスそれほど変わるもんなの
2020/05/16(土) 22:12:40.61ID:d7M+qUqk
スレチ
545デフォルトの名無しさん
垢版 |
2020/05/18(月) 04:57:51.24ID:z6Kgscbk
返り値に &'static str ってライフタイム指定ないといけないけど、推論だけで解決できない問題があるから書かないといけないの?
Stringからderefで生成した&strでも結局はIO以外で来たStringは'staticでしょ?推論できそうだけど
2020/05/18(月) 23:19:03.18ID:Uv/lNmsL
>>540
てらモス
2020/05/19(火) 03:57:06.17ID:GltHdsbb
IO以外で来たString、つまりコンパイル時に計算しろってことやな!
let mut string = String::from("abcde");
if long_long_time_consume() != 0 { string.insert(0, 'c') }
require_static_str(&string); // require_static_str : &'static str -> ()
というコードが正しいかどうか、実際に長い長ーい計算しないと分からないけどできるならやれってことやな!絶対使わんわ!
2020/05/21(木) 00:27:51.21ID:uKmbRWt0
paizaにRustの問題ないのつら
2020/05/21(木) 13:46:29.84ID:e7acrJyd
競技プログラミングだとアルゴリズムの理解はともかく言語機能の活用は必ずしも身につかないしなぁ……。

Rust のようなプログラミング言語はいかにして抽象化層を構築するか、
いかにしてミスを防ぐか、
そのために必要なのはどんな機能かに意識が割かれたデザインが多いので、
手早くやることが正義の競技プログラミングではマッチしない。

ステップアップには良いかもしれんが、初心者向けには各言語向けの課題が欲しいよね。
550デフォルトの名無しさん
垢版 |
2020/05/21(木) 19:20:37.36ID:y/uWQkFk
enum MyEnum {
Foo,
Bar,
Baz,
}

のようなデータを載せないシンプルなenumで
Clone/CopyやPartialEq/Eqなどを実装しない場合ってどんな意図があったりするの?
2020/05/21(木) 19:32:35.91ID:BBt3dInh
意図もクソも本来の普通のenumだろ
値そのものに特に意味がなくて、複数のオプションを区別するためだけに使う単なる定数
2020/05/21(木) 19:52:52.75ID:Ge5vC94Q
ただのサボりだろ、省略することに意図なんて無い
2020/05/22(金) 00:12:42.63ID:Aykyb680
Rc<Hoge>のHogeの参照を取りたいとき &*rc_hoge とするのと rc_hoge.as_ref() とするのとどっちがおすすめ?
554デフォルトの名無しさん
垢版 |
2020/05/22(金) 01:00:57.91ID:dJNhuRdN
>>551
同意
2020/05/22(金) 09:19:49.56ID:JweU/zGV
>>551
順序に意味はなくていいが、
Copy は出来て欲しーーってワイは思うやで。
556デフォルトの名無しさん
垢版 |
2020/05/22(金) 20:50:02.94ID:ZwFuqcZd
enumだけ勝手にCopyついてるとか嫌すぎて草

>>553
as_ref()
2020/05/22(金) 21:08:41.77ID:4ZqbW+TE
non_exhaustive で pub な enum は勝手に Copy になると意図せぬ破壊的変更を起こしやすくなってしまう
2020/05/22(金) 21:09:50.79ID:4ZqbW+TE
>>553
Hoge が AsRef 実装してるかもしれないから Rc::as_ref か &*
2020/05/22(金) 21:16:35.95ID:/JyTX0fw
最近ずっと弄ってるけどRust難しいのう・・・
560デフォルトの名無しさん
垢版 |
2020/05/23(土) 09:31:16.71ID:Zkam+XNX
C++がそうだからとかの理由はなしで
[[[i32; 3]; 3]; 3]
がなんで
[3; [3; [3; i32]]]
じゃないの?
行列の時かなり読みにくいしさ
2020/05/23(土) 12:43:47.04ID:Ax4YhvgI
なしでと言うかC++erが記法にノイズを持ち込んでるのは明らかなんだが
2020/05/23(土) 15:44:24.84ID:jzsRlJtI
>>560
それって型としては [[[i32]]] なんでしょ?
大きさの情報は後付けというか、
補足的なニュアンスを感じるので後にくるのが自然だと受け入れてる。
実際のところはどういう議論があったのか知らんけど。
563デフォルトの名無しさん
垢版 |
2020/05/23(土) 19:37:35.36ID:Zkam+XNX
>>561
じゃあこの型をRustに持ち込んだのはC++erのMozilla社員ってこと?

>>562
その型はスライスだから全く別。しかも&もないからそんな型ない
2020/05/23(土) 22:35:14.94ID:xQEe6NOh
let x = Box::new(String::from("foo"));
let y = *x;

これyにmoveできるの入門ドキュメントで説明されてなかったから結構驚いた
2020/05/23(土) 23:03:55.77ID:6goyk3s3
>>563
>その型はスライスだから全く別。しかも&もないからそんな型ない
rustのドキュメントも混同しまくってるけど[T]はDSTのarrayで&[T]がDSTのarrayの借用(スライス)だぞ。

>>564
Boxのrustdocに書いてある
2020/05/24(日) 01:52:15.18ID:tkUtJ987
>>565
[[[i32; 3]; 3]] は存在できるが [[[I32]]] は存在できない
配列の要素毎にサイズが可変となってしまう
567562
垢版 |
2020/05/24(日) 09:30:45.62ID:SCWt5xFf
>>566
スライスにとって要素の数の情報は動的なもの (実質的に fat pointer) で
配列にとっての要素の数は型の一部ってこと?
2020/05/24(日) 17:28:53.26ID:tkUtJ987
>>567
そういうこと
もっと言うと [T] の要素数情報は配列自体ではなく配列への参照 (fat pointer) が保持してるから
[T] が単独で存在することはできなくて、
参照経由の &[T] やスマートポインタ経由の Box<[T]>, Rc<[T]> といった形でしか存在できない
569562
垢版 |
2020/05/24(日) 17:59:17.80ID:SCWt5xFf
>>568
そういうことか。
fat pointer を基礎に据えることを除けば
C/C++ のルールとかなり似てるのでわかりやすいな。
(けどそれ故に C/C++ 的な考え方に引きずられてしまう部分もある……。)
2020/05/24(日) 20:09:44.60ID:sglBbUqv
言いたい事は理解できるが
存在できないって言い方は少し引っかかる
2020/05/24(日) 23:17:03.73ID:WFZqWDFu
6月号で特集が組まれてます
初心者の方は是非
2020/05/24(日) 23:36:35.12ID:a0LhMB8x
なにこれどうなってるの?traitでFizzBuzz?
https://github.com/doctorn/trait-eval
573デフォルトの名無しさん
垢版 |
2020/05/25(月) 09:27:38.21ID:Jp/r3UJz
traitのFizzbuzzに付属してるtrait群がいいね。From実装してなくて爪甘いけど
2020/05/25(月) 22:39:28.81ID:MNSExfZQ
>>566
>[[[i32; 3]; 3]] は存在できるが
unsizedだからできない。
というか存在はしてる。rustはリージョンでメモリ管理するからコンパイル時に
リージョンのサイズが分かる必要があるからDSTが第一級じゃないだけ。
スライスにすればそのスライスのサイズはusize*2だからzoneを確保できるだろ。
コンパイル時にポインタのサイズが分かれば良いだけだから

assert_eq!(::std::alloc::Layout::new::<*const [u64]>(), ::std::alloc::Layout::new::<&[u64]>());

は通る。the bookとnomiconよめ。
2020/05/26(火) 01:25:10.52ID:zMnW+xpW
>>540
https://search.yahoo.co.jp/realtime/search?p=Rust
2020/05/26(火) 09:22:21.48ID:yWo2qZ2t
>>574
(要素数と要素サイズがコンパイル時で既知である必要があるarrayの形では)存在できない
と読んでくれ
577デフォルトの名無しさん
垢版 |
2020/05/26(火) 12:44:21.66ID:tQI2iyhC
::stdの指定の仕方ってなんで使うの?stdじゃなくて
自作のmod std作った時にしか被らないぐらいしか利点なさそう。しかもそんな紛らわしい名前で作らないし
2020/05/26(火) 23:26:23.63ID:yWo2qZ2t
他の crate に公開するマクロで使う
2020/05/26(火) 23:27:54.23ID:yWo2qZ2t
std以外のcrateにも使えるから、モジュールとの名前かぶりで使わざるを得ないときもある
testとか
580デフォルトの名無しさん
垢版 |
2020/05/27(水) 10:28:00.44ID:dVIhbWpz
2018の次期バージョンっていくつ?
2020/05/27(水) 11:01:45.48ID:pv32Gf/H
>>580
Prepare for a possible Rust 2021 Edition
https://github.com/rust-lang/rfcs/blob/master/text/2857-roadmap-2020.md
582デフォルトの名無しさん
垢版 |
2020/05/28(木) 08:05:27.45ID:NpbhHX3L
pub enum KansaiPref {
Osaka,
Hyogo,
Kyoto,
}
こういうenumを文字列から生成する時ってnewよりfrom_strで作った方がいいの?

impl KansaiPref {
fn new(s: &str) -> Self {
use Self::*;
match s {
"大阪" => Osaka,
"兵庫" => Hyogo,
"京都" => Kyoto,
_ => unimplemented!(),
}
}

newかfrom_str

impl FromStr for KansaiPref {
type Err = ...;
fn from_str(s: &str) -> Result<Self, Self::Err> {
use Self::*;
match s {
"大阪" => Osaka,
"兵庫" => Hyogo,
"京都" => Kyoto,
_ => unimplemented!(),
}
}
}
2020/05/28(木) 10:15:20.06ID:Xow4Xb3r
>>582
どっちでもいいと思うけど自分ならfrom_str選ぶ
理由はenumをnewするのにResult(かOption)が返されるシグニチャよりも
input.parse::<KansaiPref>()してResultが返されるほうが意図が伝わりやすいから
2020/05/28(木) 12:26:13.92ID:XHarSIwj
>>582
俺は初心者だから意見としてはそれほどあてにならないけど、
from_str を使った方がいいと思う。
new はただの習慣だが FromStr は制約として機能するので、
既存の枠組みの中で便利に機能する可能性がある。
2020/05/28(木) 22:03:56.44ID:85z31x28
多言語展開を考えるとどれも使いたくねえな…と思ってしまう
2020/05/29(金) 07:36:25.48ID:RYu+vFRR
FromStr実装するならちゃんと Err 返してくれ
2020/05/29(金) 16:33:26.54ID:nAKVwuCz
let a : Box<[T; 1000]> = Box::new([Default::default();1000]);

みたいなのってスタックに要素を作ってからヒープにコピーするようになるから効率が悪いし、
Copy を実装してない型だと使えないみたいなんだけど、これって今はどうするのが常套手段なの?

前提条件として変数の型は Box<[T; 1000]> というのは固定ということにして、
unsafe も避けられるものなら避けたい。
2020/05/29(金) 17:24:59.34ID:lyhnjVvq
>>587
vec![Default::default();1000].into_boxed_slice();
589デフォルトの名無しさん
垢版 |
2020/05/29(金) 21:21:26.13ID:tZarZhzR
>>586
標準でString or &str のパース失敗時に返すErrの型とかあんの?
2020/05/30(土) 00:58:42.40ID:wj/8yI7A
vec! と同じような使い勝手の box! があってもよさそうな気がするけど、
そういうクレートがあったりする?
2020/05/30(土) 01:42:01.99ID:tvhETOJ1
#![feature(box_syntax)]
let a: Box<[T; 1000]> = box [Default::default(); 1000];

https://github.com/rust-lang/rust/issues/53827
2020/05/30(土) 01:46:59.27ID:wj/8yI7A
>>591
おおっ、これぞ私が必要としていたもの!
593デフォルトの名無しさん
垢版 |
2020/05/30(土) 07:24:57.35ID:DJ1cbMGZ
待望の新言語

ZetZ、形式的検証機能を備えたCのダイアレクト
https://www.infoq.com/jp/news/2020/05/zz-formal-verified-c-dialect/
2020/05/30(土) 11:52:22.59ID:wj/8yI7A
# と #! はどういう使い分けがあるの?
2020/05/30(土) 13:01:17.39ID:QgJ1kT2w
>>594
#は直後の構文要素に対するアノテーションで
#!はそれを含むスコープ全体へのアノテーション。
2020/05/30(土) 15:53:27.03ID:wj/8yI7A
>>595
Thx
597デフォルトの名無しさん
垢版 |
2020/06/01(月) 10:13:32.80ID:QCREwpDy
loopとスレッドスリープでやるのもいいけど、いい感じにデーモン立てて一定時間経ったら関数実行してくれるような仕組みのクレートってない?
2020/06/01(月) 10:31:33.62ID:o7IiynR8
借用や所有の概念って、Rustがはじめてなのかと思ったら、D言語に既にあったんだね。
2020/06/01(月) 10:51:02.85ID:o7IiynR8
>>598
あー。D言語の方がRustを参考に取り入れたらしい。
2020/06/01(月) 11:12:31.20ID:o7IiynR8
Rustのヒープは必ず参照カウンタが入ってしまうので、C/C++言語に比べれば遅くなるね。
2020/06/01(月) 11:19:51.79ID:dfhSq8hG
>>600
Rc以外は参照カウンタ入らないよ。
解放タイミングはコンパイル時に決定するんだからカウンタいらない。
2020/06/01(月) 11:31:20.41ID:o7IiynR8
>>601
Box<T>も参照カウンタ入ってないの?
2020/06/01(月) 11:32:01.43ID:o7IiynR8
>>601
それより、参照カウンタが入っているかどうかはどこを読めば分かるの?
2020/06/01(月) 11:35:58.71ID:o7IiynR8
C++ vs Rust
unique_ptr<T> ---> Box<T>
shared_ptr<T> ---> Rc<T>
weak_ptr<T> ---> Weak<T>
ということなの?
どこに書いてある??
2020/06/01(月) 11:37:31.71ID:dfhSq8hG
>>603
RcやArcのドキュメントにはreference counting pointerと書いてある。
Boxとか入ってないやつにわざわざ入ってないとは書いてないけど。
2020/06/01(月) 11:40:30.85ID:o7IiynR8
let a = 7;
let a_box: Box<i32>
a_box = Box::new(a+2); //(3)
という例があったけど、どうして、(3)がエラーにならないの?
mut 属性にしておかなければ、let文でしか代入できないんじゃなかった?
2020/06/01(月) 11:43:34.61ID:dfhSq8hG
>>604
https://doc.rust-jp.rs/book/second-edition/ch15-00-smart-pointers.html

>>606
a_boxは2行目では値が入ってないので、3行目が最初の代入だから変更ではなくmutはいらない。
2020/06/01(月) 11:44:44.94ID:o7IiynR8
>>605
C++とは名前が変わっているだけで、>>604という理解でいいわけだね?
2020/06/01(月) 11:49:39.54ID:o7IiynR8
>>607
>a_boxは2行目では値が入ってないので、3行目が最初の代入だから変更ではなくmutはいらない。
なるほど、最初かどうかをコンパイラが追跡していたんだね。
知らなかった。
immutableな変数は、必ず let 文でしか代入できないとばかり思っていた。
最初に読んだ documentでは、例としてそう書いてあったから。
2020/06/01(月) 11:51:23.94ID:dfhSq8hG
>>608
厳密に同じかはわからないけど、対応としては合ってるかと。
2020/06/01(月) 12:19:02.82ID:o7IiynR8
「変数のアドレスを他の変数に代入することを借用(borrowing)という」
という理解で有ってる?
612デフォルトの名無しさん
垢版 |
2020/06/01(月) 12:37:12.92ID:QCREwpDy
ID: o7IiynR8
こいつやべーだろ。なんにも知らないくせにRustのヒープは必ず参照カウンタが入るとか嘘吹かしてんじゃねえか
蓋開けれみりゃ初心者のクレクレゴミだし、どういう自信で最初言ったんだよ
2020/06/01(月) 12:37:39.24ID:0yVOdbpz
>>611
実態はアドレスだが所有権管理の対象になるのはアドレスではなく参照。
2020/06/01(月) 13:18:58.22ID:0yVOdbpz
コンパイル時に所有権のチェックをしてるってのがよくわかってなくて変なことを言ってるのかもね。
「所有権の移動」が「実行時にアドレスと一緒に所有権が渡される」みたいな認識だとしたら
参照カウンタによって実装されるという ID:o7IiynR8 みたいな言説になるのはわからんでもない。

が、 Rust は静的解析の賢さでメモリの安全性を高めるのがウリのひとつなんだからそんなわけねーだろというくらいには
想像できて欲しいよ。
2020/06/01(月) 13:24:10.03ID:aguQ4xiv
C++の概念に言い換えて理解しようというのが
そもそも無理筋な気が
2020/06/01(月) 13:41:16.41ID:51GFkTZC
説明書読まずにとりあえず人に聞いて教えて貰おうとするやついるよね
2020/06/01(月) 14:10:26.06ID:0yVOdbpz
所有権回りは Rust の重要な特徴だから
どんな入門書でも書いてないはずはないんだよな。
2020/06/01(月) 14:47:28.60ID:w1nG+7Ec
Rustの普及を阻む課題 年次調査から明らかに
https://www.atmarkit.co.jp/ait/articles/2006/01/news044.html

Rustの利用をやめた回答者にその理由を尋ねたところ「自社がRustを使っていない」という回答が最も多かった。
他の上位の理由は「習得が大変」「必要としているライブラリがない」「移行すると作業能率が落ちる」「IDE(統合開発環境)でのサポートが不十分」などだ。

Rustを利用したことがない回答者に理由を尋ねたところ、「Rustを学んだことがないから。ただし、学びたい」「自社がRustを使っていないから」という回答が、いずれも約4分の1の割合に達し、この2つで回答の過半数を占めた。

Rustの普及拡大への最大の課題として挙げた上位3つは、「トレーニング/ドキュメントの充実」「ライブラリの充実/改善」「IDEの統合」だ。
2020/06/01(月) 15:24:58.77ID:lLamlcG6
https://blog.rust-lang.org/2020/04/17/Rust-survey-2019.html
2020/06/01(月) 15:45:21.43ID:o7IiynR8
ちょっと変わった傾向だな:

55% of Rust users develop on Linux
24% develop on Windows
23% develop on macOS
621デフォルトの名無しさん
垢版 |
2020/06/01(月) 15:59:56.59ID:QCREwpDy
間違った知識を他人に教えるのは説明書読む以前の問題
2020/06/01(月) 16:00:16.74ID:o7IiynR8
回答者がターゲットとしているプラットフォームも以下の様に書かれているが、回答者がWebBackendを職業にしている人が多いことに対応している可能性が高い :
Linux: 36.9%、
Windows: 16.3%、
maxOS: 14.7%
WebAssembly: 14.4%
Embedded: 7.6%
iOS: 2.9%
BSD: 2.7%
Android: 2.4%

When it comes to what platforms using are targeting for their applications Linux remains the first choice with 36.9%,with Windows as second at 16.3%.
Following close behind Windows are macOS and Web Assembly at 14% each
2020/06/01(月) 17:53:49.92ID:o7IiynR8
Some a = xxx; // 何か初期済みであると仮定
let b1 = Box::new(a);
let b2 = b1;
とした場合、b1が持っていた所有権はb2に移ってしまい、
b1はこれ以後使えなくなるという理解で有ってますか?
2020/06/01(月) 18:03:59.31ID:o7IiynR8
初心者なもので、正しく(?)は、
let b1 = Box<Some>::new();
let b2 = b1;
なのかも知れません。
2020/06/01(月) 18:07:45.72ID:lLamlcG6
>>623
とりあえずThe Bookの所有権のところを一通り読んでから質問してください
その質問の答えも試し方も全部書いてますので
https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html
2020/06/01(月) 18:23:13.55ID:o7IiynR8
>>625
そこは一時間ほど前に読みましたが、>>623のことは分からないので質問しました。
2020/06/01(月) 18:36:04.96ID:0yVOdbpz
>>623
お前が正しく理解してるかどうか知らんけど個別の事例として言えば Yes だ。
所有権は移動して、元の変数はもう使えない。

だけどそんなことはやってみたらわかりやすいエラーメッセージが出るじゃないの。

fn main() {
let a = 20;
let b1 = Box::new(a);
let b2 = b1;
println!("{}", b1);
}

みたいなことを書いたら

error[E0382]: use of moved value: `b1`

って出るし、どこでムーブ (所有権の移管) 済みかまでも表示してくれる。
Rust のエラーメッセージはめっちゃ親切なんだから、
「この場合はどうですか」なんて質問する間があったらやってみりゃいいんだよ。
2020/06/01(月) 19:13:13.12ID:is4FQXAW
Rustのエラーメッセージがすごく親切なのは分かるんだけど、小手先で直そうとするとどんどん修正範囲が広くなっていって最終的に「設計が悪い」みたいな結論になっちゃう
他言語よりコーディング時に考慮すべき点が多いというか違うというか…慣れればそういうことも無くなるのかね
2020/06/01(月) 22:13:40.55ID:o7IiynR8
>>628
色々調べてる途中だけど、どうも、C言語で出来ていたことの何割かは
Rustでは禁止されていて出来ないと思う。
https://stackoverflow.com/questions/40875152/reference-to-element-in-vector
を見てもRustではarrayの1つの要素に対する参照は作れないようだし。
C/C++では当然、そのようなものへの参照やポインタが好きなように作れる。
これが出来ないことである種の組み合わせ爆発が起こりがちになり、
C/C++よりプログラムがしにくくなるだろう。
2020/06/01(月) 22:19:12.08ID:o7IiynR8
>>729
例えばの話、C言語だと1つのCPerson型のデータをファイルに出力する関数を
void write(FILE *fp, CPerson const *person);
のように作りさえすれば、
CPerson persons[100];
for (int idx=0; idx<100; idx++ ) {
write(fp, &persons[idx]);
}
でCPersonの配列にも対応できてしまう。
このようなことがRustではできなくなるはず。
無理やり観が有るが、CPersonのメンバ関数としてwrite()関数を作ってしまうことで対応できるかも知れない。
2020/06/01(月) 22:50:56.49ID:CYB5du4X
rustはまだ勉強中だけど、630がアホなこと言ってるのは俺でもわかる。
2020/06/01(月) 22:53:23.54ID:6zq2VOrY
ID:T0vrM+QLやID:bf1cRh+Bと同一人物だね
2020/06/01(月) 22:54:16.92ID:6zq2VOrY
荒らしの相手するやつも荒らし
634デフォルトの名無しさん
垢版 |
2020/06/01(月) 23:37:56.02ID:QCREwpDy
もうこのスレで公式すら読んでないような初心者質問するやつ無視でよくね。文章から見て同一人物っぽいし
それとそのテンプレ追加も次立てる人お願い >>999
2020/06/02(火) 10:45:35.24ID:7ZgjbGq0
>>629
https://doc.rust-lang.org/1.9.0/book/structs.html
によれば、構造体メンバのアドレスを参照型変数に代入することができるらしい。
636デフォルトの名無しさん
垢版 |
2020/06/02(火) 10:57:29.35ID:UmuMxSnR
diesel辛いっていう人多いけど、乗り換えるならどんなクレートになんだろうね
2020/06/02(火) 11:19:09.02ID:7ZgjbGq0
>>627 >>634
読んでも書いてない。
2020/06/02(火) 19:18:24.00ID:wGjSvc+B
結局c++やらんとrustを理解するなんて無理なんだよ
2020/06/02(火) 20:16:57.29ID:N0F889O8
>>638
こないだ C++ スレで >>623 の ID は見たぞ。
2020/06/03(水) 02:21:24.02ID:TdRUmxlv
https://users.rust-lang.org/t/isnt-rust-too-difficult-to-be-widely-adopted/6173/37
↑のサイトに寄れば、Blandy & Orendorff の Programming Rust の
評判が良いらしい:
I’m also new to Rust and have found the “Programming Rust” book by Blandy & Orendorff to be very helpful.
Especially the chapters on ownership and references.
It is an expensive book though.

また、Box<T>, Rc<T>, RefCell<T>は必要ないという見方があるらしい。
最初から用意されているコンテナを使えば十分という意味のようだ :

I also didn’t need Box, Rc, RefCell, or friends.
2020/06/03(水) 02:34:58.13ID:TdRUmxlv
>>638
(C++は、C++11から大幅に改定されたので)、海外のサイトに寄れば、
C++11より前のC++からRustを学ぼうとすると大変だが、C++11以後
からだと対応関係が分かり易くて楽なのだそうだ。
unique_ptrとBox<T>が対応しているような話か。
ただ、C++の特徴であるtemplateに相当するものがまだRustにはないことが
残念だと書かれていた。
2020/06/03(水) 02:45:19.00ID:TdRUmxlv
そのサイトに寄れば、Rustで難しいのは、借用や所有の概念ではなく、
lifetimeなのだそうだ。
個人的にも、構造体のlifetimeについて説明不足を感じた。
構造体の変数のスコープと構造体のメタ部分で記述するライフタイムの
関係性がbookなどでは書かれて無いように思えた。
分からんけど。
2020/06/03(水) 02:59:40.24ID:TdRUmxlv
2018/04 の時点でも、まだ、lifetimeに関する資料が足りてないと感じている人がいたそうだ。
Can we maybe have a book or booklet exclusively covering lifetimes?
I don’t think the first level of instruction material on lifetimes which is found
in the rust book and others which talks about the syntax and the aliasing rules and elision is enough.
It leads to an incomplete model which only frustrates when you discover its incompleteness.
Rust nominoc does go further. For example it shows with detailed examples how lifetimes start with
a let binding and how they interact with other lifetimes in the same scope.
This is fundamental stuff and absolutely essential to understanding.
But there are still aspects not covered there.
For instance I realized that lifetimes can be shrunk as needed by the compiler only from this
forum (thanks @vitalyd) which invalidated my previous model.
And I’m sure there are other aspects I don’t know about.
I think we just need one place where one can learn everything about lifetimes and be done with it.
2020/06/04(木) 10:31:48.72ID:E8yK5u0i
>>641
グロ
645デフォルトの名無しさん
垢版 |
2020/06/04(木) 12:10:41.88ID:4kMLpsX6
>>636
sqlxじゃないか
2020/06/04(木) 13:20:58.04ID:YCN7KCgu
難しいのはネストした場合のオブジェクトに対するイミュータブルかどうかとライフタイムだろう。
2020/06/04(木) 14:06:07.27ID:hCECm/yf
ライフタイムはコンパイラが親切丁寧に指摘してくれるから難しくは無いだろ
依存関係とか指摘出来ない系のエラーで詰まる事のが多い
2020/06/04(木) 19:40:21.91ID:pT22FhoL
>>647
コンパイラに指摘されれば問題ないかというと総でも無い。
プログラミングはコンパイルする前に予想可能で無いと困る。
2020/06/04(木) 20:10:09.15ID:pX62chi4
競馬かな?
2020/06/04(木) 20:37:04.46ID:ZbgQHKA+
>>648
難しくないってのは「学習は」難しくないって話じゃね?
いずれは自分でわかるようになるというのは当然の前提で、
まあわかるようになっても間違えることはあるのでそれを指摘してくれるのもありがたい。
2020/06/04(木) 22:06:35.88ID:x+eVDE0s
>>650
ところが、コンパイラを実際に動かさなくても、仕様書や例を見ただけで
理解できる言語も多いんだよ。
たとえば、CやBASIC,JS,Java,C#,Ruby,Python,Perlなどがそれに該当する。
C++は、03まではまあ分かったが、だんだん難しくなっていった。
もはやSTLのソースも仕様書ですらも理解できるのは一部の特殊な人に
限定されてきているかも知れない。STLの
forward()の意味を理解したりどう実装されているかをソースを見て理解できる
る人は本の一握りだろう。
move()とforward()の役割の違いも実装レベルでどれだけの人間が理解できることか。
でもRustも同じように難しくて同じようなことは起こると考えている。
2020/06/04(木) 22:49:18.31ID:VyuaeUph
そのレベルで理解できてない人がC++使うのはどういうメリットがあるのだろうか
2020/06/04(木) 22:52:33.61ID:x+eVDE0s
実はC++は、forwardやmove, templateなどの詳細を理解できてなくても高級言語的な部分だけを使ってプログラムすることは出来る。
それはRustでも同じ。
2020/06/04(木) 23:01:33.43ID:iTcUmNL8
C++は仕様が難しいというより
仕様ではないけど当然知ってるべきイディオムが
たくさんあってきつい、という感じがするな。
2020/06/05(金) 01:02:20.04ID:D80WdA6t
将棋しか知らない人が囲碁というゲームを見ると
何やってるかわからないしなんだかむずかしそうと言う
しかし実は囲碁はルールそのものはおそろしくシンプルなのだ
ところがルールだけ知っていても、囲碁は打てない
(打てるけど次に何していいかわからなくなる)
なぜなら囲碁はルールとは別に「こういう場面はこういう風に
打ち回す」というイデォムが大量にあってそれを知る必要があるからだ
C++はそれに似ている
2020/06/05(金) 01:41:15.67ID:27EcDywu
そもそもRustの仕様って難しいか?
いろんな言語から取り込んだ概念があって
C一筋とかRuby一筋みたいな人には学ぶべきことが多いとは思うけど、
特に複雑な仕様って思い当たらないんだけどな。
JSの型変換の仕様とかの方がよっぽど複雑だしワケわからんと思う。
2020/06/05(金) 09:30:38.65ID:9qGH+5zI
>>651
C が仕様や例で理解できるってどんな超人だよ。
コンパイルエラーにも実行時エラーにもならない未定義だの処理系定義だのが山もりだろうが。
初心者の書くコードで完全に仕様に沿ったコードなんて見たことないぞ。
2020/06/05(金) 09:38:30.26ID:9qGH+5zI
Haskell の入門書を一通りは読んでたから Rust の型システムは似たようなものとして理解できたなぁ。
ライフタイムもプログラムの字面に書きこそしないでも C/C++ では意識せざるを得ないし、
複雑になるとわけわからんってときは C/C++ で書いてもわけわからんようになるやつ。
2020/06/05(金) 12:01:32.43ID:lHXK6is7
きっとそういう感じでべた褒めする人が多いから、Rubyみたいに一回大人気言語になった後、急速に衰退する気がする。
Rubyも最初は良いと思われていた。
2020/06/05(金) 12:13:12.11ID:lHXK6is7
>>657
Cの仕様はシンプルで、
ポインタと明示的な型宣言と文字列比較をstrcmp()で行うという以外、
基本的な枠組みは既存の言語と変わりはなかったので理解は難しくなかった。
2020/06/05(金) 12:14:22.73ID:9qGH+5zI
Ruby は今でも十分に使われているよ。 (俺は使ってないけど。)
適切ではないところまで広がった分がそぎ落とされてちょうどいい感じに落ち着いたってだけ。
プログラミング言語の良さはスカラ値で測定できるようなものではなくて、用途による。
利用事例が減ったからといってその勢いで衰退して消えるっていうような話ではない。

Rust はまだ実際のプロダクトでどう使うのが適切なのか見極め切れていないから過剰に広まっている
というのはあると思うが、少なくとも C/C++ で問題だった部分を解決したという側面はある。
そんでそのかわりに出てきた問題ももちろんあるので両方を天秤にかけて判断する材料を集めているとこって感じ。
2020/06/05(金) 12:15:46.52ID:9qGH+5zI
>>660
うん。 C がシンプルで理解しやすいと思い込みやすい言語なのは俺も知ってる。
2020/06/05(金) 12:32:15.42ID:lHXK6is7
Google Trends によれば、検索数の増加曲線はほぼ kotlinと同じ位。
ただし、kotlinは、2017/05に急激に上がってRustと重なりあった曲線になったのに対し、Rustは、2014/01に急激に上がった後、徐々に増えている感じ。
Rustはこの1年くらいでわずかに増加速度がKotlinより上がったが、それでもKotlinの曲線とほぼ重なった状態からは脱してはいない。
2020/06/05(金) 12:34:07.49ID:lHXK6is7
>>662
匿名性掲示板では何でも言えてしまうが、実績を見れば俺がちゃんとCやC++を使いこなしていることは分かる。
ただし、C++は一度学んでも仕様が大幅に変更されるので、細かいところを理解するのは時間が掛かるようになってきている。
Cはそんなことはなかったが。
2020/06/05(金) 12:58:47.64ID:AaIN4ymo
もしかして伝説のスーパーハカーさんですか!?
666デフォルトの名無しさん
垢版 |
2020/06/05(金) 13:22:50.72ID:YL2P8Olu
chronoつかってるんだけど、このyearってなんでi32なの?

https://docs.rs/chrono/0.4.11/chrono/offset/trait.TimeZone.html#method.ymd
fn ymd(&self, year: i32, month: u32, day: u32) -> Date<Self>
2020/06/05(金) 13:32:05.31ID:9qGH+5zI
>>664
仮に C や C++ を使いこなせているとして、
使いこなせている言語よりも使いこなせてない言語の方が難しいに決まってるじゃないの。
あなたはそうなんですねってだけ。
2020/06/05(金) 13:35:12.28ID:9qGH+5zI
>>666
符号付きなのがなんでってこと?
month や day はマイナスになる意味はないけど、
年はマイナス (紀元前) を扱いたいこともあるんじゃね。
知らんけど。
2020/06/05(金) 13:44:02.67ID:o7GNRsMO
合ってんじゃね?
知らんけど。
2020/06/05(金) 14:06:52.05ID:B8WhcAqO
C++の仕様が大幅に変更されたというのは
なんのことだ?
2020/06/05(金) 14:17:19.64ID:lHXK6is7
>>670
有る意味では僅かな修正であっても、基礎的な部分における修正は多大な影響を及ぼすことがある。
moveを出来るようにするために追加されたもろもろの事や、=を書かないタイプの{}
による初期化はそれに該当する。
なんでも無いようでいて、可読性を下げたり危険をもたらすことがある。
2020/06/05(金) 14:41:22.49ID:rO0o1lhv
>>662
Cほどシンプルな言語もないだろ。それと簡単に使いこなせるかは別問題。
2020/06/05(金) 14:48:48.89ID:B8WhcAqO
>>671
それ仕様の変更なの?
2020/06/05(金) 14:55:26.22ID:vEUs2R05
>>666
そこに書いとるやん
This assumes the proleptic Gregorian calendar, with the year 0 being 1 BCE.

つまり-1は2 BC
2020/06/05(金) 15:08:35.22ID:8BtILZXI
Cのプリプロセッサやパーサーを書くと全然シンプルじゃないことが分かる
2020/06/05(金) 15:11:02.16ID:lHXK6is7
>>675
それは、使う側にはシンプルそうに見えるCも実は細かく見るとシンプルではないということであって、使う側目線で既に複雑なものはそれ以前の問題他。
2020/06/05(金) 15:43:45.14ID:9qGH+5zI
依存先より寿命が長くなってはいけないなんていうのは C でも当たり前のことだろ。
Rust のライフタイムはライフタイムを簡単に「表現 (したものをチェック)」する言語機能であって、
C でプログラマがやってる (はずの) ライフタイムの管理より複雑ということはない。

Rust なら処理系がチェックしてくれることを
C ではプログラマがやってたんだぞ。
C で出来てたことが Rust ではやれないってのは言語のせいか?

Rust のライフタイムの管理は制約が厳しいとか面倒くさいとかいうなら話はわかるが、
複雑だとか学習難易度が高いというのは納得しかねる。
2020/06/05(金) 15:54:02.73ID:lHXK6is7
>>677
>Rust のライフタイムの管理は制約が厳しいとか面倒くさいとかいうなら話はわかるが、
>複雑だとか学習難易度が高いというのは納得しかねる。
一つあるとすれば、難しさは、ちゃんと本も読んでいるか、ネットに書かれている情報だけに頼っているかの違いに起因している可能性。
2020/06/05(金) 21:26:05.32ID:Py5zog1r
これにて、このスレがRust関連の本の作者の巣窟であることが証明されました。
2020/06/05(金) 21:32:24.36ID:cXh0Dvtv
だいぶ前からじつは言語系のスレはほとんどソレなんだな
宣伝してるやつは気付かれれないと思ってるだろうけど
2020/06/05(金) 21:49:15.38ID:Py5zog1r
>>618
2018/11/28の時点で、

https://www.infoworld.com/article/3324488/rust-language-is-too-hard-to-learn-and-use-says-user-survey.html
ユーザーの調査によると、Rust言語は習得も使用も難しい
Rustユーザーの調査では、メモリの安全性と正確性のためにこの言語の非常に宣伝されている機能に困難と不満を感じています
Rust言語チームが実施したRustユーザーコミュニティの新しい調査では、言語とその使用への関心が高まっていますが、プロジェクトが利点として宣伝しているいくつかのRust機能に対するユーザーの不満も示されています。
Rustの習得が難しいのはなぜですか?ユーザーは、Rustの最も特徴的な2つの機能(寿命と所有権/借用システム)は、「トリッキー」、「非常に難しい」、または「まだ得られない」ものであると報告しました。
その他の質問は、Rustを続行するための課題を中心に展開されました。Rustの使用をやめた人の約半分は、わずか1か月後にそうしました。Rustを使用していない最も一般的な理由は、「威圧的すぎる、習得が難しい、または複雑すぎる」(25%)、
2020/06/05(金) 22:00:56.76ID:Py5zog1r
Rust言語は、学んだり使ったりするのが難しすぎるということが、ユーザーに対する調査で分かった。
--Rustユーザーに対する調査では、安全性と正確性のために言語が非常にうるさく押し付けてくる特長により困難と欲求不満を感じていることが分かった。

Rust language is too hard to learn and use, says user survey
A survey of Rust users finds difficulty and frustration with the language’s highly touted features for memory safety and correctness.

tout = 押し売りする, うるさく勧誘する, 客引きする
(tout for custom うるさく注文を求める.)
・切符をプレミア付きで売る, ダフ屋をやる.
・うるさく勧める.
・ほめちぎる.
2020/06/05(金) 22:04:18.63ID:Py5zog1r
誤:安全性と正確性のために言語が非常にうるさく押し付けてくる特長
誤:安全性と正確性のために言語が非常にうるさく押し付けてくる機構(機能)
2020/06/05(金) 23:15:24.59ID:9qGH+5zI
>>674
へー。 西暦にゼロ年っていうのは無いのか。
685デフォルトの名無しさん
垢版 |
2020/06/06(土) 04:00:23.67ID:Vvt5YBJp
この言語廃れてきそうな気がした。
だってみんなが触るって未来が想像できないもん
2020/06/06(土) 04:10:18.67ID:Oxqgflbz
みんなが触る言語なんて世の中に存在するか?
687デフォルトの名無しさん
垢版 |
2020/06/06(土) 05:29:47.06ID:i8tpraSw
Rustを使ったことはないけどC++は既存の資源で堅実に作るのに対して
Rustは一人のスーパープログラマが複雑高度なライブラリやモジュールを一点突破で書くのに使われそうなイメージ
2020/06/06(土) 09:51:25.89ID:9F/1KVDa
まあScalaと同じ道を辿るだろうね
あっちはビッグウェア系でそれなりに採用されてたから被害が甚大だったけど、
Rustに関してはそういうビジネス的な得意分野は今のところ無いのが救いか
2020/06/06(土) 15:58:34.19ID:HBMrgMqa
>>687
ところがスーパープログラマは、C++でもメモリー関連のバグで詰んで挫折したりすることはないんだな、これが。
2020/06/06(土) 17:06:05.01ID:58RXXUUu
>>687
Rust の偉大さのひとつには crates.io の存在がある。
資源の利用という意味じゃ Rust はかなり積極的だぞ。
2020/06/06(土) 17:17:15.77ID:P/b6XOwm
C++は標準のライブラリリポジトリと標準のビルドツールがあればなぁ、と思う。
野良のは乱立してるけど、結局ほしいライブラリはなかったりするし…。
2020/06/06(土) 17:37:45.92ID:wqdan8fc
>>688
MicrosoftもAppleも使っていくのに爆死したら
IT業界壊滅じゃね
2020/06/06(土) 18:11:03.05ID:58RXXUUu
>>691
各環境のパッケージマネージャに乗っかってることが多いからある意味では一等の地位ともいえる。
メジャーなものは apt-get とか pacman とかで一発で入るだろ。
694デフォルトの名無しさん
垢版 |
2020/06/06(土) 18:38:18.22ID:Vvt5YBJp
>>690
crates.ioがダメダメだから代替のサイトあるのってご存知でない?
2020/06/06(土) 18:42:21.81ID:nPYA670X
Webサイトの話をしてるわけじゃないだろ
2020/06/06(土) 18:56:38.50ID:7YMZq5d4
>>691
漏れは、Windows 10, WSL, Ubuntu 18.04 で、
anyenv(rbenv)で、Ruby をコンパイルするのに、build-essential を使っているけど

build-essential には、
gcc(GNU C compiler), g++(GNU C++ compiler), libc6-dev(GNU C Library), make などが入っています

パッケージ: build-essential
https://packages.ubuntu.com/ja/bionic/build-essential
2020/06/06(土) 19:37:13.44ID:P/b6XOwm
>>693
結局それってディストリビューション依存だからなぁ。
バージョンだって固定できないし、OSS拾ってきてコンパイルが通るようにするだけで試行錯誤が必要。

>>696
いや、頑張って環境構築すればなんとかなるのはその通りだけど、
別のソフトだとまた別の環境構築が必要になって辛いのです。
2020/06/06(土) 21:37:30.50ID:nFHIDUIo
Rustでプロキシーサーバー実装してみようと思ったんだけどTCPStreamとreqwest::headerの連携がうまくいかない
699696
垢版 |
2020/06/06(土) 22:21:08.03ID:7YMZq5d4
漏れは、日本人が作った、バージョンマネージャーのanyenv で、
rbenv, nodenv を使って、ruby 2.6.6, node 12.16.2 を入れた

環境構築が、各言語でバラバラになるのは面倒なので、
anyenv・asdf などを使えば?
2020/06/06(土) 23:04:13.04ID:nFHIDUIo
hyperのサンプルに答えがありました
2020/06/07(日) 00:03:49.64ID:uvQLWD0s
こんな書き込みを見つけた:
loop {
// 1. you finally understood lifetimes
// 2. you get compiler lifetime /borrow complaints
// 3. you feel stupid for taking hours to fix <5 LoC
}
2020/06/07(日) 00:19:04.85ID:uvQLWD0s
ループ {
// 1. あなたはついに lifetime を理解した。
// 2. あなたはコンパイラに lifetimeやborrow の苦情を複数個言われる。
// 3. 5行未満のコードを直すのに何時間もとられることにあなたは馬鹿馬鹿しさを感じる。
}
2020/06/07(日) 11:58:43.41ID:CPBtFfEp
コンパイラに緊縛されて未定義動作を踏まないという快感を得るプレイ
2020/06/07(日) 17:57:12.72ID:WIpxuhAg
Rsutって、早い話が、CやC++に、NULLバグ等々が発生しないようにするための補助機能がついた言語ってこと?
2020/06/07(日) 18:44:36.11ID:r/6oC92T
そうだね〜、で、俺様はNullチェックは忘れないしダングリングポインタなんて組み込まないのでC/C++で良いや
という俺様スパハカがゴミグラムを生み出してきたのでRustは必須
2020/06/07(日) 18:48:57.09ID:HzkE9Nko
>>704
書き方がC/C++の文化とはかけ離れているように感じるが。
2020/06/07(日) 19:46:37.12ID:WIpxuhAg
>>706
いや、言語誕生の思想を考えただけです。
言語誕生の思想をきちんと抑えないと、メリットとデメリットを正答に評価出来ないから
2020/06/07(日) 19:59:02.69ID:uZfe/Sta
どっちかというと「関数型C++」な印象
2020/06/07(日) 22:51:27.97ID:fhJ4vSsJ
Hindley-Milner 型推論を元にしているから考え方は ML 系統からの影響は大きいと思う。
2020/06/08(月) 02:06:14.90ID:jeqh3aBJ
C++の地獄をML(とアフィン型)の知見で楽にしようとした言語

Cの遺産を引き摺ったが故に煩雑だった前者の記法を捨てて後者のいいとこを貰ってきたので、記法が後者に似てるように見えはするけど、やってる事はそう大きく変わってはいない
2020/06/08(月) 10:53:34.76ID:KAmnJXdU
「C++ のメンバ関数の実態は this を暗黙に渡しているだけ」ってのを露骨にしたのも Rust の面白い部分だよね。
関数的な意味論を用いながらも構文糖としてのメソッド記法も用意することでオブジェクト指向的な表現が出来る。
2020/06/08(月) 13:11:59.47ID:LDYBA2kC
RustはC++ではゼロコストで出来ていたものが、出来なくなってしまっていることが多い。
2020/06/08(月) 13:14:25.82ID:KAmnJXdU
>>712
具体的には?
2020/06/08(月) 13:19:16.88ID:NanZmWBA
関数的な意味論ねぇ
表層的に一部それっぽいってだけでは?
2020/06/08(月) 13:28:01.70ID:KAmnJXdU
言語として純粋関数型に分類される Haskell ですら
オブジェクト指向のスタイルで構築されたライブラリは有るから……。
(そのためのフレームワークである lens はまあまあ人気。)

言語仕様での理屈がどうあれ最終的には使い方次第。
2020/06/08(月) 13:36:41.82ID:LDYBA2kC
>>713
言うと改善されるので言わない。
2020/06/08(月) 13:46:18.64ID:LDYBA2kC
memmove()すらunsafeなしではかけないし。
2020/06/08(月) 13:53:57.25ID:LDYBA2kC
RustではpChildがHeapにとられている時、次のようなループすら書けない。
CPerson *pChild=pPerson->pChild;
while(pChild != NULL) {
(pChildに対する処理);
pChild=pChild->pNext;
}
2020/06/08(月) 14:30:52.23ID:KAmnJXdU
>>718
こういう感じのこと?

#[derive(Default)]
struct Person {
pub childs: Box<[Person]>
}

fn main() {
let person : Person = Default::default();
let childs = person.childs;
for ref child in childs.iter() {
// child に対する処理
}
}
2020/06/08(月) 14:39:32.30ID:LDYBA2kC
>>719
Heap領域にある構造体の中に、さらにHeap領域にあるデータへの
参照を持つためにBox型のメンバが有る場合、後者のBoxは、unique_ptrなので
ローカル変数にmoveすることができないためコンパイルエラーになる。
なので、参照カウント方式のRcを使う必要がある。
2020/06/08(月) 14:44:31.30ID:LDYBA2kC
>>719 の場合だと personがスタック領域にあるが、もしそれがHeap領域に
あったとすると、
let childs = person.childs;
とするとエラーになるはずだ。
2020/06/08(月) 14:48:41.29ID:KAmnJXdU
>>721
ならない。



      (完)
2020/06/08(月) 14:53:38.92ID:faeMvMKI
チュートリアルも読まない難癖おじいちゃんの相手すんなし
2020/06/08(月) 14:56:15.14ID:LDYBA2kC
そもそも、
struct Person {
 pub child: Box<[Person]>
}
がおかしくて、正しくは、
struct Person {
 pub child: Box<Person>
 pub next: Box<Person>
}
だ。
2020/06/08(月) 14:56:44.39ID:LDYBA2kC
>>722
全く同じではないが、こっちの環境ではなったがな。
2020/06/08(月) 14:58:43.87ID:KAmnJXdU
後付けやめろよ。
C++ のどういうコードを Rust でどう書けて欲しい (そして実際にはどういうエラーになる) のかちゃんと書け。



いや、書くな。 (どうせ見当違いなので。)
2020/06/08(月) 15:03:12.27ID:LDYBA2kC
>>725
#[derive(Debug)]
struct TAaa {
  x: Box<i32>,
  y: i32
}
fn main() {
  let mut vec:Vec<TAaa> = Vec::new();
  vec.push( TAaa {
    x : Box::new(333),
    y : 444
  } );
  let   x  = vec[0].x; // error[E0507]: cannot move out of index of `std::vec::Vec<TAaa>`
  println!("{:#?}", x);
}
↑のように vec をHeapに確保した場合、エラーになる。
ところが、stackに確保した場合はエラーにならない。
実験済み。
2020/06/08(月) 15:04:31.00ID:LDYBA2kC
>>726
海外のサイトでも、RustはC/C++から単純移行ができ無い事が問題とされている。
FortranからCへは単純移行が出来たからCが普及したと書いてあった。
2020/06/08(月) 15:16:36.76ID:LDYBA2kC
>>726
後付ではない。
C++で、pChild、pNextと言えば、当然そういう構造体になる。
2020/06/08(月) 15:47:14.20ID:KAmnJXdU
>>727
型・寿命・所有権の条件が同じならヒープかスタックかというのは関係ない。
お前が結果的に違う条件で書いるだけ。

>>728
知らんがな。
同じように書けるんなら新しい言語を導入する意味ないだろ。
制約が厳しい替わりに問題点が検出されやすいのが Rust の利点なんだから、
その利点が要らんなら別に Rust を使わんでいいよ。
2020/06/08(月) 16:43:05.54ID:LDYBA2kC
>>730
>型・寿命・所有権の条件が同じならヒープかスタックかというのは関係ない。
>お前が結果的に違う条件で書いるだけ。
1.実験してみたところ、>>727でBoxをRcに変えてもエラーのままだった。
2.単純にTAaaをスタックに確保した場合、正常にコンパイルされた。
3.TAaaを以下のようにHeapに確保した場合も、正常にコンパイルされた:
fn main() {
let bbb = Box::new( TAaa {
x : Box::new(333),
y : 444
} );
println!( "bbb = {:#?}", bbb );
println!( "bbb.x = {:#?}", bbb.x );
println!( "let x = bbb.x;" );
let x = bbb.x;
println!( "x = {:#?}", x );
}
つまり、Vec<TAaa>の場合にだけエラーになる。
2020/06/08(月) 16:57:23.12ID:KAmnJXdU
>>731
ついでに言えば >>727 のエラーが出る行を

let ref x = vec[0].x;

とか

let x = vec.swap_remove(0);

とか

let x = vec[0].x.clone();

とかすることでもコンパイルは通る。
2020/06/08(月) 17:21:28.18ID:LDYBA2kC
>>732
>let x = vec.swap_remove(0);
let x = vec.swap_remove(0).x
のことかな?
2020/06/08(月) 17:33:12.05ID:7lLHeGo6
rustじゃ書けないおじさんのコードを添削する流れ、何度目だ
2020/06/08(月) 18:00:02.94ID:ZyH0cWN6
std::mem::take
2020/06/08(月) 18:06:13.25ID:KAmnJXdU
>>733
おっと、せやな。
.x が無くてもコンパイルは通ってしまうからミスったわ。
2020/06/08(月) 18:15:14.24ID:OI3JiiYN
ID真っ赤、お顔も真っ赤w
2020/06/08(月) 18:20:45.97ID:KAmnJXdU
>>734
ワイも初心者ではあるんよ。
The book (第二版の日本語訳の無料で読めるやつ) を読み終わって、試しに 500 行くらいのコードを書いてみたって程度。
本を読んでいる間はコードを書いてない。
手を動かすと理解しやすいという人も多いけど、
感覚でやってしまいがちで書いてある理屈をしっかり把握するのが疎かになる気がするから。

で、 The book を読めばこの程度には理解できるので理解できてないやつは単にアホという証明でもあるし、
逆に返答に詰るようなら俺がまだ入門級のことが理解できてない (どこが理解できていないか) ことがわかるので
練習の題材としてちょうどいいわという気持ちで相手してた。
2020/06/08(月) 18:37:00.38ID:LDYBA2kC
>>738
では、>>732
>let ref x = vec[0].x;
の borrow が合法かどうか、どうやってコンパイラが静的に解析しているか
アルゴリズムを説明してみてください。
2020/06/08(月) 21:16:08.81ID:KAmnJXdU
>>739
let ref というのは直接的には The book に出てこないと思うけど、
let もパターンマッチだということはタプルの項目で示されている。
たとえば let a = &1; と書いたら a には 1 の参照が入るし、
let &a = &1; と書いたら a は (参照を経由する) 値になる。

参照にマッチするのではなく値にマッチさせた上で参照が欲しいときに使うのが
ref であるということは match の説明の中にある。
つまりこの場合に let ref x = vec[0].x; というのは
let x = &(vec[0].x); と書くのと理屈は同じ。
741デフォルトの名無しさん
垢版 |
2020/06/08(月) 21:34:44.64ID:RC1s4U+D
公式で丁寧にしかも無料で公開されてる本もろくに読めないガイジたちがわらわらするスレになっちまったな
ちょっと名が知れ渡っただけでこんなことになんだから、一般的になったらとんでもないな
2020/06/08(月) 22:57:09.22ID:42GeKV2i
rust+wasmちょっとやってみたけど、単純な処理に記述だけが無駄に複雑になりすぎる
組み込みとかシステム系で使われそうだけど、一般的とか言う広く色々な使われ方はしないだろコレ
743デフォルトの名無しさん
垢版 |
2020/06/08(月) 23:32:06.17ID:RC1s4U+D
JSみたいに直接DOM触れて、直接実行できるなら普及するけど、現状のめんどくささならなぁ・・・
2020/06/09(火) 00:44:22.52ID:SETbyCsO
>>740
それは分かっている。
iとjがループ内で変化したような場合、
vec[i].x
からmutableで借用した場合、
vec[j].x
からimmutableで借用できるかどうかの判定をコンパイラが一般的に行うのが難しいんだよ。
だからそのアルゴリズムを理解しているのかと聞いている。
2020/06/09(火) 00:52:40.12ID:SETbyCsO
>>744
似た例で言えば、
dst[i]をmutableで借用した場合、src[i]をimmutableで借用しようとしたときに、
srcとdstが同じアドレスに被って無いかの判定が静的には物凄く難しいと
されているので、エラーになってしまうかも知れないというようなことを心配
しているんだよ。
2020/06/09(火) 01:01:34.80ID:SETbyCsO
>>745
もっとちゃんと書くと、
src[0]〜src[99]までに対して処理するような場合だと、src[i]をaに借用してから
f(a)、g(a)、h(a)に順番に渡して何か処理するようなことは出来ると思われるが、
ここに、dst[0]〜dst[99]も加わって、dst[j]をbにmutableで借用
しようとすると、mutableで借用した場合にimmutableでは借用できないというルールを
この場合にはコンパイラが静的には判断できなくなってコンパイル・エラーになって
しまう可能性を心配している。

つまり、コンパイルの借用チェッカは、予めよくあるパターンに対して特別な
処理を実装している場合には通るが、一般的には判断できるわけ無いので通らない
のではないかと考えられるんだよ。
2020/06/09(火) 08:06:27.82ID:5kLCq/P0
このページに唐突にRustの話が出てくるのウケるな
https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/Debugging_HTML
748デフォルトの名無しさん
垢版 |
2020/06/09(火) 08:13:44.15ID:H8Y2HqIE
let x = 5;
println!("{}", if 0 < x < 10 { "in" } else { "out" });
この比較方法ができない理由ってなんかある?例えば最適化に響く?とか
可読性も労力もこれ出来たほうがいいと思うんだけど
2020/06/09(火) 10:15:42.01ID:DLyUUrRW
最初の比較でBoolになってんのを整数と比較してるからじぇね?
特に可読性が上がるとも思わないし、むしろ老眼で見逃す勢が出るから&&挟んだ方が見やすいな
2020/06/09(火) 10:25:43.24ID:ORTIF4By
その書き方ができる言語は割と少数派な気がする
pythonではできるが
2020/06/09(火) 10:40:14.84ID:0Ox9n+fW
a < x > b
これを見て何がしたいのか直感的に理解できる人間は多数派ではないだろう
結局 lb < x < ub のパターンしか使わないんなら range で十分
2020/06/09(火) 10:58:25.83ID:hxMyXunA
>>744-746
こういう感じの話? (※ 構造体を介する意味がないのでこの例では省略)

fn bar(vec: &mut Vec<usize>, i: usize, j: usize) {
let ref x = vec[i];
let ref mut y = vec[j]; // エラー
println!("{:#?} {:#?}", x, y);
}

fn main() {
let mut vec: Vec<usize> = vec![1, 2, 3];
bar(&mut vec, 0, 1);
}

vec の所有権が貸し出されるので一律に出来ない。
可能性を心配する必要はないよ。
普通の借用ルールが適用されて確実に出来ない。 (unsafe を使わない限り。)
2020/06/09(火) 13:10:15.38ID:wU3msb4d
このスレで赤連投してんのこいつとこいつか???
https://twitter.com/YutakaAoki3
https://twitter.com/SFITB
https://twitter.com/5chan_nel (5ch newer account)
754デフォルトの名無しさん
垢版 |
2020/06/09(火) 14:37:23.22ID:H8Y2HqIE
しかもそいつら繋がってんのな、Rust大嫌いなのに隠してここでやりとりしてんのな
とりあえず二人とも気持ち悪いからミュート、ブロックした
https://qiita.com/Yutaka_Aoki
https://qiita.com/SFITB
2020/06/09(火) 14:41:22.18ID:1+p+UWLN
ここはrust信者しか書き込んだらいかんらしい
2020/06/09(火) 15:07:39.63ID:FNvqfpCR
少なくともMozillaのステマが〜とか言ってた頃よりだいぶましだと思うが。
2020/06/09(火) 15:54:45.21ID:1XBt8hKf
えぇ
どっから特定されたの
2020/06/09(火) 19:23:53.82ID:9Q2vOhVs
dropが飴玉みたいって批判?がちょっと面白かった。
その発想はなかった的な。
2020/06/09(火) 20:40:17.08ID:hxMyXunA
drop out とか drop off とかのニュアンスでしょ?
スコープから消えろという意味での drop であって、結果的に解体もするというのは実装側の都合だよな。
その型を利用する側の都合からするとただ消えろって話なので、drop という語をあてるのは Rust 的にはそこそこ妥当な選択だと思える。
やることが同じだから同じというのは抽象化を軽視する暴論だ。
2020/06/09(火) 23:30:17.61ID:dBtT67N+
linuxカーネルでキャッシュをドロップする、みたいなのが用法としては近いのかな。
2020/06/10(水) 01:57:37.96ID:EI8iQv9S
>>756
https://twitter.com/YutakaAoki3/status/1270069950581858309
同一人物説

dropって命名はかなり絶妙だと思う。
時点でscoped outから取ってoutとかがいいと思うけど、outだけだと抽象的すぎるからdropが一番いい
https://twitter.com/5chan_nel (5ch newer account)
2020/06/10(水) 02:51:12.39ID:Zbkl4OJ9
そもそもdropって表現使ってる言語なんかなかったっけ??
2020/06/10(水) 08:25:50.22ID:uVgELRDi
ネイティブが決めた名前をJapsが文句言うのは流石に草
2020/06/10(水) 09:37:48.27ID:2ezYpnf+
実際にプログラミングするのは英語話者ばかりではないので
既に浸透した用語を使って欲しいというのはわからんでもないんだが、
似て非なるものに同じ名前を与えると調べにくかったりすることもあるしなぁ。

他の言語からの「移行」という視線でばかり見ていると良くなった部分も移行コストに見えてしまうんだなというのはわかった。
2020/06/10(水) 10:10:31.54ID:XLjKTHkb
そもそもdropについて言えば既存の言語でも
free, delete, dispose, finalizeとバラバラなので
浸透もクソもない。
2020/06/10(水) 10:24:08.29ID:2ezYpnf+
それぞれの用語の大まかな使い分けはあるけども、
じゃあ drop がそのどれかに当てはまるかといえば当てはまらないし。
2020/06/10(水) 12:27:01.09ID:wKk8b9p0
qiitaの記事数は、Rustに対し、Goが8倍、Kotlinが1.5倍、C++が50倍、Javaが16倍。
唯一、Haskelに対しては、Rustは、100倍以上の記事数がある。
2020/06/10(水) 18:15:57.47ID:2ezYpnf+
>>767
それがどしたんや
2020/06/10(水) 18:22:57.35ID:eINpUyJE
Haskelは触ったことのある人数で言えばRustよりずっと多いだろうけど、マサカリが怖くて記事書きづらいんだろう
2020/06/10(水) 23:07:45.91ID:7cbxIbSc
まず FireFox 表記をやめろ
771デフォルトの名無しさん
垢版 |
2020/06/11(木) 05:09:15.88ID:LlBqG++A
宣言型マクロでRustの処理書けない理由ってある?
今のパターンマッチ風構文で作ったから処理文入れるところがない的な?
2020/06/11(木) 14:25:13.16ID:5qmGy9Sy
「Rust」はなぜ人気があるのか、Stack Overflowがユーザーのコメントを紹介
https://www.atmarkit.co.jp/ait/articles/2006/11/news051.html
2020/06/11(木) 15:19:33.86ID:EKtCO5aX
ガチ関数型と違って難しいポイントはただ複雑なだけなので、頭悪くても慣れさえすればマウンティングしやすいのが人気の理由だと思ってる
2020/06/11(木) 17:27:55.76ID:Th6rh/3U
「一番愛する言語」と聞かれたら、C++もC#もJSもPythonも全面的に好きで
使ってるわけではないから、消去法でRustを選ぶしかない。
そもそも愛すべき言語なんて一般人にはあるわけ無いし。
Rustだったら「愛すべき」と公表しても馬鹿にされないで済むみたいな。
他のどの言語を選んでも、白い目で見られそうだから。
775587
垢版 |
2020/06/11(木) 17:33:10.59ID:7wv0rqaB
ドキュメントを眺めてたら >>587 は Nightly ではこんな感じで書けるかなって思った。

https://play.rust-lang.org/?version=nightly&;mode=debug&edition=2018&gist=75b0cca2f785445e707b113c1bce3b55
2020/06/11(木) 17:43:19.49ID:VpmD2Oc5
>>774
SOのサーベイのことをいってるなら、あれは別に「愛する言語は何ですか?」というアンケートではないので「愛する」と日本語で考えてもあまり意味ないぞ。

いまRustを使っていて今後も使い続けたいですか?という質問の集計結果をmost loved languageと表現してるだけ。
だから仕事で(嫌々でも)使わざるを得ない言語は低く出るし、Rustみたいに趣味で選んでる言語は高く出るのだろう。
2020/06/11(木) 22:59:22.90ID:Th6rh/3U
>>776
Rustを愛すると答えた人でも、 使っている人は5%程度しかいないと書いてあったから、
「いまRustを使っていて今後も使い続けたいですか?という質問の集計結果」
とは違うはずだ。
使って無い人も「好き」と言えた訳だから。
2020/06/11(木) 23:08:36.19ID:lDcKCiP3
>>777
ちょっと正確な質問は忘れたけど、
問1 最近よく使う言語はなんですか?
問2 その言語を今後も使い続けたいですか?
みたいな質問で、1でRustと答えた人の86%が2でyesと答えたって話。
(で、その86%ってのが全言語で1位だった)

なので5%の人しか使ってないというのとは別に矛盾しないし、
Rustを使ってない人の意見はそもそも反映されない。
2020/06/11(木) 23:14:58.90ID:lDcKCiP3
このあたり元のアンケートに答えた人や
SOのレポートを隅々まで読んだ人なら分かるんだけど
ニュースサイトの伝言ゲームで「最も人気のある言語」とかになってしまうと
ものすごく語弊があるんだよな。
2020/06/11(木) 23:41:02.95ID:Th6rh/3U
>>778
あれ? 
それだと、全体の母集団の中でRustを使っている人が5%ということになってしまい、
「Rustが好きです」、と答えた人でも 95%が使ってないということとは違ってくるよ。
2020/06/11(木) 23:47:20.09ID:lDcKCiP3
>>780
使ってる人が5%というのは合ってて、
その5%のうちの86%が今後も使いたいってこと。
だからRustを好きな人が多いんじゃなくて、好きな人の割合が高いというだけ。
実際に好きな人の絶対数でいけば、ユーザーの多いPythonとかが圧勝だと思う。
2020/06/11(木) 23:51:33.67ID:Th6rh/3U
>>781
あなたはもしかして数学苦手ですか?
2020/06/12(金) 02:00:09.52ID:3QRVSzSK
>>775
Default::default() が panic したときに drop で未初期化領域アクセスして UB になりそう
784587
垢版 |
2020/06/12(金) 15:38:31.69ID:Du26dNpG
>>783
unwind の段階でってことですか?
2020/06/12(金) 20:41:45.45ID:3QRVSzSK
>>784
そう
何らかの工夫を入れないといけない気がする
2020/06/12(金) 22:06:49.25ID:ROT3upn7
要素がMaybeUninitなので未初期化領域にアクセスすることはないだろうけど、逆に初期化済みの領域が解放されずに残るような?
787587
垢版 |
2020/06/12(金) 22:21:06.94ID:Du26dNpG
>>786
panic したときのことなので UB でさえなければメモリが解放されないのは問題にならないと思いますが。
2020/06/12(金) 22:37:53.36ID:dTuswZtd
copylessっつうcrateがあるからそれ使うか参考にするといいかもよ
789デフォルトの名無しさん
垢版 |
2020/06/13(土) 09:06:43.07ID:4a9xUc1f
>>783
Default::default() が panic起こす実装してるからUB以前にそこを直すべきだと思うけど違う?
2020/06/14(日) 08:51:59.74ID:GVwShxqI
playgroundで手続きマクロ書きたいんだけど
#![crate_type="proc-macro"]
で出来なくてCargo.tomlも触れないから変更出来ないんだけどどうやっても触れない??
2020/06/16(火) 19:24:13.66ID:BP9MVREP
弱参照を多用する人っていないの?unsafeが基本?
2020/06/18(木) 05:25:57.31ID:K1rCi1si
Rust楽しい言語だな
https://github.com/rust-random/rand/blob/2c2fbd6463bb3dba492d0387f05f953bdc297d2f/rand_chacha/src/chacha.rs#L32
2020/06/21(日) 01:44:24.45ID:KswBNjV4
こういうコードを書いててどこを直せばいいかわかんないので教えてーー

https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=4ce583191e5b07279b8ec65ef5198456

AddAssign の型引数のところに与えてるライフタイムがおかしいとは思うんだけど、
どう直せばいいかわかんない。
この書き方だと += の左辺以上の寿命を右辺が持ってるという意味になるの?
794デフォルトの名無しさん
垢版 |
2020/06/21(日) 20:32:40.47ID:pHqBLLSo
あんまり詳しくないけど、ライフタイムのその書き方でエラーなるってバグじゃない?(推論力の問題?)
個人的に気になるから詳しい人教えて欲しいな

一応これで治るけど
impl<T: AddAssign<T> + From<usize> + Clone> Iterator for Fibonacci<T> {
type Item = T;
fn next(&mut self) -> Option<T> {
swap(&mut self.f0, &mut self.f1);
self.f1 += self.f0.clone();
Some(self.f0.clone())
}
}
795793
垢版 |
2020/06/21(日) 21:05:29.71ID:KswBNjV4
デフォルトで usize を基礎に据えているんですが、 BigUint なども効率的に扱いたいので
clone はなるべく少なくしたいという意図で参照で受け取る AddAssign を前提にしたいんですよね……。
2020/06/21(日) 22:00:26.97ID:T8Yrab8u
>>793
これでどう?

impl<T> Iterator for Fibonacci<T>
where
T: From<usize> + Clone,
T: for<'a> AddAssign<&'a T>
797793
垢版 |
2020/06/21(日) 22:48:41.52ID:KswBNjV4
>>796
期待通り動きました!
for の使い方について調べたところこのへんにあるのを見つけたのですが、
どうにもはっきりとは理解できてないです。

https://doc.rust-lang.org/nomicon/hrtb.html

AddAssign が必要とされる個別の場面まで寿命の推測を遅らせるみたいな感じですかね?
798793
垢版 |
2020/06/21(日) 23:47:24.24ID:KswBNjV4
むしろ >>793 がどう解釈されてしまっていたのかにも解説が欲しい……
799793
垢版 |
2020/06/22(月) 00:26:04.06ID:H8+bL0cM
なんか見覚えある気がすると思って考えてたんだけど、
Haskell の forall と似てるんだな。
>>793 だと Fibonacci<T> の T の制約として解釈されてしまうから、
'a は Fibonacci<T> と同じ寿命ってことになっちゃうわけか。
2020/06/23(火) 23:09:33.48ID:ImTRmBX4
あるフォルダーに入っているファイルをWeb経由で見れるようにしたいのだがそういったことができるクレートあったりしますか?

現在Actix+teraで実装しようと考えていますがなかなかうまくいかないので・・・
2020/06/24(水) 02:24:42.93ID:ak6DHXg2
python3 -m http.server 8000
802デフォルトの名無しさん
垢版 |
2020/06/24(水) 03:07:05.31ID:tDxYjRXk
actix-webとactix-filesではだめなの
2020/06/24(水) 03:37:50.70ID:rM4tv+8j
Ruby なら、コマンドプロンプト・PowerShell から、1-liner で、
Rubyで作られた遅いウェブサーバー、WEBrick が起動する

ruby -run -e httpd . -p 8080

そのフォルダに、index.html があれば、これでブラウザからアクセスできる

http://localhost:8080
2020/06/24(水) 10:36:40.30ID:l/oN1z1j
>>803
rustのスレまで出張ってくるなよジジイ
2020/06/24(水) 12:04:47.26ID:4T6/LA8J
なぜrustでactix+tera を使いたいのか
学習目的?
2020/06/24(水) 13:42:57.67ID:zkd3Aeky
そういや、actixの作者がやる気なくしてた問題は解決したの?
2020/06/24(水) 14:34:48.81ID:rnWT6W+j
あの「とほほのWWW入門」に「Rust」と「Go言語」の入門コンテンツ追加へ【やじうまWatch】 - INTERNET Watch
https://internet.watch.impress.co.jp/docs/yajiuma/1260986.html

このサイトまだあったんだな
2020/06/24(水) 19:37:44.39ID:hh4NKeEg
>>805
あのテンプレートの書き方がDjangoに似てたので・・・(じゃあPythonでやれっていうのはなしで)


別に使わなくてもできるのならそれでいいんですが
2020/06/25(木) 18:06:43.52ID:8MiElZj2
warpがおすすめ
2020/06/26(金) 04:24:36.46ID:rzSuBmAQ
この前作ったツールではrouilleを使った
CLIツールにおまけのWeb UIを付けるため

シンプルで良かった
2020/06/29(月) 22:50:20.59ID:1itP0QVJ
アプリケーションの設定を管理するようなライブラリで変更時に知らせてくれるような機能があるのってgioクレートのSettings以外になんかありませんか?
812デフォルトの名無しさん
垢版 |
2020/06/30(火) 15:14:43.19ID:oMNW4x3G
const fn b(s: &'static str) -> usize {
s.len()
}
fn a(s: &'static str) -> usize {
b(s)
}
a("c");
const fn のこの例ってこの下に置き換えられる?
それともaがconstじゃないから置き換わらない?
fn a(s: &'static str) -> usize {
1
}
2020/06/30(火) 17:20:04.74ID:SQ1ey2jp
>>812
定数伝搬の最適化はconstとは関係なくかかるので
その例なら1になるかと。
const fnはconst値にバインドできるかどうか、というだけのはず。
814デフォルトの名無しさん
垢版 |
2020/06/30(火) 20:47:08.92ID:oMNW4x3G
>>813
じゃあハッシュテーブルとかのキー定数とかもコンパイル時にハッシュになってるの?
2020/07/01(水) 01:46:25.16ID:0X9xkDpt
ハッシュ値の生成に乱数使ってるからコンパイル時には決定できないはず
const fn な hasher が仮に存在するならハッシュ値まで生成されるかもしれなち
2020/07/01(水) 01:50:31.70ID:lPEzgDRr
>>815
乱数使ったらハッシュにならんだろ…
2020/07/01(水) 02:44:47.36ID:GH5MkCrA
>>816
ハッシュに乱数を混ぜるのは普通にある。
もちろんそのハッシュテーブルの寿命の間は一貫した値を使うけど。
2020/07/01(水) 09:56:23.65ID:QVn8MqAi
普通に、はなくね?
素数のマジックナンバーと比較してデメリットしかない
汎用性が下がる
コードが煩雑になる
テーブルサイズの整数倍になって効率低下する確率が上がる
2020/07/01(水) 10:24:41.03ID:dg6nNgDG
>>817
>ハッシュテーブルの寿命の間は一貫した値を使うけど。
キーの値から、ハッシュ値を計算する際、乱数を使っていて、
一貫した値をどうやって取得するの。

// pszKey = キーの0終端文字列
// 戻り値 = キーに対応した Hash値
DWORD CalcHash( const char *pszKey )
{
  DWORD hash;
  ・・・
  hash += 乱数; // こんな風にして、どうやって一貫性を確保する??
  ・・・
  return hash;
}
2020/07/01(水) 10:30:07.77ID:0X9xkDpt
hasherの初期化に乱数使う
ハッシュ値の生成のされ方が決定的だと
ユーザーが悪意のある入力列を与えることでハッシュ値の衝突を起こしてシステム負荷を高めるような攻撃ができちゃうのよ
それを避けるために多くの処理系では hasher の初期化に乱数を使ってハッシュ値の生成のされ方を予測しにくいようにしている
2020/07/01(水) 10:31:35.11ID:0X9xkDpt
乱数使うのは hasher の初期化だけで、
その後のハッシュ値計算は当然乱数は使わない
2020/07/01(水) 10:34:05.17ID:v1S9dNm/
なるほど
2020/07/01(水) 13:21:11.84ID:gL8G43CT
>>820
正直すまんかった
824デフォルトの名無しさん
垢版 |
2020/07/01(水) 20:39:53.77ID:LmVeoJWH
システム負荷を高めるような攻撃を回避するのって初期化に乱数使うとかじゃなくて、ハッシュテーブルの実装次第じゃね?
システム再起動の時に乱数で変わってたら保存してるハッシュと違くなるって整合性ぐちゃぐちゃすぎる

ちなみにRustは初期化に乱数使ってないけどどの言語がそれに当たるの?

悪いけどホラ吹いてるようにしてみえない
825デフォルトの名無しさん
垢版 |
2020/07/01(水) 21:21:04.78ID:V2OaFanu
ソルト
2020/07/01(水) 21:27:38.74ID:JqIYLyXt
>>824
By default, HashMap uses a hashing algorithm selected to provide resistance against HashDoS attacks. The algorithm is randomly seeded and …
https://doc.rust-lang.org/std/collections/hash_map/struct.HashMap.html
827デフォルトの名無しさん
垢版 |
2020/07/01(水) 21:35:15.59ID:JRtBzTKp
ハッシュの生成はアルゴリズムに対して決定的なんだからハッシャーがどうのなんて馬鹿げてる
2020/07/02(木) 00:00:35.12ID:53deMRLD
Result<T,E> を要素とするイテレータを Result<Vec<T>,E> にしたくて、
よくありそうなパターンだと思うんだけどさらっと上手くやる方法ってないもんかな?
2020/07/02(木) 00:03:26.32ID:/WjV7J8q
>>828
collectがいい感じにやってくれるよ。
830デフォルトの名無しさん
垢版 |
2020/07/02(木) 01:46:12.20ID:T8l/o3UF
collect::<Result<Vec<_>, _>>()
831デフォルトの名無しさん
垢版 |
2020/07/02(木) 10:10:47.16ID:O6Sxhm4J
毎回乱数使ってるなら画面更新するたびにハッシュ変わるはずだよね?
https://play.rust-lang.org/?code=%23!%5Ballow(unused)%5D%0Afn%20main()%20%7B%0Ause%20std%3A%3Acollections%3A%3Ahash_map%3A%3ADefaultHasher%3B%0Ause%20std%3A%3Ahash%3A%3AHasher%3B%0A%0Alet%20mut%20hasher%20%3D%20DefaultHasher%3A%3Anew()%3B%0Alet%20data%20%3D%20%5B0x01%2C%200x23%2C%200x45%2C%200x67%2C%200x89%2C%200xab%2C%200xcd%2C%200xef%5D%3B%0A%0Ahasher.write(%26data)%3B%0A%0Aprintln!(%22Hash%20is%20%7B%3Ax%7D!%22%2C%20hasher.finish())%3B%0A%7D&edition=2018
変わらないよ?
2020/07/02(木) 10:42:54.83ID:NJoiTLER
>>831
HashMapと同じことをしたいなら、RandomStateからbuild_hasherでhasherを得ればよい。別に画面更新しなくてもRUN押す度に変わるよ。
2020/07/02(木) 10:47:40.50ID:NJoiTLER
ちなみにDefaultHasher::newで変わらないのは、単に内部的にSipHasher13::new_with_keys(0,0)を呼んでるから。
RandomStateがその0,0をランダムに変えている。
2020/07/02(木) 12:36:00.56ID:2uT/XA4a
Hash値の計算そのものも、本当はかなり速度が求められるものなので、それを
自在に変えるというのはどうやっているのか興味が有る。
Hash値そのものの計算は、遅いわけではないが、それでも膨大なデータを処理する
場合には、その問題になることがある。
835デフォルトの名無しさん
垢版 |
2020/07/02(木) 14:34:38.77ID:O6Sxhm4J
SipHasher13::new_with_keys(0,0)はソルト?シード?
2020/07/02(木) 18:18:58.79ID:53deMRLD
>>830
えっ、それでいけたんだ……。
知らんかった。
2020/07/02(木) 20:30:51.40ID:Smy47/2H
collect() があれば何でも出来る
2020/07/02(木) 21:18:08.94ID:16GApxSC
>>835
https://131002.net/siphash/siphash.pdf
これを読んだうえで好きに呼べばいい。
2020/07/02(木) 22:08:07.26ID:Er9yjZwy
collectが中でやってる事って std::convert::from か?
2020/07/03(金) 01:32:48.51ID:A3vf6ary
>>839
FromIterator::from_iter呼んでる
From呼ばれるかどうかはFromIteratorの実相次第だけど
普通はIterator::Itemがそのままコレクションのデータ型になるから呼ばれないと思う
2020/07/04(土) 01:28:15.59ID:MbDjr1Zt
これがコンパイルエラーになる(sum::<i64>()としないといけない)のってなんでですか?
let s: i64 = (0i64..10).sum() + 10i64;

推論できる材料は十分に見えるんですけども

ちなみにこれなら通ります
let s: i64 = (0..10).sum();
842デフォルトの名無しさん
垢版 |
2020/07/04(土) 07:36:29.64ID:mye4TJ7/
rangeはusizeだから
2020/07/04(土) 15:11:36.89ID:O/jhkl6h
>>841
ここに理由書いてるけど、詳しくはわからん

At the moment, we always refuse to guess the "self" type, so we just stop there.
For other type parameters, if Self is known, we will sometimes infer them based on Self
https://github.com/rust-lang/rust/issues/25094#issuecomment-304079316
2020/07/04(土) 22:58:43.94ID:6lRd4tzg
>>843
下位互換失うからじゃね?

>because it leads to regressions when new impls are added.
2020/07/05(日) 01:30:45.53ID:SD7XkwQZ
今までターボフィッシュで型指定しなくても動いてたものが
新しいimpl追加によって型指定がないと動かなくなるケースがあるというのは理解できる

ただ(0i64..10).sum()のケースはiter::Iterator::sumやiter::Sumの定義から
各要素がi64だと決まってる限り新しいimplが追加されても結果の型もi64にしかならないと思うんだよね

//iter::Iterator::sum
fn sum<S>(self) -> S where Self: Sized, S: Sum<Self::Item>
{
Sum::sum(self)
}

//iter::Sum
pub trait Sum<A = Self>: Sized {
fn sum<I: Iterator<Item = A>>(iter: I) -> Self;
}
846デフォルトの名無しさん
垢版 |
2020/07/05(日) 23:04:09.03ID:HzchPVMd
>>845
まず、

1) inference type(推論された型)と宣言時や実行時の型は別なんで、実行時の型はあくまで推論された型の外延でしかない。
すると、別の型互換のルール(たとえば、部分多相とか)がないと互換の型とみなせない。

2) 公開された部分を推論すると将来の変更で1)から互換性を失う場合がある。
最近型推論導入した言語が公開関数のシグネチャ等を推論しないのはこの問題が理由だと思う。

>ただ(0i64..10).sum()のケースはiter::Iterator::sumやiter::Sumの定義から
>各要素がi64だと決まってる限り新しいimplが追加されても結果の型もi64にしかならないと思うんだよね
これは単にメソッド呼び出しの生成規則: expr0 ". " expr2 [Turbofish] "()" のexpr0から推論しないルールが既にあるからできないだけじゃないの?
これを拡張すると2)から互換性を失う可能性がある。公開された型と関数のシグネチャに依存してるんで。
2020/07/06(月) 00:48:42.43ID:v1x+2Pdq
ぶぶんたそー
まれいたそー
848デフォルトの名無しさん
垢版 |
2020/07/09(木) 06:01:23.92ID:OnQC9Em2
Rustの構文を自分でPython風にしてるんだけど、このwhereのとこの構文がどうも末尾:と相性悪くてどうしたら綺麗になるか教えて欲しい。
問題点
* Self: Sizedの型指定の:と被る(引数の型はかっこに埋まってるからいい)
* 一行目の関数宣言の:があるのに二行目でもwhere使うために:がある(二行続くのは英文法的にもおかしい)
* whereの構文ルールが曖昧(改行入れたりできる) -> だから統一したい
fn sum<S>(self) -> S:
where Self: Sized, S: Sum<Self::Item>:
Sum::sum(self)
2020/07/09(木) 19:57:31.40ID:/c0BYhMm
Rust にトランスパイルされる Python 風構文の言語を作っているということかな?

fn sum<S>(self) -> S
where Self(Sized), S(Sum<Self::Item>):
Sum::sum(self)

こんな感じで class の継承っぽく書くのはいかが
850デフォルトの名無しさん
垢版 |
2020/07/09(木) 20:52:03.73ID:OnQC9Em2
そう、そういう言語作ってる最中。
たしかにその構文もいいね!でもstruct S(i32);に見た目上だけど被るのと、トレイトのfn name<T: Num>とかも構文変える必要でてくるなぁ
個人的にはトレイトベースの言語だからT: Numは変えたくないだよね
こういうのもいいかも
fn sum<S>(self) -> S,
(Self: Sized, S: Sum<Self::Item>):

whereと同じような機能でしっくりくる構文持ってる他言語とかないのかなぁ
2020/07/11(土) 09:57:59.11ID:4UmqnUG/
Haskell 風にするとかどうよ
852デフォルトの名無しさん
垢版 |
2020/07/11(土) 19:10:01.60ID:F8ozXmMr
Winrtよく知らないんだけどWindows環境でGUI簡単にいじれるようになったの?
2020/07/11(土) 19:28:45.72ID:9BHbJ5O9
どうせマクロ地獄だろ
854デフォルトの名無しさん
垢版 |
2020/07/14(火) 15:40:35.77ID:GDMj7Uve
let delta = input[0] - input[1];
println!("{}{}", if delta == 0 { "" } else if delta > 0 { "-" } else { "+" }, delta.abs());
このif delta == 0 { "" } else if delta > 0 { "-" } else { "+" }の綺麗な順番とかの定石の書き方ってある?
2020/07/14(火) 16:21:46.36ID:0FZUPBc1
match delta.cmp(&0) {
std::cmp::Ordering::Equal => "",
std::cmp::Ordering::Greater => "-",
std::cmp::Ordering::Less => "+",
}
2020/07/14(火) 18:24:58.52ID:Ott4Q6kl
n == 0の時だけ記号なしにしてそれ以外は{:+}でフォーマット
(n > 0の時だけ{:+}にするのでも結果は同じ)
857デフォルトの名無しさん
垢版 |
2020/07/14(火) 20:20:46.59ID:GDMj7Uve
>>855
>>856
ありがとう、両方いいね!
2020/07/15(水) 17:09:04.17ID:xmMpR3Y8
msvcとgnuってどっちにすべきなん?
2020/07/15(水) 20:29:35.32ID:hr2ndtrb
両方有るってことはどっちにでも出来るってこった。
どちらかが良いなんてことはない。
2020/07/15(水) 21:20:40.13ID:a3wypoik
rustコンパイルできないけどな
2020/07/16(木) 01:35:03.21ID:ky3/glay
以下のコードでクロージャclの引数に型推論が効かないのってなんでですか?
fn main() {
let vv = vec![vec![1, 2, 3]; 4];
let cl = |a, b, c, d| vv[a][b] + vv[c][d];
//error[E0282]: type annotations needed
println!("{}", cl(3usize, 1usize, 2usize, 2usize))

}
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=a49b194930fcdfd894c2be4fc078be80

クロージャclの引数のところを |a: usize, b, c: usize, d| とすればコンパイルは通るのですが、aとcだけ型注釈が必要になるのも意味がわからないです
2020/07/16(木) 23:09:40.63ID:NQlI+enB
jsonをパースして、その中身に対して更に値を追加し
最後にはまたjsonでシリアライズということをやりたいのですが、
serdeだと事前に入力と出力の型を定義していないと難しいですか?

from_stringでValue型に入れて、mapのようにキー名で値を取れることは分かったのですが
そこに新たに値を追加する方法がわからないです
863デフォルトの名無しさん
垢版 |
2020/07/16(木) 23:23:19.49ID:iYXNZZst
as_object_mut
あたりかな
2020/07/17(金) 00:05:43.64ID:wlvhc7i8
https://blog.rust-lang.org/2020/07/16/Rust-1.45.0.html

予定通り来た
Rocketがstableの仲間入り
2020/07/17(金) 01:59:14.04ID:ppPvs5zR
>>863
ありがとう神様

C#ならすぐなのに、
これは理解するのに時間がかかりそうだ。
866デフォルトの名無しさん
垢版 |
2020/07/18(土) 18:30:51.49ID:XPr1Z8D3
神がついてるから大丈夫
867デフォルトの名無しさん
垢版 |
2020/07/20(月) 13:18:08.21ID:8IyUCuKf
actix-wevからRocketに移行します
2020/07/21(火) 02:22:25.82ID:119VIs66
>>867
その理由は?
2020/07/21(火) 18:35:05.91ID:jydcaLWL
スライスから差集合を作るの際にスライスをそれぞれhashsetにしてdifference呼ぶ以外で良い書き方ありますか?
2020/07/22(水) 00:13:53.48ID:g6BKSYlu
それぞれsortして先頭から比較していく
2020/07/22(水) 01:18:16.47ID:EHcGprvb
>>869
シンメトリックじゃない単なる差集合なら
片方だけsetにしてもう片方の要素でループしながらチェックするのでもいい気がする
あと状況によってはBroom filterみたいなのを使うと高速化できるかも
872デフォルトの名無しさん
垢版 |
2020/07/22(水) 13:33:09.23ID:toRz6DNg
fn aaa(s: &str) {
if s == "aaa" {
compile_error!(r"If s is "aaa", compile error!");

}
}
fn main() {
// compile error!
aaa("aaa");
// can compile
aaa("aaaaaaaa");
}

こういう風にコンパイル時にコンパイルエラー出したいんだけど、実際はcompile_error!を書いてる時点でコンパイルになるんだけど回避方法ってないかな
873デフォルトの名無しさん
垢版 |
2020/07/22(水) 13:33:41.15ID:toRz6DNg
こういう風にコンパイル時にコンパイルエラー出したいんだけど、実際はcompile_error!を書いてる時点でコンパイルになるんだけど回避方法ってないかな

こういう風にコンパイル時にコンパイルエラー出したいんだけど、実際はcompile_error!を書いてる時点でコンパイルエラーになるんだけど回避方法ってないかな
2020/07/22(水) 15:44:52.79ID:vLwW7fFZ
>>870
>>871
d
2020/07/22(水) 15:48:48.87ID:uZAjXvzm
ダブルクォートがaaaの部分で外れてるのが原因とかじゃなくて?
876デフォルトの名無しさん
垢版 |
2020/07/22(水) 15:58:57.61ID:6Pdi74ki
aaa(r#"aaa"iiii"uuuuu"#)
877デフォルトの名無しさん
垢版 |
2020/07/22(水) 16:04:28.78ID:toRz6DNg
>>875
ごめん。ここに貼る用のデバッグコメ。
そこ直したら本題の条件分岐のコンパイルエラーにならないのがでてくる
compile_error!(r#"If s is "aaa", compile error!"#);
2020/07/22(水) 18:44:16.24ID:EHcGprvb
compile_error!は条件付きコンパイルかマクロでしか使えないんじゃ?
compile_error!と記述してる行がコンパイルするコードに含まれることになったらコンパイルエラー

マクロを展開する段階では変数の値を評価できないから
文字列を受け取る関数に対して特定の文字列を渡すコードがあったらコンパイルエラーってのは無理な気がする
2020/07/22(水) 22:19:16.93ID:ItqkS36e
aaaを手続きマクロにすればできるとは思うけど。
880デフォルトの名無しさん
垢版 |
2020/07/23(木) 01:38:31.65ID:es6swX3J
最近RustのSlackでも出てきた福野泰介ってやつ声でかいよな
こいつどのコミュニティでも何かしら主張して目障りだわ
881デフォルトの名無しさん
垢版 |
2020/07/23(木) 01:41:56.15ID:5yzO6ql9
Ubuntu Japanese Team に言いつけて潰してもらおうぜ
882デフォルトの名無しさん
垢版 |
2020/07/23(木) 18:56:28.53ID:Qx3jp5Nz
環境はMacOS Catalina, Rustは1.45.0です
今弄ってる物(https://github.com/Nercury/rust-and-opengl-lessons)で
/lib/gl/src/lib.rs内に
include!(concat!(env!("OUT_DIR"), "/binding.rs"));
というのがあるのですがですがcargo buildすると
this error originates in a macro
error: couldn't read /Users/Path/target/debug/build/gl-71effbf83f5b03a9/out/binding.rs: No such file or directory (os error 2)
と表示されます
https://github.com/rust-analyzer/rust-analyzer/issues/1964
https://github.com/rust-skia/rust-skia/issues/10
などを見たのですが具体的な修正がわかりませんでした。
Rustは最近始めたばかりでincludeマクロやcargoの仕組みなどまだあまり詳しくありません
このinclude!を成功させる方法を教えてください
迷惑をかけてしまうかもしれませんがご教授お願いします
2020/07/23(木) 19:05:44.31ID:es6swX3J
福野泰介はたしかにどこでも目立つ。
自己顕示欲もあそこまでいったら面白い、反面教師として役立つ
2020/07/23(木) 21:20:06.43ID:DkkvFejZ
>>882
lib/gl/build.rsでOUT_DIRにbinding.rsを作成してる

ビルドスクリプトが意図した通りに動いているのか確認するために
build.rsを変更してbinding.rsのフルパスをprintlnでもするようにして
cargo build -vvしてみるといいと思う

ビルドスクリプトについて詳細知りたければこの辺読んで
https://doc.rust-lang.org/cargo/reference/build-script-examples.html
885デフォルトの名無しさん
垢版 |
2020/07/24(金) 00:48:59.83ID:j+hLU6yH
>>884
ありがとうございます動きました!
非常に長文だった自覚はあるんですが分かりやすくすっきりした回答ありがとうございますm(_ _)m
886デフォルトの名無しさん
垢版 |
2020/07/24(金) 10:22:52.41ID:c87Ipt6p
同じサーバー内でポート別にクライアント用サーバー(Nuxt)とAPI用サーバー(Rust)立ち上げるのってどう思う?
クライアント用サーバーは初回しか性能響かないからあれだけど、Rustの方が断然速いし、SPAだからルートの設定も全然しなくていいし、Rustの方でフロントページも返した方がいいんじゃないかと思ってるんだけども
要はRustを実行すればポート別に2つサーバーが立ち上がるようにするってこと
2020/07/25(土) 18:01:19.70ID:n+xx7yT/
RocketってRust公式サイトにも使われてるのか
迷ったらRocketで良さそうだな
888デフォルトの名無しさん
垢版 |
2020/07/26(日) 03:19:09.22ID:XCGG5OQ8
diesel使いづらくない?
2020/07/26(日) 18:57:03.68ID:uWZribv0
rustcの-C llvm-args=が取り得るオプションの説明ってどこかに書いてある?
clangのttps://clang.llvm.org/docs/ClangCommandLineReference.html#x86
あたりがそれっぽいけど説明が全くないのでデフォルト値も効果もよく判らない
2020/07/26(日) 22:31:29.89ID:T2XYMYOv
>>889
ここに書いてあるけど'--help'を渡せば一覧表示されるみたいよ
https://doc.rust-lang.org/rustc/codegen-options/index.html#llvm-args

$ rustc -C llvm-args='--help'
891デフォルトの名無しさん
垢版 |
2020/07/26(日) 23:02:23.88ID:XCGG5OQ8
あるモジュールクラスを別のモジュールで使いたい場合ってどう宣言するのが正しいの?

正直ドキュメント読んでも分からん
2020/07/26(日) 23:58:47.45ID:uWZribv0
>>890
サンキュ。そう使うのかよw うちの環境では
>rustc -C llvm-args=--help ←'を付けると怒られる
でそれっぽいのが得られました。amd64で使用命令を選択するようなオプションは無いのか・・・
2020/07/27(月) 00:46:16.95ID:TQCIWmFu
--helpの最後に出てたけど
利用可能なオプションを全部表示するには
llvm-args=--help-hiddenってするみたい
2020/07/27(月) 09:47:21.61ID:s6eJseAH
chronoのnext_monthないのってどう実現すればできる?
2020/07/27(月) 10:10:01.73ID:0SvTsOI7
>>894
そもそもnext_monthに何を期待するかによると思うが。30日後?31日後?翌月の同じ日?それが存在しない場合は?とか。その辺がはっきりすれば、その通りに実装すればいい。
2020/07/27(月) 10:18:30.24ID:0SvTsOI7
翌月の同じ日ならこれかな。
https://docs.rs/chrono/0.4.13/chrono/trait.Datelike.html#tymethod.with_month
897デフォルトの名無しさん
垢版 |
2020/07/27(月) 16:16:44.20ID:s6eJseAH
>>896
ありがとう、結局next_month自分で実装したけど、かなり頻繁に使われる類のメソッドだから正直きついな
with_monthもoptionで返すから31 -> 30の次月遷移したとしても安全だから実装しない理由が分かんないな
chronoは変なとこには手回ってるしよくわからん
2020/07/27(月) 18:03:20.70ID:SSpP96W4
>>897
issueはあるけど別に誰かが反対しているわけでもなく、
単に誰も実装してないだけじゃない?
PR出してみればいいと思うけど。

https://github.com/chronotope/chrono/issues/290
899デフォルトの名無しさん
垢版 |
2020/07/28(火) 16:26:39.82ID:0KPYC4VC
>>891
じけつ

main.rsでそれぞれのモジュールをmod宣言
900デフォルトの名無しさん
垢版 |
2020/07/29(水) 11:56:30.09ID:blHj/j43
ed25519の公開鍵のssh-ed25519 ******の部分が欲しくて、ed25519_dalekっていうクレートで鍵作ってるんだけどPublicKey構造体のas_bytesでとってくるバイト列をstr::from_utf8でしてもエラーが出て秘密鍵の***部分にならないんだけど、どうすればいいか分かる?
https://docs.rs/ed25519-dalek/1.0.0-pre.4/ed25519_dalek/struct.PublicKey.html
2020/07/29(水) 20:03:32.01ID:B1rudV7D
1byteずつ print!("{:02x}", b) するとかではなく?
2020/07/29(水) 21:31:44.28ID:4K5iZ0U7
>>900
str::from_utf8でエラーになるのは
0~127までのUTF-8互換のASCII以外の文字が含まれてるからでは?

pemで見れる公開鍵のssh-ed25519 ******の部分は
keyの種別とDERエンコードしたkeyの値をBase64にしたものらしい
903デフォルトの名無しさん
垢版 |
2020/07/30(木) 13:54:57.65ID:AECjseqQ
>>901
やってみたらエラーはでないし、ハッシュっぽいものできたけど、大文字ないから >>902の方法っぽいかも
4ef6dcfda191770b64939c5657fc26e631c2caffa18e423c397d761d507ae82a%

>>902
ありがとう、やってみるわ
2020/07/31(金) 22:54:06.06ID:Emo7hM/W
bindgenにwindowsはllvmのプリビルドバイナリをインストールしなさいと書いてあるけど、
LIBCLANG_PATH設定し忘れるとwinのプリビルドバイナリには含まれてないllvm-configを使って<LLVM_ROOT>/binまでのパスを探すんで
llvm-configがないって怒られる罠がある。

LIBCLANG_PATHタイポして時間潰してしまった。
905デフォルトの名無しさん
垢版 |
2020/08/01(土) 14:02:57.08ID:cK8sGWsa
やっぱactixよりrocketだな
2020/08/01(土) 14:09:11.29ID:sGuB7emE
>>905
その理由は?
2020/08/01(土) 15:02:20.03ID:Sq3FCv8n
なんか速そうじゃん
908デフォルトの名無しさん
垢版 |
2020/08/01(土) 15:19:22.53ID:cK8sGWsa
>>906
ドキュメントがしっかりしてそう
2020/08/01(土) 16:43:51.04ID:Gnfef8LF
unsafeの個数が少ない方が勝ちって事でいいんじゃない?
910デフォルトの名無しさん
垢版 |
2020/08/01(土) 22:13:51.53ID:cK8sGWsa
rocketってmultipartサポートしてないのか
911小石茶輝
垢版 |
2020/08/01(土) 23:31:58.80ID:hdo7vbOv
unsafe という機能があるのは unsafe が必要だからです。
設計方針に対して必要以上に unsafe があるのはダメですが、
少なければ少ないほど良いというわけでもありません。

たとえば C++ を使っているときだって、
グラフィックドライバを書くときとかは
どうしたって (C++ 的には) 行儀の悪い書き方になってしまうでしょう。

行儀の悪い部分はなるべく低レイヤに押し込めて、
ロジック層が綺麗になるようにするのが望ましいなどといった習慣はありますが、
どの程度にするかの程度問題は設計方針によります。

actix は rocket よりも unsafe を多用してはいますが、
意図のはっきりした unsafe です。

あまりにも unsafe が多すぎるならもう Rust 使うのやめろよと思うかもしれませんが、
行儀の悪い書き方 (unsafe) がより明示的であるというだけでも
C++ よりは少しマシでしょう。
2020/08/06(木) 21:31:08.70ID:3hCyvjau
rust案件が出てこないのは何で?
913小石茶輝
垢版 |
2020/08/06(木) 23:35:19.16ID:m6Z7F3X/
出てますよ。
あなたがそれをキャッチする立場にないだけです。
914デフォルトの名無しさん
垢版 |
2020/08/08(土) 01:19:04.76ID:4kKr75Ow
stdの中でこれは外部ライブラリにした方がいいんじゃないかなって思うやつある?
逆に外部ライブラリからstdにした方がいいんじゃないかってやつとかもある?
2020/08/08(土) 06:00:59.71ID:6YjyRljP
>>914
乱数ライブラリが標準ライブラリに入ってない言語とか他にあんの?
2020/08/09(日) 00:20:40.65ID:ayHdPpdd
乱数は用途によって必要な性質が色々だからなぁ。
どの分野を優遇すべきかってのは自明ではないでしょ。
全部盛りにするのも Rust 的ではないし。

でも、どの乱数ライブラリを使うにしても同じようなインターフェイスだとありがたいので、
乱数ライブラリが満たすべき標準的なトレイトが提供されて欲しいし、
そのサンプル的な位置づけでひとつくらいは乱数ライブラリが入っていてもいいかなとは思う。
2020/08/09(日) 00:37:01.23ID:DQUuTCyR
>>916
MT だけでいいと思うのですが
2020/08/09(日) 00:43:58.48ID:ayHdPpdd
>>917
メルセンヌツイスタは統計的な性質は良いけど暗号的には使い物にならんしデカい。
常にベストと言えるほど良い選択ではないよ。
2020/08/09(日) 01:29:16.04ID:DQUuTCyR
>>918
確かに暗号にMTを使うのはダメですね、暗号用には crypt-MT がありますね
2020/08/09(日) 20:40:18.77ID:mU0jSAp3
今はもうMTもそこまで・・・って話じゃないっけ
randクレート見るとそんなこと書いてあったような
2020/08/09(日) 20:55:04.69ID:wx6Xp3NP
他の言語だって完璧な乱数だと思ってなくても
利用者の利便性を考えて標準ライブラリに含めてるんだろ
それが無いRustは変
2020/08/10(月) 00:22:38.94ID://dLtD59
今どきMT法なんか使わん。

>乱数ライブラリが満たすべき標準的なトレイトが提供されて欲しいし、
rand_coreがそれに当たるけどcoreだけだとバイト配列しか取得できんので分布器に生成器渡せん。
未知の生成器の実装すべて含めるのは無理、既知のものに絞っても要求する特性が人によって違うから標準にするのは無理。
結局はこうなるが、俺も標準ライブラリに乱数ほしい。
2020/08/10(月) 01:32:59.38ID:5CSXOdci
cargo使ってるから別ライブラリでもあまり困らない
こと乱数に関してはデファクトスタンダードのcraete決まってるし迷うことないしね
標準ライブラリに入ってて欲しいのは初学者がcrate知らないとか探すのが手間だとか、コンパイルタイムが延びるのが嫌だとか、そういう理由?
2020/08/10(月) 02:16:28.69ID:PbB9rIkO
stdに入れて欲しいのはrandよりregexだな
標準ライブラリとして責任もってメンテされていくものなのかどうかが重要
2020/08/10(月) 03:21:04.11ID:5WLgK92c
>>924
あちこちのcrateでregex使ってるから
コンパイル遅くする原因になってるわ
2020/08/10(月) 04:22:44.62ID:qbs6FNC5
Authors のところが The Rust Project Developers ってなってるやつは
事実上の標準みたいなもんと思ってええんけ?
将来の互換性が保証されるかどうかはともかくとして Rust と足並みがそろっているとは
思っていいよね?
2020/08/10(月) 05:17:58.40ID:ELRN+pEU
jsonrpc使ってみた。不可解な実装でワロタ
2020/08/10(月) 23:12:44.03ID:xrY++dmg
外に出されたunicode系ライブラリが更新止まってていつかstdがサポートするunicodeのバージョンと互換性失うんじゃないかと思う。

>>926
事実上の標準っていうかc++のboostみたいなもんだけど足並み揃ってるかは別。
929デフォルトの名無しさん
垢版 |
2020/08/11(火) 13:18:54.05ID:vv5Ejmf9
use std::ops::{Rem, AddAssign};
pub fn get_days_of_month<T: Rem>(year: T, month: u32) -> u32 {
match month {
2 => if is_leap_year(year) { 29 } else { 28 },
4 | 6 | 9 | 11 => 30,
_ => 31,
}
}
pub fn is_leap_year<T: Rem>(year: T) -> bool {
match ((year % 100 as T) as i32, (year % 400 as T) as i32) {
(_, 0) => true,
(0, _) => false,
_ => year % 4 == 0,
}
}
pub fn next_day<N, T: AddAssign + Rem>(mut year: T, mut month: u32, mut day: u32) -> (T, u32, u32) {
let days_of_month = get_days_of_month(year, month);
day += 1;
if day > days_of_month {
month += 1;
day = 1;
}
if month > 12 {
year += 1;
month = 1;
}
(year, month, day)
}
non-primitive castエラーが出るんだけどどうすれば解決できる?
1 as Tでもできないし、1.parse()はstrじゃないから出来ない
2020/08/11(火) 13:40:48.45ID:+G0SPKi4
>>929
num-traitsのOneで制約すればT::one()でT型の1が得られる。
931デフォルトの名無しさん
垢版 |
2020/08/11(火) 17:18:59.34ID:vv5Ejmf9
>>930
i32 か u32を受け取るトレイト境界ってつくれない?
あとAdd<u32> for u64とかの実装していない理由とかって何?
2020/08/11(火) 18:03:39.15ID:9N1UW9Um
>>931
自分で作ればいい。
型変換は明示的にしろ、ってことだろう。
933デフォルトの名無しさん
垢版 |
2020/08/13(木) 18:54:36.47ID:ilszh1HB
ゲーム開発言語はrustに移行されるかな?
2020/08/13(木) 23:00:02.19ID:XvzayrDj
プログラミング言語「Rust」、Linuxカーネルでの採用の道を模索
https://japan.zdnet.com/article/35157012/
2020/08/14(金) 22:24:07.75ID:O4QC6Gpt
>>933
個人の開発に使ってるけどバインディングだらけになる。
ミドルウェア1から作る新規開発くらいじゃないとrustの恩恵がフルに受けられないと思う。
あと、コンパイル遅いのが辛い。
936デフォルトの名無しさん
垢版 |
2020/08/15(土) 03:05:14.85ID:py5/TuN/
ラズパイとかでコンパイルすると糞遅いのなんとかならんかな
937デフォルトの名無しさん
垢版 |
2020/08/15(土) 06:26:45.05ID:KV0ftL1X
禁断のCPU換装とかないの?
DOS/Vパワーリポートとか買ってみたら。
2020/08/15(土) 06:47:50.15ID:c5MlwM8B
>>936
クロスコンパイルすれば?
2020/08/15(土) 21:53:54.93ID:aUDFhJGy
というよりなんでセルフコンパイルするんや?
2020/08/15(土) 23:19:51.01ID:aMnBEbVz
rustじゃないけど適当な設定で大きいライブラリビルドしたら過熱でラズパイ落ちた事あるわ
941デフォルトの名無しさん
垢版 |
2020/08/17(月) 18:33:01.49ID:L4/FmhKh
Rより低いRust...
https://japan.zdnet.com/article/35158190/
2020/08/18(火) 04:18:41.28ID:Hi0tASG0
rustって日本で人気という勝手なイメージがあるけど世界的にはどうなんだろ
2020/08/18(火) 04:32:12.17ID:G86KA+uV
ルスト?なにそれ?てかそんなの聞いた事ないんだけど
944デフォルトの名無しさん
垢版 |
2020/08/18(火) 15:54:29.74ID:GTs4Jp23
>>941
Goの方がマスコットがかわいいからしゃーない。
2020/08/18(火) 16:39:58.87ID:A66tt0Hu
マスコットが気持ち悪い言語と言えばLISP
2020/08/18(火) 18:04:09.30ID:FC5XBFLB
>>944
いやいやいやいy・・かわいいかアレ??
どぉおおおおおみてもキモい
2020/08/18(火) 18:17:07.57ID:xqTakpBf
>>941
調査によって、まちまちだな。
StackOverflowでは、Rustは好きな言語ランキングでは、五年連続Topらしいが、
「人気」は低い。
今のところ「好き」だが「人気」は無いのがRust。
恐らくこの場合、「人気」= 「Popular」のことで、英語の Poluarは、
「人気」と言う意味のほかに、「普及している」とか「一般的」、というような
意味もあるのでややこしい:
https://news.mynavi.jp/article/20190412-807191/
948デフォルトの名無しさん
垢版 |
2020/08/18(火) 18:30:54.90ID:xqTakpBf
「好き」ならば「学びたい」のだろう、と思いきや、そうでもないということか。
「最も好きな言語は何ですか?」
という問に対して、相手に馬鹿にされないためには、Rustが丁度よい言語
である気はする。
でも、結構、実際に使用したいと思っているどうかは別。
俺もそんな質問されたら、答えに窮して Rust と答えてしまうかも知れんが、
使う気はほぼ無い。
2020/08/18(火) 21:58:33.67ID:eVuhfWpC
Rustはターゲットになる開発領域が狭くてどう足掻いても大人気誰も彼もRust!なんてことにはならないよ

C++が広範な領域で使われてたのは選択肢のなさとWinのAPI基準の1つなのとCとの運用のしやすさ

選択肢が増えてWinもよっぽどなことしなけりゃC#があるしCをコールする分にはどの言語も十分改善されてきた

0から作るある程度のパフォーマンスを求めるプロダクトならGoがあって、アセンブリと連携するけどcgoのオーバーヘッドやGCのオーバーヘッドが気になるみたいな際際じゃなけりゃRustにならない

計算高速化のcalleeとしては安全性があまり旨味のない要素だからC++の選択がまだ強い

以上に加えてエラー周りとかアセンブリ連携もnightlyがあってまだ熟してない部分があり厳しい立ち位置にいるという認識だ
2020/08/18(火) 22:03:32.42ID:67oHHRca
>>949
>計算高速化のcalleeとしては安全性があまり旨味のない要素だからC++の選択
C++ が呼ばれ側になるのですか?
2020/08/18(火) 22:21:20.07ID:y+NJXGZa
>>949
その中だとパフォーマンス的にはGoでいいけど言語仕様が簡素すぎて辛い、みたいな層の受け皿としてRustが使われてるケースはありそうかな。
ScalaがいいけどJVMは厳しい、みたいなのとかも。
まぁニッチなのは間違いない。
2020/08/18(火) 22:56:18.34ID:tqFHaZPp
Microsoftが興味持ってるからC# + Rustが未来の姿だ
UIはC#
2020/08/18(火) 23:14:15.49ID:eVuhfWpC
>>950
TensorflowとかPytorchのバックはC++だよね
これらは当然CUDAとの兼ね合いであるのは間違いないけど、CUDA側がRustではなくC++を選択してる意図として安全性の旨味のなさは間違ってないと思う
C++の仕様が先立つ言語であることや人口の多さ、既存資産との兼ね合いの比重のが大きいだろうけどね
2020/08/18(火) 23:33:09.98ID:bX3QY+Cn
>>953
そりゃCUDA1.0の頃(もう10年以上前だぞ)にRustなんて影も形もなかったんだから選択されないのは当然だろう。
その視点で見るならここ1-2年で開発開始されるプロジェクトでどの程度採用されるか、では?
今だとブロックチェーン界隈とかかね。
2020/08/19(水) 01:11:27.31ID:I1IAXvPk
>>949
rustは元からサーバーは視野に入れてないだろ
956デフォルトの名無しさん
垢版 |
2020/08/19(水) 03:59:31.08ID:HXpA5baw
"abc".split("").collect::<Vec<_>>()は["", "a", "b", "c", ""]になるんだけど、うまく空白なしでスプリットでできない?
2020/08/19(水) 04:27:22.19ID:0Kuyi32B
.charsじゃなくてどうしても.split使ってvecにしたいってことなのか?
2020/08/19(水) 04:32:39.30ID:0Kuyi32B
"abc".split_terminator("").skip(1).collect::<Vec<_>>();でできるけど
普通はchars使うやろ
959デフォルトの名無しさん
垢版 |
2020/08/19(水) 10:35:25.48ID:HXpA5baw
>>957
charだとparse()がなくて変換めんどくさい
あと容量無駄
2020/08/19(水) 10:42:04.16ID:3t1Yn2l3
charと&strって&strのがでかくね????
961デフォルトの名無しさん
垢版 |
2020/08/19(水) 10:54:53.71ID:HXpA5baw
>>960
Splitは
type Item = &'a str
だから無駄に生成しないって意味ね
2020/08/19(水) 11:03:27.99ID:6EiBw6oz
>>961
でも最後にVecに格納するポインタは一文字ごとに8バイト取られるんだから、charの方が小さくない?
2020/08/19(水) 12:52:58.21ID:ysyRx3At
&strはfat pointerだから16byte じゃね
2020/08/19(水) 13:05:48.82ID:P3FDipJp
確かに16バイトだね。parseにしてもto_digitでいいし、Vec<&str>のメリットはなさそう。
2020/08/19(水) 14:18:38.67ID:Rgg+SJNu
Rustのコア開発者達がMozillaのリストラで大量解雇されたようだが大丈夫なのか?
2020/08/19(水) 14:44:59.88ID:WLoKFS1m
MozillaとRust Core Team、Rustの非営利団体を立ち上げへ
https://mag.osdn.jp/20/08/20/104100

Mozillaのプログラミング言語「Rust」を開発するRust Core TeamとMozillaは8月18日、独自の非営利団体を立ち上げることを発表した。Mozillaの大規模なリストラ計画を受け、Rustプロジェクトの安定を図る。

Mozillaは約250人規模の人員解雇計画を明らかにしているが、この中にはRustプロジェクトやコミュニティにアクティブに参加しているメンバーも含まれるという。
この再編計画がプロジェクトとしてのRustに対する不確実性を生んでいることから、非営利団体立ち上げを急ピッチで進めることにしたようだ。

なおRustにはMozilla外部からの貢献も多く、Mozilla内部の開発者の多くも余暇を使って参加しているため、Mozillaの再編計画によりプロジェクトが大きな影響を受けることはないとしている。
2020/08/19(水) 15:18:50.67ID:tsnEmyts
解雇された人のtwitterとか見てると
「弊社でRust書きませんか?」なオファーが殺到って感じだし
個人の生活としてはそんなに問題ないんじゃないかな。
Rustの開発に割ける時間が増えるのか減るのかは知らんが。
2020/08/19(水) 17:11:33.75ID:Zv91SX/x
Rust財団作って開発と管理を移管するのかね

その後プラチナスポンサーにMicrosoftがいても驚きはないな
2020/08/19(水) 18:13:15.60ID:J1Jz5rCd
非営利団体を立ち上げるらしいですね、安心安心
2020/08/19(水) 21:07:57.58ID:g0VuJGRT
>>966の記事でも触れてるけどrustはコントリビュータが多いからmozillaの再編は影響すくない。
mozillaの中のままでmozillaの計画の影響受けたら面倒くさいからこの際独立しようって考えだろうね。

といかMozillaのはアフターコロナを見据えた再計画なんでアメリカにしてはコロナに関してはまともな部類なんだけど国内でどう見られるかだね。
2020/08/19(水) 22:22:34.63ID:2mI2lZ4E
Servo開発者が解雇されるみたいだね
2020/08/20(木) 01:56:33.75ID:U3jykTiC
僕も解雇されてニートになったんで暇つぶしにRust始めようかと思うんですがRustって個人の趣味として使うならナンセンスなんですか?
WinのGUI開発しようと思ってるんですがあんまり情報ないですよね
2020/08/20(木) 07:40:13.19ID:VY9dfKBD
その用途なら素直にC#使えば?
974デフォルトの名無しさん
垢版 |
2020/08/20(木) 11:28:50.60ID:RX/3qqm6
Xamarinより糞なものが完成するだろう
2020/08/20(木) 13:10:46.32ID:bydbmtvj
趣味なら好きなもの興味のあるものつかえばええ
2020/08/20(木) 14:37:00.37ID:uihwOB88
PythonとJSをちょっと書けるくらいなんですが
Rustを勉強する前にCをやったほうがいいですか?
977デフォルトの名無しさん
垢版 |
2020/08/20(木) 16:14:06.53ID:TxgxGTNZ
時間の無駄だからやらないでいいよ
2020/08/20(木) 16:38:36.44ID:Z64Rk/C4
人生なんて生きてる間の暇潰しだろ
979デフォルトの名無しさん
垢版 |
2020/08/20(木) 17:19:36.86ID:RX/3qqm6
川上さんが同じこと言ってた
2020/08/20(木) 18:34:28.31ID:0udGtUoq
>>976
一度Cを書かないとRustのありがたみの半分が理解できないよ
981デフォルトの名無しさん
垢版 |
2020/08/20(木) 21:01:28.94ID:TxgxGTNZ
そんなことはない
やらなくていい
2020/08/20(木) 22:00:49.47ID:Ga5wwJ4q
世の中にはドキュメントを読んで納得できるタイプの人と
実際に自分で罠にはまってみないと納得できないタイプの人がいる。
自分が後者だと思うなら一度Cで苦しむのがいいんじゃないかな。そうじゃないなら不要。
2020/08/21(金) 00:12:22.78ID:NOJ3NXTi
だいたいドキュメントを鵜呑みにして罠にはまる
2020/08/21(金) 03:22:09.47ID:gX4UqW46
RustってC/C++の代替って言うけどそもそも今時Cって使う?
趣味で使ってる言語の1位がRustだって記事もあったけどCで何作るの?
なんでRustがこんなに人気なのか理解できない
2020/08/21(金) 10:06:09.07ID:x9AY+WVq
Linuxの基本的なコマンド(ls,grep等)を高機能にした代替コマンドがよくRustで作られてる
2020/08/21(金) 18:18:06.15ID:hY6Ml5La
>>984
よく勘違いされることであるが、Cが昔から使いこなせている人は、Rustでなくても、
特に問題を感じていなかったりする。
2020/08/21(金) 18:48:37.51ID:taULJ50I
よく勘違いされることであるが、Cが昔から使いこなせてると思ってる人は、
単にバグに気付いてないだけだったりする。

真面目な話、組み込み系のシニアエンジニアにありがち。
オフラインの家電やってる頃は良かったんだろうけど、
ネットに接続とかやるとたいていやらかす。
2020/08/21(金) 20:12:18.80ID:r2LsFpPg
Cでマルチスレッド書けって言われてもバグる自信しか無いわ
C製ツールをRustで書き直したものはマルチスレッド化して高速化してるわけだしな
2020/08/21(金) 20:57:32.34ID:awVkHdGE
LinuxカーネルハッカーというCの超ベテランからも
LinuxにRustも使いたいという話が出るくらい
2020/08/21(金) 21:03:56.70ID:JrVTIgi/
C使えるけど気苦労多いしRustの方が良い
Cを積極的に使う理由は少ない
2020/08/21(金) 21:20:19.48ID:psrfcNr7
単に文字列扱うだけでめんどくさくなって
「仕様削ってintにしていい?」と言いたくなるのがC
2020/08/21(金) 22:15:47.76ID:wnXs3Jul
>>984
rustを評価する際にC/C++の代替なんて誰も言ってないよな。mozillaも評価いいMSとかも。
C++より安全って言ってるのを外野がC/C++の代替と言い出したのが
ろくにrust書いてない連中が呪文のように唱えだしただけだと思う。
C++の代替になってもCの代替にはならないと思う。

>>991
早くuchar.hを自分で用意する作業に戻るんだ!
2020/08/21(金) 22:26:40.07ID:JrVTIgi/
逆にCの代替になる必要はないと思う
CとのFFIは不自由なくできるわけで
むしろFFIが不自由なC++の代替にはなりづらいと思う
2020/08/21(金) 22:39:33.13ID:7UnAdk+W
Cの代替ってのは別にCの用途すべてを置き換えうるって意味じゃないでしょ
ripgrepとか見れば十分Cの代替と言える
2020/08/21(金) 23:03:52.36ID:QT6UwXc0
例えばQEMUなんかは既存のCの書き直しは大変過ぎるからやらないけど、
新規開発のデバイスエミュレーションコードはRustでって言ってるね。
そういう代替の仕方もあると思う。
2020/08/22(土) 03:28:45.96ID:MH6yoyVU
>>989
その人が、凄腕プログラマーとは限らないが。
2020/08/22(土) 09:45:03.68ID:YOeBtImF
Cの代替はD
2020/08/22(土) 09:49:22.85ID:+2o9Uv3C
>>996
日本語読めないんだね
2020/08/22(土) 10:58:14.06ID:oUSNiZjo
Linuxのカーネルハッカーが、凄腕プログラマとは限らないと言っているんだ。
プログラマの世界は、レベルの差が大きいから、その程度では凄腕には
分類されない。
例えば、VzEditorのc.mosさんは、その程度ではなかった。
2020/08/22(土) 11:13:12.20ID:+2o9Uv3C
>>999
お前よりはカーネルハッカーの方が腕も頭も良さそうだな
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 210日 23時間 25分 20秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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