X



Rust part8
レス数が1000を超えています。これ以上書き込みはできません。
0002デフォルトの名無しさん
垢版 |
2020/01/24(金) 12:03:40.01ID:ytRnz1Ft
このスレにバグがある確率
0003デフォルトの名無しさん
垢版 |
2020/01/24(金) 13:58:51.88ID:rcCZSgTk
この世のC/C++プログラムにバグが一つでもあるぐらい%
0005デフォルトの名無しさん
垢版 |
2020/01/24(金) 23:17:19.37ID:CbfOEjVR
質問です。
こんな構造体を作っていました。

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

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

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

だから優れたプログラマーは自分がミスを犯す前提で
そのミスが重大な問題につながらないよう個人単位でもシステムを構築してる
0012デフォルトの名無しさん
垢版 |
2020/01/25(土) 10:53:31.57ID:cxLY0DeL
>>10
おまえの関わった製品には署名しといて。
絶対使わないから。
0014デフォルトの名無しさん
垢版 |
2020/01/26(日) 03:02:59.13ID:0RGBrSLm
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2018&gist=511e2be2ae90342a9c36f759e73108b6
勉強がてらたらい回し関数をメモ化仕様で書いてみたんですけどあってますかね…自信がないです
0017デフォルトの名無しさん
垢版 |
2020/01/26(日) 17:36:36.36ID:HuWRexcG
プルリクとかも出す前にさんざん確認してんのに出してからすぐ「あ、ここ間違ってた…」みたいになるよね(´・ω・`)
0018デフォルトの名無しさん
垢版 |
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
|
0020デフォルトの名無しさん
垢版 |
2020/01/26(日) 23:22:19.61ID:afCDhAgp
>>19
おお、ありがとう
impl Vec<&str> の単体でも駄目だったから自trait作って実装した!
結構制約厳しいな
外部トレイトに実装するならめんどくさいけどマーカーつけとけよって意味かな
0021デフォルトの名無しさん
垢版 |
2020/01/27(月) 17:44:19.37ID:e3ktUGSY
こんな関数は書けますか?
@ イテレータを受け取る
A 受け取る引数は @ のただひとつのみ
B 条件を満たす範囲を「スライスで」返す

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

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

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

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

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

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

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

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

>> 35
ありがとう、リテラルのみは統一感出るけどかなり不便だね。
デバッグ用じゃなくともDisplayとかもあるからResult返すマクロも入れといてくれたらいいのにね
0038デフォルトの名無しさん
垢版 |
2020/01/28(火) 22:31:23.29ID:KmVlGMrW
>>34
Rust的にはcollectによるメモリコピーみたいな
重い操作は見た目上も重くしたいんだと思ってる。
0039デフォルトの名無しさん
垢版 |
2020/01/29(水) 00:56:46.27ID:OlGAjZi3
collectを二度書くと罪悪感で一度にならないか一生懸命考える
0040デフォルトの名無しさん
垢版 |
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);
0043デフォルトの名無しさん
垢版 |
2020/02/02(日) 19:09:35.21ID:Ng7YaIlp
>>41
CodeLLDB初めて使ってみたがオレ環では特に問題なく使える
ソースマップ定義してないから標準ライブラリとかにstep inすればバイナリで表示されるけど
自分のソースのブレークポイントでバイナリ表示はされない

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

あんまIDE使いたくないからrlsには頑張って欲しい
0049デフォルトの名無しさん
垢版 |
2020/02/04(火) 21:22:29.69ID:YIjVTtZH
本体のソース見たいけど/* compiler built-in */ってなってて読めない。
どうやったら見れる?
0050デフォルトの名無しさん
垢版 |
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 でもどっちかに統一してよさそうな気がするんだけど。
0051デフォルトの名無しさん
垢版 |
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); //これがエラー
0053デフォルトの名無しさん
垢版 |
2020/02/06(木) 00:18:39.33ID:yO6jvvKT
>>51
NLLで救えるようになったケースだね。
Rust1.30くらいまで戻せばエラーになるけど
今は2015でも2018でもNLLがデフォルトなのでエラーにはならない。
0055デフォルトの名無しさん
垢版 |
2020/02/06(木) 00:59:10.03ID:jSrTrJa0
>>52
なるほど、全部を &self に揃えなかったのは、やっぱ self の方が効率的って判断なのかな?

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

という理解をしてて、 char のメソッドは全部 self でいいくらいじゃないかと思ってた。
0057デフォルトの名無しさん
垢版 |
2020/02/06(木) 01:51:52.29ID:jSrTrJa0
>>56
歴史的経緯ってやつか。
比較的新しい言語なのに、やっぱりそういうこともあるのね。
0058デフォルトの名無しさん
垢版 |
2020/02/06(木) 11:48:46.94ID:GExFx9na
The Rust Programming Language 第2版で勉強中なんだけど
この内容に連動した練習問題か使用例みたいなのどこかにないだろうか?英語でいい
0059デフォルトの名無しさん
垢版 |
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読んだほうがいいかも
006258
垢版 |
2020/02/06(木) 17:27:24.00ID:xuuHNC+j
>>59
ありがと
こんな感じの欲しかった
って言うかPDFだけ読んでたから思い付かなかったけど本家にあったのか
0063デフォルトの名無しさん
垢版 |
2020/02/06(木) 20:07:27.95ID:oYYwjpH2
手を動かしたいなら自転車本もあり
オライリーはちょっと古くなってるからなー
0064デフォルトの名無しさん
垢版 |
2020/02/06(木) 22:23:34.76ID:kEyn3Q9D
オライリー本の古くなってる箇所はEdition Guide読めば問題ないよ

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

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

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

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

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

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

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

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

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

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

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

ツールの使い方もおぼつかないので定番と言えるのがどのあたりなのかとかいった肌感覚もなくて、
実際のコードを色々と見て回るのにどういうやり方が良いのか模索しています。
0094デフォルトの名無しさん
垢版 |
2020/02/20(木) 19:48:24.79ID:s7d9UeaP
Haskell の default 宣言みたいなのは Rust にありますか?

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

具体的な状況があるわけではなくて、言語機能を学ぶ中で生じた疑問です。
0095デフォルトの名無しさん
垢版 |
2020/02/20(木) 20:19:05.71ID:s7d9UeaP
>>93
こんな感じかな。

buf = buf.replace(ch, &<String as std::iter::FromIterator<&char>>::from_iter(&[' ', ch, ' ']));
0098デフォルトの名無しさん
垢版 |
2020/02/20(木) 21:09:56.45ID:NbeJLDuu
>>94
>たとえば関数 foo が返す値の型が a もしくは b の可能性があり

Rustで戻り値の型が1つに決まらない関数書ける?
0100デフォルトの名無しさん
垢版 |
2020/02/20(木) 21:55:52.56ID:nsHNq1aE
>>94
型が定まらない関数は定義不能。
aまたはbを返したいならenum c {a, b}にしてcで返すしかないかと。
0102デフォルトの名無しさん
垢版 |
2020/02/21(金) 01:30:08.71ID:8YUMmgA9
正直TypeScriptの1 | 2 の型記法欲しい
0103デフォルトの名無しさん
垢版 |
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 の文法詳しくないんで間違ってたらすまん
0104デフォルトの名無しさん
垢版 |
2020/02/21(金) 09:15:56.88ID:6JU7BGK2
>>103
もしそうならdyn Xで返せばいいね。
その場合は型がAかBかの評価は実行時になるけど
どちらにしてもAとBのどっちを優先する、みたいなのはないな。
010594
垢版 |
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()); }

いずれにせよ方法はなさそうですね。
型を明記すればよい話ではあるのですが、ふと疑問に思ってしまったもので。
0106デフォルトの名無しさん
垢版 |
2020/02/21(金) 13:18:50.41ID:sx356ht7
いや、こちらも勉強になるよ。
0107デフォルトの名無しさん
垢版 |
2020/02/21(金) 15:11:57.88ID:RiyafmFC
型推論でどの型のメソッドを呼び出せばいいか決まらないときに
特定の型のメソッドを優先させるような記述方法があるかってことだったのか
>>99のエスパー力すごいな
010994
垢版 |
2020/02/21(金) 18:02:02.28ID:zBjm2h3y
Rust の型システム (Hindley-Milner) は ML 系言語で実績があるやつなので、
(型に関して) ML 系で出来ることはおおよそ出来るのではないかと思いつつ、
Rust 的には明記させたい場面かもな……みたいな気持ちでした。

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

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

C++ は返却値の側からの推論が無いから普通の関数 (メンバ関数) として parse みたいなものを書けない。
いや、書けるけど型が推論されないからいちいち型を明記しなけりゃならない。
昔は演算子でやる C++ のスタイルを上手い案だと思ってたけど、
普通に関数 (メソッド) でやれるもんならその方がいいわ。
0113デフォルトの名無しさん
垢版 |
2020/02/25(火) 12:01:50.32ID:35/v8OB/
異なる関連型を持つ複数のトレイトオブジェクトを1つのVecに入れるのはAnyとかを使わないと無理でしょうか?
0117デフォルトの名無しさん
垢版 |
2020/03/03(火) 21:00:42.72ID:aQWPV0PM
static TEST = &'static str = "test";

このTESTの文字列の最後の一文字だけを参照として&'static charで作ることってできる?
型レベルで一文字ってことを保証したいのとメモリ節約したい
0119デフォルトの名無しさん
垢版 |
2020/03/03(火) 22:01:05.88ID:Bj/i6Nw/
charは4バイトでポインタ(参照)は8バイトだから節約するどころかむしろメモリ食ってるなwww
0120デフォルトの名無しさん
垢版 |
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();
0123デフォルトの名無しさん
垢版 |
2020/03/03(火) 23:13:54.10ID:EQ8N775K
asciiと分かってるなら u8 だよね
どっかで u8 ベースの文字列操作ライブラリ見かけた気がする
0126デフォルトの名無しさん
垢版 |
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
0127デフォルトの名無しさん
垢版 |
2020/03/04(水) 00:12:13.85ID:/mNi51EN
消費されるのは&strじゃなくてそのイテレータだからね。
"abcd".chars()で得られるのは、{ String : source, index : 0 }みたいな形のChars型で、これがindexをインクリメントしながら文字を取得してくれる。
0128デフォルトの名無しさん
垢版 |
2020/03/05(木) 00:35:43.70ID:cMoNZaaE
use std::fmt::{self, Display, Write};
このselfってどういう意味?
0131デフォルトの名無しさん
垢版 |
2020/03/06(金) 01:12:13.19ID:n2xpzai7
>>130
回答に書いてあるじゃん・・・
dostuff()やfixme()が受け取るselfに’aでlifetimeアノテーションをつける理由ないよね
0132デフォルトの名無しさん
垢版 |
2020/03/06(金) 19:38:23.62ID:s+8hbWLf
>>131
ライブラリ側が同じデータ構造しててループで回したいけど同じエラーで出来ません
これって並列にループ回す可能性があるからシングルスレッドでも禁止されるんですか?
すみません、初心者で
0133デフォルトの名無しさん
垢版 |
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個目を借りようとしてることになる
だからエラー
0134デフォルトの名無しさん
垢版 |
2020/03/07(土) 13:13:11.28ID:e127m1PH
>>133
なるほど。
ライブラリ側なので修正できないんですが、AcとRefCell使って解決できる問題ですか?
0136デフォルトの名無しさん
垢版 |
2020/03/08(日) 11:34:51.20ID:gavt1hh0
その構造体の意図が分からんので、あんまりアドバイスできない
単にライブラリ作者がrustに慣れていないだけなら、適切な形に直してもらうのがシンプルで合理的だし、
>>130のTest::fixme相当のメソッドは誰にも呼び出して欲しくないのかもしれないなら、使うべきじゃない
Test::dostuffを繰り返し呼び出したいだけならRefCellで何とかなる
0137デフォルトの名無しさん
垢版 |
2020/03/08(日) 11:38:51.13ID:gavt1hh0
Rustで型パズルみたいな状況になるのは、見落としている前提があったり、設計レベルで何か考慮が足りないことが原因な事が多いと個人的には思ってる
姑息な解決をしてたら余計にドツボにはまる
0140デフォルトの名無しさん
垢版 |
2020/03/09(月) 10:07:04.49ID:KfBbpF5w
コンパイラをだましても本質的な解決にはならん。
そろそろrustマンセーしてる輩も気づくころだろうね。
0141デフォルトの名無しさん
垢版 |
2020/03/09(月) 12:37:33.41ID:DOrcZre+
なんかトレイトの命名でなるべく名詞ではなく動詞を使う(WriterではなくWrite、ReaderではなくRead)みたいなのがオフィシャルの文書で有ったような気がするんだけど見つからない
そんな指針って無かったっけ?
0146デフォルトの名無しさん
垢版 |
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して使っても良い
0148デフォルトの名無しさん
垢版 |
2020/03/09(月) 23:22:38.75ID:hlMkZByK
>>147
しかしそもそも借用によるフリーズって意味なくなってるから
そのページ全体書き直した方がいい感じ。
フリーズするならシャドーイングによるmut外しかな。
0149デフォルトの名無しさん
垢版 |
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

ただドキュメントは整備されてないし
ライブラリ自身のテストも通らない状態になってるから
本格的に使うなら自分でメンテするくらいの覚悟が必要かもしれん
0150デフォルトの名無しさん
垢版 |
2020/03/10(火) 19:42:21.39ID:jwXWuMzy
>>149
ありがとうございます、後継なんてあったんですね。
最近出来たみたいですがそれほどメンテされてないみたいですしこの先不安なので素直にPython使うことにします。
日本関係依存のライブラリはRustユーザー少ないので確立されたものがないのが辛いですね...
0152デフォルトの名無しさん
垢版 |
2020/03/11(水) 18:46:16.77ID:TDIek7NK
vecのinto_iter呼んだらconsumeするって
fn into_iter(self) -> イテレータ {self}
こういうふうになってるってこと?
よく分かってない質問ですみません。
0155デフォルトの名無しさん
垢版 |
2020/03/11(水) 19:46:02.45ID:vu1i9ieU
よく分からないのに納得してしまうのはよくない
0157デフォルトの名無しさん
垢版 |
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,
}
}
}
}
いやあ勉強になります
0158デフォルトの名無しさん
垢版 |
2020/03/11(水) 22:03:42.73ID:JP1MFGqI
fn into_iter(mut self) -> IntoIter<T>

このmut selfのmutの使い方について
意味は理解してるんだけど公式で解説してる箇所ある?
0159デフォルトの名無しさん
垢版 |
2020/03/11(水) 22:44:26.55ID:PgaAGaoo
なんでextern crate crate_name;ってuse crate_name;に統合されたの?
0161デフォルトの名無しさん
垢版 |
2020/03/12(木) 06:53:02.39ID:/EHADneN
serde, reqwestとかを使ってるだけの小さいツールなのに
targetディレクトリ以下がいつの間にか2GB以上喰ってて驚いた
無駄遣いしすぎだろ
0162デフォルトの名無しさん
垢版 |
2020/03/12(木) 09:00:30.33ID:TSUJe0Rk
ぜろこすとおーばーへっど(笑)
0163デフォルトの名無しさん
垢版 |
2020/03/12(木) 09:20:01.92ID:mBaP1v85
>>158
公式系のやつを一通り検索したけどなさそうだね。
確かに頻出パターンではないし、mut selfが必要になる頃には
それくらい分かるだろってことなんだろうか。
0165デフォルトの名無しさん
垢版 |
2020/03/13(金) 16:12:49.45ID:uMGbn/tA
cargo run --bin bin_a で bin_a から a にバイナリ名をrenameできる方法ない?
オプションとかで
0166デフォルトの名無しさん
垢版 |
2020/03/13(金) 17:20:18.20ID:1gFsIjGl
>>165
標準ではないと思うから以下の三択
1. コマンドを自作する
2. プラグインを探す
3. Cargo.tomlの編集で我慢する
0167デフォルトの名無しさん
垢版 |
2020/03/13(金) 17:48:43.18ID:uMGbn/tA
>>164
インクリメンタルコンパイルの内部構造知らないけど、仕組み的に一個前の状態しかもたないから関係なさそう
0170デフォルトの名無しさん
垢版 |
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
0171デフォルトの名無しさん
垢版 |
2020/03/14(土) 01:08:40.11ID:7CRfyKLY
エコシステムが充実してるのはいいが、
ぞろぞろと依存を引き連れて落ちてくるのはしんどいな。
0173デフォルトの名無しさん
垢版 |
2020/03/14(土) 13:30:22.96ID:Bfptd6Kx
Rustに限らず誰が書いたかも知らないまま誰がチェックしたかも知らないまま何がダウンロードされるかも知らないままインストールするのが当たり前になっちゃってるよな
ソースが公開されてるとは言えこれじゃいかんよなぁとは思いつつ楽だからまぁいっかな…って感じだわ(´・ω・`)
0176デフォルトの名無しさん
垢版 |
2020/03/14(土) 14:53:10.70ID:XTUayws2
node.js
0177デフォルトの名無しさん
垢版 |
2020/03/14(土) 15:14:32.21ID:kPfIlYV/
誰が書いたかも知らないまま誰がチェックしたかも知らないまま何がインストールされるかも知らないままOSをインストールするのが当たり前になっちゃってるよな
0180デフォルトの名無しさん
垢版 |
2020/03/16(月) 23:59:03.20ID:krhm4ltp
arrayvecとsmallvecってどっち使えばいいの?
0182デフォルトの名無しさん
垢版 |
2020/03/17(火) 10:23:26.40ID:6zUWJLLj
arrayvecとsmallvecよく見てないけど同じぐらい人気だからどっちでもよさそう
それよりもロガー周りが何選んだらいいか分からん(env_logger抜きで)
ファイル保存したいからlog4rsかfernかslogで迷ってる
ライブラリ選びはホントにRustの欠点だよな
0183デフォルトの名無しさん
垢版 |
2020/03/17(火) 11:06:35.06ID:fexMQ7hH
まあねぇ。 部品は連携してこそのものだから、
どっちでもいいものでもどちらかには決まってた方がありがたいってのはあるわな。
自由の強さと統率の強さは両立できないのでしゃーない。
0184デフォルトの名無しさん
垢版 |
2020/03/17(火) 11:30:02.19ID:0EWfgnGX
確かに選びにくいんだけど、型が強いのとコンパイルエラーが見やすいから、移行コストが結構低い気はしている。
なので最近はあまり気にせず適当に選ぶことにしてるな。
0186デフォルトの名無しさん
垢版 |
2020/03/17(火) 17:38:45.49ID:7aqG0pP2
rust-avって今どういう状況なん?
だいぶ前にlibavの人たちがMozillaから数万ドル支援を受けて始めたとかニュースになってたけどgithub見ても実質的にはほぼ何も進んでないようなコミットばっかだしlibavすらほぼ放置みたいな感じだし
非公開の場所で着々と進んでてそのうち公開されるんやろか
0187デフォルトの名無しさん
垢版 |
2020/03/18(水) 05:43:30.43ID:1FpZgrTM
C++の負の仕様引きずってるなってRustの特徴とかある?
0189デフォルトの名無しさん
垢版 |
2020/03/18(水) 21:47:04.33ID:ygvPU+jd
winapi 0.3.8 の環境にて、CoCreateInstanceを行いたいのですが、
REFIIDの指定部分をどのように書けばよいか教えてくださいませ
0190デフォルトの名無しさん
垢版 |
2020/03/19(木) 00:16:54.84ID:i16Q86hT
なんでassert_neはあるけどassert_notはないの?
0191デフォルトの名無しさん
垢版 |
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)*) };
}
0192デフォルトの名無しさん
垢版 |
2020/03/19(木) 15:19:47.59ID:dnKvjYNt
assert!(!false);
の方が紛らわしくないか?
assert_not!は関数名の方に!あるから見間違えないしスッキリするし直感的な気がする
それにneが内部的に反転してるだけならnotあったほうがいいな
0193デフォルトの名無しさん
垢版 |
2020/03/20(金) 07:03:37.86ID:6UN4nNu/
usize同士の差の絶対値を求めるのがすごくだるいんですけどなんかいい方法ないすか
0197デフォルトの名無しさん
垢版 |
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]);
こうしたいんですけど、どうすればいいですか?
0198デフォルトの名無しさん
垢版 |
2020/03/21(土) 19:19:05.58ID:HIaSqchS
Vec::swap使え->
Vec::swapは中でunsafe使ってるじゃないですか結局unsafe使わなきゃろくなこと出来ないんですねRustってクソですね

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

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

それがないってことは質問を装っていながらコンパイルすらしてないってことだからね
荒らすんなら荒らすでもうちょっと頭使おうね☆
0202デフォルトの名無しさん
垢版 |
2020/03/22(日) 13:10:01.70ID:HvrypJyW
Rustにも、次のような「言語定義された smart pointer」があり、
~ : 一回だけ(unique) 参照する smart pointer。
@ : 複数回参照できる smart pointerで、GC を使っている。
drop なるものが、C/C++ の free()やdeleteの機能を持つ。
という認識で正しいのでしょうか。
0203デフォルトの名無しさん
垢版 |
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>
があるようです。
凄く複雑です。
0204デフォルトの名無しさん
垢版 |
2020/03/22(日) 14:28:20.92ID:HvrypJyW
参照型の変数 r への代入は、普段は、
r = 1;
などでよいようですが、なぜか、*r と書かなければなら無い事があるようです。
また、&i32の変数rとi32の変数aを比較する場合比較する場合、
前者には *r を付けないといけないようです。
難しいです。
0206デフォルトの名無しさん
垢版 |
2020/03/22(日) 15:57:03.70ID:DNfY/SCe
rustの未来教えて
0209デフォルトの名無しさん
垢版 |
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();
としてもコンパイルが通るかもしれません。
0212デフォルトの名無しさん
垢版 |
2020/03/22(日) 17:52:35.28ID:ufFd2vaY
>>210
Rustの1.0リリースは2015年なので
それより古い資料は「昔そういう検討がなされたことがある」程度の意味しかない。
この5年の間に変わった仕様も結構あるし。
0213デフォルトの名無しさん
垢版 |
2020/03/22(日) 18:32:23.24ID:DNfY/SCe
初心者なんだけど
もし1つの変数(所有権)にマルチスレッドで書き込みをしようと思ったら、
Rustの借用のルールだと不可能ですか?
複数のイミュータブルな参照を作る事になりますが、できないんですよね?
0214デフォルトの名無しさん
垢版 |
2020/03/22(日) 18:40:28.26ID:DNfY/SCe
あまちがえました
訂正:
複数のミュータブルな参照を作る事になります
0215デフォルトの名無しさん
垢版 |
2020/03/22(日) 18:53:15.15ID:I5Su+SV6
>>213
同時じゃなければ可能なので
他のマルチスレッドプログラミングと同じく排他制御をすればいい
0216デフォルトの名無しさん
垢版 |
2020/03/22(日) 19:02:35.81ID:DNfY/SCe
実行時にデータ競合系の問題が生じない代わりに
コーディング時に借用チェッカーとの戦いをするという感じになるんですかね
0217デフォルトの名無しさん
垢版 |
2020/03/22(日) 19:17:35.15ID:thEQOCMJ
>>210 そのbookだよ。オフィシャルのドキュメントを読まずにどうして深入りできようか
1点だけ。rustではobj.method()とするとメソッドの引数の型(&とか&mutとか)に合うようにobjに*とか&とか付ける仕様になってる
メソッド呼ぶ時のobjに対してこっちが*とか&とか付ける必要は特に無い
0218デフォルトの名無しさん
垢版 |
2020/03/23(月) 01:35:58.42ID:bf1cRh+B
>>217
bookの話、了解しました。
後半、「メソッドの引数の型」とは、た第一引数 thisのことでしょうか。
0219デフォルトの名無しさん
垢版 |
2020/03/23(月) 01:39:22.78ID:h1jHr6GN
所有権、借用、ライフタイムについて勉強してみた。
でも他の言語でも排他制御とか非同期処理用クラスで非同期処理に対応できるわけで、
結局どれくらい御利益があるのか分からなかった。
0220デフォルトの名無しさん
垢版 |
2020/03/23(月) 02:29:29.77ID:bf1cRh+B
Rustの変数束縛、所有権、借用などで自動化されるのは、
「スタック変数」のポインタが、ブロックの外や関数の外に不用意に出ない
事だけで、Heapから確保されたオブジェクトの自動解放は、
参照カウンタや Garbage Collection を用いずに静的解析のみで行うことは出来ない、
という認識で正しいのでしょうか??
0221デフォルトの名無しさん
垢版 |
2020/03/23(月) 02:39:09.37ID:bf1cRh+B
>>220
例えば、Cだと、
int *func()
{
 int a;
 return &a;
}
としても警告は出る可能性はあってもコンパイルエラーにはなりませんが、
Rustでは同等のことはできないようになっていますね。
でも、Heapから確保したオブジェクトは、それを参照している変数の個数は
動的に変わります。というのは、Heapとは解放のタイミングを後に遅らせる
ための仕組みな分けですから。
オブジェクトを参照している変数の個数は静的に決まらないと言うことは、
参照カウンタやGarbageCollectionのような動的な検査の仕組みが全く無ければ
解放できないはずですね。

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

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

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

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

>A を更新 → B を更新 → Aを読み取り
スレッドA が共有資源を更新 → B が更新 → Aが読み取り
0227デフォルトの名無しさん
垢版 |
2020/03/23(月) 13:43:29.57ID:xOZDOjnM
基本的なことが理解出来てない人はまずThe Bookを読もう

次からテンプレに書いといたほうが良さそう
0228デフォルトの名無しさん
垢版 |
2020/03/23(月) 15:20:59.29ID:bf1cRh+B
読んでそこまでたどりつくのは大変過ぎますので、どなたか分かる方が >>225 に答えていただければ幸いです。
0229デフォルトの名無しさん
垢版 |
2020/03/23(月) 15:33:10.24ID:iGWxNb08
>>225
自動で解放される。なぜされるのかが気になるならいろいろ想像してないでthe bookを読んだ方がいいと思う。
0231デフォルトの名無しさん
垢版 |
2020/03/23(月) 15:38:31.12ID:bf1cRh+B
Rc<T> は参照カウンタ方式で自動解放されますが、循環参照があった場合には自動解放されず、メモリーリークするそうです。
つまり、RustはHeapのメモリーを完全自動では解放できないのです。
C#やJavaは遅いですが、循環参照がある場合でも、GarbageCollectionにより完全自動で解放されます。
0232デフォルトの名無しさん
垢版 |
2020/03/23(月) 15:39:33.51ID:bf1cRh+B
つまり、「Rustは、GarbageCollectionがなくてもメモリ解放が自動化されている」
というのは嘘です。
0233デフォルトの名無しさん
垢版 |
2020/03/23(月) 15:40:41.93ID:FLdc410A
>>228
その部分だけの説明は出来ない。 そこにたどり着くまでの説明は関連してるから。
体系立てて説明している文書が公式にあるのにそれより上手い説明が出来るわけないだろ。
0234デフォルトの名無しさん
垢版 |
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.
0238デフォルトの名無しさん
垢版 |
2020/03/23(月) 16:28:50.38ID:rbTK8rb1
真面目に回答した相手が荒らしだった時って「何だよ荒らしかよ」みたいな反応より「クッソ抜けるwww」からの「すいません誤爆しました」みたいなレスで「真面目に回答したわけじゃないぞ、シコりながら適当に回答したんだぞ」的な雰囲気を出してったほうが良さそうじゃない?
0239デフォルトの名無しさん
垢版 |
2020/03/23(月) 16:58:35.58ID:bf1cRh+B
Rc<T> だけを使って循環リストを作った場合、循環参照が生じます。
その場合、その循環リスト全体が誰からも参照されなくなって、つまり、不要に
なっても「循環参照問題」が起きるために自動解放できないのです。

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

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

GC を使えばメモリリークが起きないってわけでもないし、
「どのような保証を与えるか?」の線引きが違うだけで
きちんと学んできちんと使いこなさなきゃなんだって駄目だよ。
0242デフォルトの名無しさん
垢版 |
2020/03/23(月) 18:36:24.14ID:bf1cRh+B
>>241
別に駄目とは言ってません。
「静的解析でメモリ管理を自動化した。」
というのは言いすぎだと言うことです。
0245デフォルトの名無しさん
垢版 |
2020/03/23(月) 19:00:04.36ID:iyDg9ARV
荒らしにかまうやつも荒らし

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

もう一度書くけど、 Rust のシステムはメモリリークの排除を目的にしていない。
0249デフォルトの名無しさん
垢版 |
2020/03/23(月) 21:49:49.89ID:urYmb4Ir
リソースの開放をプログラム内で完璧にやろうとせずに
プロセスの再起動とかの水準で考えてしまえばいいこともあるかもね
0250デフォルトの名無しさん
垢版 |
2020/03/23(月) 22:15:27.45ID:0TZC4jF8
メモリ以外のリソース回収に関してはGCよりRust(あるいはC++のスマポ)がはるかに優秀なんだよな。
Rustに慣れると他言語でusingとかするのが面倒になってくるし、ついつい付け忘れて困る。
0252デフォルトの名無しさん
垢版 |
2020/03/24(火) 02:50:53.94ID:T0vrM+QL
体制側と違う意見は大事。
自分の頭で考えない人は、効能書きや権威やネットで書かれたことを鵜呑みにしてしまう。
0253デフォルトの名無しさん
垢版 |
2020/03/24(火) 10:04:19.30ID:cgACDOV9
メモリ以外のリソース回収なんてむしろなくね
0256デフォルトの名無しさん
垢版 |
2020/03/24(火) 12:43:11.53ID:I6AqzmeH
ファイルハンドルくらいならusingでもいいけど、デバイスコンテキストみたいな微妙に寿命が長いのが困る。
Disposeとか呼び忘れても大抵GCが回収してくれてぱっと見動くけど、
時々回収してくれなくて再現性の低いバグになるとか。
0257デフォルトの名無しさん
垢版 |
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にはその代わりは務まらないのではないか。
0259デフォルトの名無しさん
垢版 |
2020/03/24(火) 14:40:33.66ID:JQ7YmFwi
正しく
怖がる
0260デフォルトの名無しさん
垢版 |
2020/03/24(火) 14:43:56.87ID:oKMcqgHf
巨大学術掲示板群 - アルファ・ラボ
ttp://x0000.net

物理学 化学 生物学 数学 天文学 地理地学
IT 電子 工学 言語学 方言 国語 など
0261デフォルトの名無しさん
垢版 |
2020/03/24(火) 14:44:12.30ID:T0vrM+QL
Rustは概念が整理されてない。
Cは、ポインタという概念さえ理解すれば(そしてそれは、プログラミングに適性が有る人にはそんなに難しいわけではない)、それだけを頼りにあらゆるものが構築できた。
ところが、Rustはいくら学んでも終わりが無いくらい基礎の部分が難しい。
Box<T>が何をやっているかは、自然言語で説明されるばかりで肝心の
コードも擬似コードもなかなか見つからない。
0262デフォルトの名無しさん
垢版 |
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.
  }
}
0263デフォルトの名無しさん
垢版 |
2020/03/24(火) 15:45:47.44ID:noFaRAc6
>>257
それは悔しいけどちょっと理解できる
コンパイラーのソースみるとcompiler builtinで見れないやつとかあるし
いや、どこにあんねんと
0264デフォルトの名無しさん
垢版 |
2020/03/24(火) 16:11:12.01ID:T0vrM+QL
Option<Box<T>> で、Some(Box::new<xxx>)
とした場合に、どういう状況の時に このメモリが解放されるのか、
その仕組みも分かりにくい。
0267デフォルトの名無しさん
垢版 |
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),
}
0269デフォルトの名無しさん
垢版 |
2020/03/24(火) 17:31:35.81ID:UBy3gEYu
>>263
compiler builtinはコンパイラのソースの中にあるよ

コンパイラのソースでcompiler built-inは見たこと無いけど
0271デフォルトの名無しさん
垢版 |
2020/03/24(火) 18:46:17.48ID:8wuqSfIx
汽車 汽車 チンポ チンポ
シコシコ チンポッポ
チンポを出して シコシコ チンポッポ
0274デフォルトの名無しさん
垢版 |
2020/03/25(水) 01:18:57.46ID:COJzGufp
Rustは、コンパイラ時エラーに悩まされる反面、実行時エラーに悩まされるのを減らす
などと言われる。
しかし、コンパイル時エラーが出ると言うことは、裏を返せば、書けないアルゴリズムが存在するということだ。
直感的ではない回りくどい書き方が必要となり記述量が多くなる。
他の言語では好きな書き方が出来て、それはどれも正解だが、Rustでは正解が非常に狭くなる。
正解が狭いことがエラーを減らすなどという人がいるが、実際には、Rustは
書けるアルゴリズムが狭い、と言うことなのである。
これは言語設計の問題である。

なお、ここで言っているアルゴリズムは、全体的なものではなく、細かいミクロ的なものである。
通常の言語では、1つの仕事を細かい変数の使い方まで含めれば数万通り以上に書けるだろう。
そして、そのどれもが正解であり、結果が正しくバグも無いのだから、内のどれかが悪い書き方という
ことは特にない。
ところが、Rustでは、その大部分の書き方が出来ないのである。
駄目だから敢えてできなくしているのではなく、Rustが設計上、書けないアルゴリズムがあるということに他ならない。
つまり、Rustは書けるアルゴリズムが、本来コンピュータが書けるアルゴリズムの内の、非常に狭いサブセットに限られてしまうということである。
これは、Rustの大きな欠陥である。
0275デフォルトの名無しさん
垢版 |
2020/03/25(水) 01:25:39.41ID:COJzGufp
>>274
「駄目な書き方だからエラーにしている」
と言うのは間違いで、正しくは、
「Rustコンパイラの静的解析能力では、書き方を非常に限定しないと
 正しいことを保障できなかったり、自動化できなかったりするため、
 しょうがなく狭い書き方しか出来なくしている」
と言うことに他ならない。
人間には脳内の静的解析で明らかに正しいことが分かる書き方でも、
Rustコンパイラではでは同じことができないため、敢えて
変数束縛、借用、単一参照など、コンパイラでも解析できる程度の
範囲に書き方を限定して無理やり人間のプログラミングの可能性を
狭めているに過ぎない。
0277デフォルトの名無しさん
垢版 |
2020/03/25(水) 07:56:19.45ID:B3ciLpqT
みんなドキュメントコメントで日本語も一緒に書くときってどうしてる?
こんな連ねた感じでいいのかな?
/// Returns a Person object
/// Personオブジェクトを返す
0284デフォルトの名無しさん
垢版 |
2020/03/25(水) 16:36:38.82ID:6bd+J6i5
今だにCopyトレイトの命名は失敗だと再確認する
0286デフォルトの名無しさん
垢版 |
2020/03/26(木) 02:58:28.01ID:q1LILc/b
>>267
Option<T> は、Copy。
Box<T> は、Move。
だから、
Option<Box<T>> は、外側が Copy で、中身が Move らしい。
0292デフォルトの名無しさん
垢版 |
2020/03/26(木) 14:56:26.41ID:RidRralQ
>>291
それは >>267 とちゃんと整合しているな。
Option<T>は、Copy と Cloneの両方が実装されていると言うことで、
ならば、原則論からすればOptionは代入演算子でMove動作「ではなく」Copy動作
だということになる。
0293デフォルトの名無しさん
垢版 |
2020/03/26(木) 15:33:44.04ID:5np4UAxw
>>292
>ならば、原則論からすればOptionは代入演算子でMove動作「ではなく」Copy動作
は?
where T: Copyって書いてるやん
オレオレ原則論書き散らかして荒らすのやめてくれ
0294デフォルトの名無しさん
垢版 |
2020/03/26(木) 17:17:35.74ID:mwwmClxG
c++の代替というけど、rust理解するにはc++でメモリイメージ固めた方が学習速いんじゃねーの?
0296デフォルトの名無しさん
垢版 |
2020/03/26(木) 21:50:13.71ID:HC2i5ubn
ML系列の記法に慣れるとrustがどうしてalgol系列の記法にしたのか納得できなくなる。どんだけカンマ打たせるねん。
少し頑張れば関数の型も推論できると思うんだけど人まかせにしてるのが好きじゃない。せめて、勝手に挿入できるような記法にしとくべきだったと思う
0297デフォルトの名無しさん
垢版 |
2020/03/27(金) 00:25:53.78ID:GUIIkCWN
インスタンスでフィールドアクセスにカンマ使わない場合どんなのがいいの?

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

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

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

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

物理学 化学 生物学 数学 天文学 地理地学
IT 電子 工学 言語学 方言 国語 など
0319デフォルトの名無しさん
垢版 |
2020/03/30(月) 03:34:27.53ID:QPHAwv8T
>>318
let i = 1;
let &i = i;
これだとコンパイル通らないよ
0321デフォルトの名無しさん
垢版 |
2020/03/30(月) 03:57:10.09ID:Oymj8mf6
iter.map(|i| i * 2)
と書いた場合、|i| i * 2 の部分は、closure や Lambda expression, lambdas
と呼ばれるものなんだろうけど、|&i| と書く形式はなかなか検索では出てこない。
0323デフォルトの名無しさん
垢版 |
2020/03/30(月) 04:40:37.32ID:Oymj8mf6
>>322
ところで、
let &x = y;
ってどういう意味ですか?

let y:i32 = 5;
let x:&i32 = y;
とは違うんでしょうか?
0325デフォルトの名無しさん
垢版 |
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
0327デフォルトの名無しさん
垢版 |
2020/03/30(月) 14:34:27.40ID:yinACqvq
>>326
C で言う void みたいなもんだよ。
あり得ない型を指定してエラーメッセージを出させたら
メッセージに右辺の側の型も表示されるという
型確認のテクニック
0328デフォルトの名無しさん
垢版 |
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されてない
0329デフォルトの名無しさん
垢版 |
2020/03/30(月) 16:45:46.87ID:Oymj8mf6
>>327
なるほど。貴重なテクニック有難うございます。

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

何か lifetimeを確認する方法をご存知の型がいらっしゃればご教授頂ければ幸いです。
0331デフォルトの名無しさん
垢版 |
2020/03/30(月) 18:43:59.32ID:QPHAwv8T
/1SwYHDd氏やるなぁ
こういう細かいことまで知ってる人のRust歴気になる
0332デフォルトの名無しさん
垢版 |
2020/03/31(火) 00:49:28.04ID:bdtzxXSI
さっきオナラしようとしたらウンチが少し出てしまったんだけど
ばれてないからいいよね ごめんね
0335デフォルトの名無しさん
垢版 |
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(||{
は?正常終了つってんだろが?エラー値で返すんじゃねえよバカか?
})?;
0338デフォルトの名無しさん
垢版 |
2020/04/01(水) 09:19:54.63ID:yrAQuZWY
構文を調整したいならマクロじゃない?
let v = safe_get!(v, {
失敗した
return Ok (());
});
みたいな。ベタ書き以外でearly returnしたいならマクロか?演算子みたいにコンパイラサポートがいると思う。
0339デフォルトの名無しさん
垢版 |
2020/04/01(水) 10:13:55.16ID:0Fs3VJge
なんでboolって1byteあるの?
0340デフォルトの名無しさん
垢版 |
2020/04/01(水) 11:20:10.79ID:5VJq6KKK
C は bit field あるのにな
0341デフォルトの名無しさん
垢版 |
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
0344デフォルトの名無しさん
垢版 |
2020/04/01(水) 13:43:58.79ID:npfcBiID
>>343
それはearly returnって言わなくない?
そりゃ結果は同じだけど、元の人は構文的なことを言ってるわけで。
0345デフォルトの名無しさん
垢版 |
2020/04/01(水) 14:12:02.37ID:Wuhu+msT
ネストが嫌なんだから無理でしょ
ネストしないコードを書く人なんだろうけど
0346デフォルトの名無しさん
垢版 |
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(())
}
0347デフォルトの名無しさん
垢版 |
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);
}};
0348デフォルトの名無しさん
垢版 |
2020/04/01(水) 20:41:14.76ID:SX13wyIA
>>347
だからその冗長な部分はマクロで潰せと言ってるんだが。
マクロが嫌なら無理としか言いようがないが。
0352デフォルトの名無しさん
垢版 |
2020/04/01(水) 21:36:47.02ID:qjrNWUcZ
>>347
>"処理と戻り値"を伴う""正常""の早期returnをしたいといってるだろがErrでラップして返すとかバカか?

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

まぁそれはいいとしてearly returnだけじゃなく
戻り値の型と取り出した値をどうするかをセットで考えてないから
そうなっちゃうんだと思うよ
0353デフォルトの名無しさん
垢版 |
2020/04/01(水) 22:01:23.20ID:SX13wyIA
RFCざっと見てきたけど、あっちでも
「map_errでいいんじゃ?」「return;できねーよ」ってやってるな。
そんなに難解なリクエストでもないと思うんだが。
0354デフォルトの名無しさん
垢版 |
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
って同意義ですか?
0355デフォルトの名無しさん
垢版 |
2020/04/02(木) 03:46:30.54ID:0zdT1xZ7
>>354
恐らくだけど、前者は必ずその関数を定義する。
後者は、Fがその型の場合にのみその関数を定義する。
0356デフォルトの名無しさん
垢版 |
2020/04/02(木) 03:48:18.19ID:0zdT1xZ7
なお、このような場合の whereは、日本人感覚からすれば、ifと読み替えてもいい。
0357デフォルトの名無しさん
垢版 |
2020/04/02(木) 05:35:03.07ID:zwgg3bUK
前者の場合 check::<T, F>() でコールできるが後者はできない
0358デフォルトの名無しさん
垢版 |
2020/04/02(木) 17:07:56.47ID:SaXsz2/b
前者と後者が逆?
0360デフォルトの名無しさん
垢版 |
2020/04/02(木) 21:53:44.49ID:zwgg3bUK
>>358
逆にだったすまん
0361デフォルトの名無しさん
垢版 |
2020/04/02(木) 23:30:20.89ID:SaXsz2/b
そもそもcheck::<T, F>()じゃ引数渡してないから呼び出せなくない? 試してないけど
0362デフォルトの名無しさん
垢版 |
2020/04/03(金) 00:13:24.70ID:RIPEgpHK
構文で解決すべきところを皆が俺俺マクロで解決して統一感ない状態を生むのが良いと考えるやついるのか?
0363デフォルトの名無しさん
垢版 |
2020/04/03(金) 00:44:31.97ID:11HfTHW1
if foo.is_none() {
シンプルにこれでいいと思うんだが...
これぐらいの細かい挙動で構文拡張しろとかマクロ書けとかなったらC++みたいになっていくのが目に見えるしから嫌だわ
しかもこんな嫌だ嫌だ言ってて質問する立場なのにこんな逆ギレもしてて救いようがない
0364デフォルトの名無しさん
垢版 |
2020/04/03(金) 00:44:38.25ID:8O7qKRUc
現状は335が冗長と言う状態で統一されてるんだからいいんじゃないの。
その冗長さをどうしても許容できない人は(少数派である以上)マクロで解決するしかないし、もし大多数が賛同できる新構文を思い付いたならRFC出せばいい。
0365デフォルトの名無しさん
垢版 |
2020/04/03(金) 14:52:15.88ID:11HfTHW1
test bench_test ... bench: 111,111 ns/iter (+/- 11,111)
ベンチマークの +/- ってどういう意味?
0366デフォルトの名無しさん
垢版 |
2020/04/03(金) 15:47:04.36ID:uTu5qR57
>>363
is_none()は==NULLや==nilと同じ書き忘れのリスクを伴う"プログラマの注意力"を消耗するだけのゴミだろ
0368デフォルトの名無しさん
垢版 |
2020/04/03(金) 19:54:55.15ID:CGYa3yhA
if letやmatchにしないとSomeだったときの処理書けないしょ
0370デフォルトの名無しさん
垢版 |
2020/04/04(土) 00:07:28.35ID:cnL2FB3T
rust実用化に成功したプロジェクトって何があるの?お前らの会社では成功してるの?
0374デフォルトの名無しさん
垢版 |
2020/04/04(土) 08:43:05.69ID:ziV4A0+Z
Utcはフィールドを持たないstructだから
イメージ的にはUtc{}.ymdとしているかんじ
0377デフォルトの名無しさん
垢版 |
2020/04/04(土) 17:26:12.04ID:9lNQDQEm
pub が付いてないものをそんなに簡単に使えたらモジュールの意味がないやろ……。
0378デフォルトの名無しさん
垢版 |
2020/04/04(土) 17:26:43.72ID:9lNQDQEm
そのモジュールをコピペして新しいモジュールを作れば自由に出来るんとちゃう?
0380デフォルトの名無しさん
垢版 |
2020/04/04(土) 20:42:49.37ID:oHbtMe0Y
iteratorを受け取ってSelfを返す。
iteratorは各要素がImageResult<Frame>のもの

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

‘aはiteratorのlifetimeをSelfのlifetimeにするため
0382デフォルトの名無しさん
垢版 |
2020/04/05(日) 10:19:35.11ID:LNp8foc9
>>381
dyn は C++ で言う抽象クラスみたいなもんだよ。
トレイトオブジェクトというのは実際にはそのトレイトを実装している様々な型の可能性があって、
それら全てを格納可能な大きさはわからない。
Box は C/C++ でいうポインタみたいな用途で使われる。
大きさがわからなくてもオブジェクトの場所を指すことは出来る。

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

ライフタイムの 'a は Frames の型引数の 'a と同じだから、
new の返り値 (Self) の寿命は iterator の寿命と同じになる。
0383デフォルトの名無しさん
垢版 |
2020/04/05(日) 11:42:45.53ID:/6aVgV0B
Boxと&dynの違いって参照元がヒープかスタックかの違い?
0385デフォルトの名無しさん
垢版 |
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も書いてるように前者は動的ディスパッチ、後者は静的ディスパッチなので
異なる型が混在するコレクションを使いたい時やバイナリサイズを小さくしたい時以外は
ジェネリクスを選ぶほうが一般的
0386デフォルトの名無しさん
垢版 |
2020/04/05(日) 17:53:06.31ID:fOt2g8TG
あーなんとなくわかってっきた
ジェネリクスと同じことがトレイトオブジェクトでも実現できて、その書き方がBox<dyn...>ということか
0388デフォルトの名無しさん
垢版 |
2020/04/05(日) 21:52:05.83ID:/6aVgV0B
そもそもRustはかなり型のサイズに厳しいけどなんで?
コンパイラの最適化のため?
0389デフォルトの名無しさん
垢版 |
2020/04/05(日) 22:38:29.83ID:8bGOOvBY
>>388
他言語なら暗黙的に参照として扱われるようなものも
明示的に&を付けたりBox化することを求めるから厳しく感じるんだと思う

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

>大前提として変数や関数の引数や戻り値はコンパイル時にサイズが決まってないといけない
↑これ他言語でも常識かもしれないけど自分はRustやるまで意識したことなかったよ
0390デフォルトの名無しさん
垢版 |
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では
0391デフォルトの名無しさん
垢版 |
2020/04/05(日) 23:12:44.10ID:/qXmUwFk
途中で送ってしもた。

rustでは当たり前に見えるけどこんな事してるのrustくらいでヒープが必要ならクロージャさえも自分でbox化する必要がある。
0392デフォルトの名無しさん
垢版 |
2020/04/05(日) 23:13:46.13ID:dvIeqTXE
スタック上に長さ不定のデータが作れるとバグの温床になる。
他の言語だと大体の値がヒープに乗せること前提で動いているんで気にしたことが無いのだと思われる。
C/C++でも非推奨なんだけど、初心者向け釣りサイトでは平気でやってることがあるし、できちゃうから面倒
0393デフォルトの名無しさん
垢版 |
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
}
0394デフォルトの名無しさん
垢版 |
2020/04/06(月) 00:54:32.32ID:jrbG9hxT
>>390
impl Traitは引数にも使えるよ

>>393
[A]だとサイズがコンパイル時に決まらないから&[A]か&mut [A]を返すのはできる
ただ入力がVecで長さが不定なので
出力の参照元にその長さの配列を使うのは無理じゃないかな
0395デフォルトの名無しさん
垢版 |
2020/04/06(月) 00:59:52.27ID:jrbG9hxT
あと関数内部で配列生成したら
そのlifetimeが関数内に閉じるので参照も返せないね
0396デフォルトの名無しさん
垢版 |
2020/04/06(月) 01:07:26.57ID:jrbG9hxT
やるとしたら
外側のスコープで固定サイズの配列をバッファとして作っておいて
関数ではバッファを満たして返すイメージ
0397デフォルトの名無しさん
垢版 |
2020/04/06(月) 01:16:22.32ID:FD55gb+K
C言語でいうところの if ( (c=foo()) == bar) { ...(cを使う処理)
みたいなことやりたいんですがどうすればいいですか?
fooが結構重くて2回呼び出したくないのですが、
let c = foo();
if c == bar {...
とやるしかない?
0398デフォルトの名無しさん
垢版 |
2020/04/06(月) 01:49:32.44ID:JJIxYQHA
matchとifガード使えば似たようなことは出来る
0399デフォルトの名無しさん
垢版 |
2020/04/06(月) 02:48:45.03ID:WU94L+3C
>>396
何かしらのライブラリでなんかないかな?
static使うぐらいなら素直にVec使うわ...
0401デフォルトの名無しさん
垢版 |
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
0403デフォルトの名無しさん
垢版 |
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できないので不便
0404デフォルトの名無しさん
垢版 |
2020/04/06(月) 23:45:59.83ID:TaQVQ6iW
>>402
実行時に型を振り分けるとなると仮想関数テーブルを辿る必要があるんで実行時コストが少し増えるよ。
(Rust では仮想関数って言わないのかな? 正確な用語がわからん。)

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

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

その関数では何ができるのか、そして「何をしてはいけないのか」ってのを考えると
Rust らしいプログラムが出来ると思う。
0405デフォルトの名無しさん
垢版 |
2020/04/07(火) 08:14:23.99ID:FPXvnSDp
APIサーバーでJSON受け取るときに値の型が違ったりオーバーフローするときってどうしてる?
serde_json::from_str で構造体の属性でエラーメッセージとかつけれたらいいのにな
0406デフォルトの名無しさん
垢版 |
2020/04/07(火) 15:06:01.62ID:+YUDNjw9
from_strの結果そのまま使ってるけどダメなの
シンタックスエラーとか含めると大変じゃない
0407デフォルトの名無しさん
垢版 |
2020/04/07(火) 15:54:15.51ID:FPXvnSDp
海外向けサーバーだったらいいけど日本向けサーバーの場合は?
serde_jsonのエラーメッセージcustomizableじゃないから辛い
0408デフォルトの名無しさん
垢版 |
2020/04/07(火) 16:02:31.28ID:+YUDNjw9
serde_json::Error を見ると行と列と大雑把な原因はとれるみたい
細かくやるなら置換するしかなさそうだね
0409デフォルトの名無しさん
垢版 |
2020/04/08(水) 10:01:13.64ID:qyTF9Er6
reached the configured maximum number of stack frames
でスタックフレームの制限にかかるんだけどオプションとかで変えれる?
0410デフォルトの名無しさん
垢版 |
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
0411デフォルトの名無しさん
垢版 |
2020/04/11(土) 23:59:49.19ID:Ni1vKiQd
フルパス書かなくてもいいように
mod.rsに指定されてるものとされてないもの
0413デフォルトの名無しさん
垢版 |
2020/04/13(月) 09:02:25.60ID:45YCco/F
それが必要な理由は?ここはお前の便利帳じゃねーんだから
有益な使い方が有れば紹介してから聞け
0415デフォルトの名無しさん
垢版 |
2020/04/13(月) 11:59:07.30ID:WFzH9Pd8
>>413
データ入ったVecと各種定数とメモ化用のmutなHashMap使ったDFSするときとか、引数がむっちゃ長くなるんです

>>414
全然わからんのであきらめます・・・
0416デフォルトの名無しさん
垢版 |
2020/04/14(火) 07:17:51.31ID:WrIQImmd
Copyでの関数呼び出しとポインタ作成ってコスト的にはプリミティブのどの型からが処理重い?
ここらへんCSの知識ないからわかんない
0417デフォルトの名無しさん
垢版 |
2020/04/15(水) 02:35:11.54ID:rawye3jg
Rust仕事で使ってる人〜
ウチはコロナの影響でプロジェクト吹き飛んだよん( ;∀;)
0419デフォルトの名無しさん
垢版 |
2020/04/15(水) 05:30:29.65ID:SZSUFLJC
組み込みで試験的に導入したけどムズイ
まあ慣れの問題もあるのだろうけど
0421デフォルトの名無しさん
垢版 |
2020/04/15(水) 21:11:58.85ID:60TKpqE+
Nimは?
0422デフォルトの名無しさん
垢版 |
2020/04/15(水) 21:27:25.14ID:8I3eMZIA
ATS2ってRust以上にドキュメントが少なくてHaskell以上に難解なアレじゃないですかやだー!
0424デフォルトの名無しさん
垢版 |
2020/04/16(木) 09:03:49.64ID:YGIESbh5
Rust界隈で一番貢献度高いのってAlexとかになるかな?
0428デフォルトの名無しさん
垢版 |
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でコンパイルを通すにはどうすればよいのでしょうか?
0429デフォルトの名無しさん
垢版 |
2020/04/18(土) 18:14:53.19ID:EW6Y9RQI
Alexが人の話聞かないってこと?
0432デフォルトの名無しさん
垢版 |
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();
最初のインスタンスは読みにくいからこうするかも、それかマクロかビルダー作るか
0433デフォルトの名無しさん
垢版 |
2020/04/23(木) 19:29:00.20ID:WjWrG05V
トレイトって機能を追加するときどういう機能であるかの特徴を一見して分かりやすくするためだけのもの?
0435デフォルトの名無しさん
垢版 |
2020/04/23(木) 22:36:03.84ID:5udoMUF9
>>433
とりあえずはJavaやC#のインターフェースっぽいものとして捉えておけばいいんじゃないのかな
やってるうちに違いも分かってくる思うので
0439デフォルトの名無しさん
垢版 |
2020/04/26(日) 01:44:31.54ID:bgNhzTiH
>>438
関数

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

そうすると結局クロージャも関数と同じように適切なシグニチャを考える必要があるから
関数化に比べて楽ってことはないんじゃないかと思う
0445デフォルトの名無しさん
垢版 |
2020/04/26(日) 14:52:26.46ID:WcQXqCZk
連休だけでRustかけると思うことが間違ってるよ
0450デフォルトの名無しさん
垢版 |
2020/04/27(月) 09:24:11.80ID:xj40wisa
rustいつのまにか蟹のイメージになってるけど、オライリーの影響?それとももっと前から何かあるのかな?
0452デフォルトの名無しさん
垢版 |
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
ってなるんだけどバグ?
0453デフォルトの名無しさん
垢版 |
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可能
0456デフォルトの名無しさん
垢版 |
2020/04/27(月) 14:12:45.55ID:ZRv/ULjO
学術の巨大掲示板群 - アルファ・ラボ
ttp://x0000.net

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

PS 連続と離散を統一した!
ttp://x0000.net/topic.aspx?id=3709-0
0457デフォルトの名無しさん
垢版 |
2020/04/27(月) 15:43:57.57ID:vsE9eV5m
>>454
thx 見逃してた
0460デフォルトの名無しさん
垢版 |
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は全順序や!
0461デフォルトの名無しさん
垢版 |
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();
}
}
0462デフォルトの名無しさん
垢版 |
2020/04/28(火) 01:37:40.02ID:aaB86vh6
>>461
後者は関数型言語風ってだけでしょ
関数型言語で is_some() にあたる関数は存在しなかったり、有るけど使うなって扱いだったりする
0463デフォルトの名無しさん
垢版 |
2020/04/28(火) 02:09:21.04ID:nfkWT3p7
テレワーク中なのか連休入ったせいなのか知らんけど猛者が全部回答してくれるから助かるわ
0464デフォルトの名無しさん
垢版 |
2020/04/28(火) 07:51:49.83ID:SJTliuFD
>>461
前者
0465デフォルトの名無しさん
垢版 |
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
}
}
0466デフォルトの名無しさん
垢版 |
2020/04/28(火) 12:32:50.40ID:GQyYGa/W
filter(...).is_some()
って形はかなり読みにくい
ようは設計が悪い
0469デフォルトの名無しさん
垢版 |
2020/04/29(水) 20:08:03.11ID:lsvcqJYy
Rustやる前に軽くScalaとかHaskellやっとけば
コレクションライブラリ見たときに「あっ、これ進研ゼミでやったところだ!」って
なるから理解が早いよ
0475デフォルトの名無しさん
垢版 |
2020/05/01(金) 10:58:05.97ID:gc2qK0CV
>>471
酷いAPI
stdがどうなってるかぐらい見たほうがいい
0476デフォルトの名無しさん
垢版 |
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
0477デフォルトの名無しさん
垢版 |
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ではない
もう少しちゃんと読もう
0478デフォルトの名無しさん
垢版 |
2020/05/01(金) 13:58:40.83ID:i4mzH/oB
>>476
デフォルトでサイズが大きいという結論は間違ってないけど
もうちょっと英語ちゃんと読んだ方がいいと思う…。
あとその回答には書いてないけど、頑張ればCにサイズで勝つことは可能だったはず。
0479デフォルトの名無しさん
垢版 |
2020/05/01(金) 20:43:43.74ID:suCtdez/
>>476
Cで書いたプログラムが小さいのは標準ライブラリを利用しているから、だったと思うんだけど違った?
rustはmallocも自身に含めてたはずだし、Cの標準ライブラリ使うならもっと小さくなるはず

って>>476のQuoraの回答にちゃんと書いてあるじゃん!Cで15kb、Rustで14kbって!
自分でリンク貼るならちゃんと読め!もう!
0481デフォルトの名無しさん
垢版 |
2020/05/02(土) 00:00:07.90ID:rieFiUeI
release profileでもデバッグシンボル含めてるからprofileオプション安定化までお預けかな。
0484デフォルトの名無しさん
垢版 |
2020/05/02(土) 10:05:59.92ID:8Sc54whm
お前らおっぱいだって大きいほうが好きなくせに何バイナリのファイルサイズが大きめだからって文句言ってるんだよ
0488デフォルトの名無しさん
垢版 |
2020/05/02(土) 15:10:30.93ID:f7vdsp57
let hoge = match s {
  "hage" => hage,
  "moge"=> moge, // 何かの関数や構造体を返そうとしたがhogeは一意の型しか受け取らないから無理
  _=> return
}
loop {
  hoge()
}

的な事やろうと色々試したけど、超絶複雑な事になってヤバい匂いしかしない。
ループの外でループ内で呼ぶ関数の分岐を書くのは何かのアンチパターンなのか
そもそも、ループの中でMatch書いても外からイミュータブルな値を渡すの分かってるなら
コンパイラが最適化してループ毎に分岐なんてしないから普通に入れて書けば良い?
0489デフォルトの名無しさん
垢版 |
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を拡張するのはめんどくさいから
自分ならイテレータを受け取ってイテレータを返す関数で我慢する
0490デフォルトの名無しさん
垢版 |
2020/05/02(土) 16:54:44.18ID:4YXjnjKT
>>488
hoge用にhageかmogeをとれるenumを定義すれば型は一意に定まる。
別にループ内でmatchしても分岐予測はほぼ当たるだろうし
性能的に問題はないと思うけど。
0491デフォルトの名無しさん
垢版 |
2020/05/02(土) 16:58:06.87ID:4YXjnjKT
あるいはFnとかにして型を揃えれば
loop内の分岐はなくなるかな。
たださっきも書いた通り分岐をなくすことに
それほど意味があるとも思えない。
0493デフォルトの名無しさん
垢版 |
2020/05/03(日) 14:40:33.37ID:CQw0w+cb
>>488
enumで紐つけても結局hogeでmatch使う事になる。
Fnで返すと所謂if文と関数ポインタどっちが早い?的な事になって
最適化するとif文のが早くなる。つまりループの中でMatchしとけば良い。
0494デフォルトの名無しさん
垢版 |
2020/05/03(日) 21:48:29.60ID:zX3s2fU5
rustのenumはsum typeだからjitがあればmegamorphicでもtracingじゃなくてもjit効いて
インラインキャッシュも必要ないからそのままインライン展開出来るんだが、この辺がAOTの限界だな。
まあ、分岐予測外れるような呼び出しなら初めからvtable使うだろう。

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

シグニチャに書くことで可読性が高まるケースであれば使えばいいと思うけど
そうじゃなければ一旦受けてから関数内で分割したほうがよさそう
0496デフォルトの名無しさん
垢版 |
2020/05/04(月) 11:52:28.65ID:sauq4xLT
レンジ自体にマッチしたいんだけど書きかたって今はない?
match 1..3 {
2..3 => println!("2..3"),
1...3 => println!("matched!"),
_ => println!("_"),
}
0497デフォルトの名無しさん
垢版 |
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!("_"),
}
0498デフォルトの名無しさん
垢版 |
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でもよかったんじゃ
0500デフォルトの名無しさん
垢版 |
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でもよかったんじゃ
んん?
そもそも「レンジ自体にマッチしたい」ってどういう用途?
0501デフォルトの名無しさん
垢版 |
2020/05/06(水) 11:12:57.23ID:exILxtx0
Rust の API についてはメソッドのシグネチャとコメントからドキュメントを生成できるけど、
バイナリクレートにユーザー向けのドキュメントを付けるときの作法とかってあるの?
0504デフォルトの名無しさん
垢版 |
2020/05/07(木) 16:40:36.21ID:82eQknS5
ドキュメントコメントでのassetでのテストとmod testsってどう使い分けたらいいの?

ドキュメントテストすればユニットテスト書かなくていい?
ドキュメントは使用例だけで、assertでのテストって意味なくね?って思ってしまう。無視もできるし
0505デフォルトの名無しさん
垢版 |
2020/05/07(木) 17:28:34.50ID:k47Mu4KT
>>504
ドキュメントテストはドキュメントであってテストではない。
説明上分かりやすいならassertしてもいいけど、別になくてもいい。
それでもドキュメントテストを通すのは、古いサンプルコードがいつの間にかコンパイル通らなくなっている、というのを防ぐため。
ユニットテストは普通にmod testsで書けばいいよ。
0506デフォルトの名無しさん
垢版 |
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
0507デフォルトの名無しさん
垢版 |
2020/05/07(木) 19:32:09.83ID:ywncHnjy
>>506
derive使うのやめて自分でClone実装したわ
deriveのCloneがおバカということがわかっただけ収穫とするわ
0508デフォルトの名無しさん
垢版 |
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
0509デフォルトの名無しさん
垢版 |
2020/05/07(木) 21:47:17.14ID:82eQknS5
>>505
てことはドキュメントで書いたコードは普通のコンパイルエラー検知しなくてassertのエラーだけ検知するの?
なんかそれはそれでやばくないか
0510デフォルトの名無しさん
垢版 |
2020/05/07(木) 21:48:25.25ID:TSVqZJLC
コンパイル通さずにどうやってassertだけ通すんじゃ
0512デフォルトの名無しさん
垢版 |
2020/05/07(木) 23:07:35.28ID:k47Mu4KT
>>509
いやいや、コンパイルエラーは検知したくてassertはどっちでもいいって話。
コンパイルできないサンプルコードを検出したいんだから。
0513デフォルトの名無しさん
垢版 |
2020/05/08(金) 15:31:13.15ID:2R+BCvOe
なんで型って大文字始まりなのにi32とかは全部小文字始まりになってんの?
初期のデザインミス?
0516デフォルトの名無しさん
垢版 |
2020/05/09(土) 06:11:48.26ID:gxFlq1V3
Rustみたいに標準ライブラリは最小に留めてるような言語って他にありますか?

それとコンパイラ内部のCargo.tomlにライブラリのバージョン書けば別に最小に留めなくてもと思うんですが、どうでしょうか?
0519デフォルトの名無しさん
垢版 |
2020/05/12(火) 08:44:05.53ID:l1cRSbJI
これってなんで&mut になんの?
n: mut &i32のほうが差分的にも視覚的にもいいと思うけど、どっかに理由とか書かれてないかな?
fn example(n: &mut i32) {
}
let mut r = &10;
example(mut r);
0521デフォルトの名無しさん
垢版 |
2020/05/12(火) 11:12:17.10ID:rr7jvTFY
>>519
変数がmutableなのか、immutableなのかと
変数の型がownedなのか、shared referenceなのか、mutable referenceなのかとは別

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

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

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

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

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

>>526 のパターンとかも今までの書き方だとかなり読みにくいよね
0529デフォルトの名無しさん
垢版 |
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
0531デフォルトの名無しさん
垢版 |
2020/05/12(火) 22:36:30.89ID:RlXY9TUm
>>530
使いたくなくてもネットワーク使うcrateがtokioにべったり依存してて
非同期にこだわる意味ないアプリでも使わざるを得なくなるのがRustのダメなとこ
0533デフォルトの名無しさん
垢版 |
2020/05/13(水) 01:28:10.47ID:IZIPIE/9
非同期に拘らないならstd::net使えばよくない
0534デフォルトの名無しさん
垢版 |
2020/05/13(水) 14:58:18.04ID:n4QRUOl7
今の主流は tokio か async-std だけど io-uring 対応でまた勢力図に変化が起きたりするのだろうか
0535デフォルトの名無しさん
垢版 |
2020/05/13(水) 22:46:58.63ID:0Q+bejh+
乗り遅れた。
tokioは使ってないけどデスクトップでnon-blocking file ioが欲しい。ブロックしたら並列の意味がない。

>>531
ランタイムと付いてくるapiで肥大化するのが問題なんだよね。
0537デフォルトの名無しさん
垢版 |
2020/05/14(木) 09:41:17.62ID:WpNijTVY
望まぬ非同期は一応 tokio::runtime::current_thread::block_on_all() で回避できるか
それでもビルドが一気に遅くなる
0539デフォルトの名無しさん
垢版 |
2020/05/14(木) 18:17:46.89ID:nGNfHuw+
なるほど
0540デフォルトの名無しさん
垢版 |
2020/05/14(木) 21:36:47.59ID:AoVs9mpY
日本のRust界隈で有用なRust関連のツイートしてる人教えて
0542デフォルトの名無しさん
垢版 |
2020/05/15(金) 09:40:19.45ID:OlE2WbGd
0543デフォルトの名無しさん
垢版 |
2020/05/16(土) 07:49:09.76ID:4fgNGNa5
io-uringと今までの非同期処理の違いってなに?
パフォーマンスそれほど変わるもんなの
0545デフォルトの名無しさん
垢版 |
2020/05/18(月) 04:57:51.24ID:z6Kgscbk
返り値に &'static str ってライフタイム指定ないといけないけど、推論だけで解決できない問題があるから書かないといけないの?
Stringからderefで生成した&strでも結局はIO以外で来たStringは'staticでしょ?推論できそうだけど
0547デフォルトの名無しさん
垢版 |
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 -> ()
というコードが正しいかどうか、実際に長い長ーい計算しないと分からないけどできるならやれってことやな!絶対使わんわ!
0549デフォルトの名無しさん
垢版 |
2020/05/21(木) 13:46:29.84ID:e7acrJyd
競技プログラミングだとアルゴリズムの理解はともかく言語機能の活用は必ずしも身につかないしなぁ……。

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

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

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

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

>>562
その型はスライスだから全く別。しかも&もないからそんな型ない
0564デフォルトの名無しさん
垢版 |
2020/05/23(土) 22:35:14.94ID:xQEe6NOh
let x = Box::new(String::from("foo"));
let y = *x;

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

>>564
Boxのrustdocに書いてある
0566デフォルトの名無しさん
垢版 |
2020/05/24(日) 01:52:15.18ID:tkUtJ987
>>565
[[[i32; 3]; 3]] は存在できるが [[[I32]]] は存在できない
配列の要素毎にサイズが可変となってしまう
0567562
垢版 |
2020/05/24(日) 09:30:45.62ID:SCWt5xFf
>>566
スライスにとって要素の数の情報は動的なもの (実質的に fat pointer) で
配列にとっての要素の数は型の一部ってこと?
0568デフォルトの名無しさん
垢版 |
2020/05/24(日) 17:28:53.26ID:tkUtJ987
>>567
そういうこと
もっと言うと [T] の要素数情報は配列自体ではなく配列への参照 (fat pointer) が保持してるから
[T] が単独で存在することはできなくて、
参照経由の &[T] やスマートポインタ経由の Box<[T]>, Rc<[T]> といった形でしか存在できない
0569562
垢版 |
2020/05/24(日) 17:59:17.80ID:SCWt5xFf
>>568
そういうことか。
fat pointer を基礎に据えることを除けば
C/C++ のルールとかなり似てるのでわかりやすいな。
(けどそれ故に C/C++ 的な考え方に引きずられてしまう部分もある……。)
0573デフォルトの名無しさん
垢版 |
2020/05/25(月) 09:27:38.21ID:Jp/r3UJz
traitのFizzbuzzに付属してるtrait群がいいね。From実装してなくて爪甘いけど
0574デフォルトの名無しさん
垢版 |
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よめ。
0576デフォルトの名無しさん
垢版 |
2020/05/26(火) 09:22:21.48ID:yWo2qZ2t
>>574
(要素数と要素サイズがコンパイル時で既知である必要があるarrayの形では)存在できない
と読んでくれ
0577デフォルトの名無しさん
垢版 |
2020/05/26(火) 12:44:21.66ID:tQI2iyhC
::stdの指定の仕方ってなんで使うの?stdじゃなくて
自作のmod std作った時にしか被らないぐらいしか利点なさそう。しかもそんな紛らわしい名前で作らないし
0579デフォルトの名無しさん
垢版 |
2020/05/26(火) 23:27:54.23ID:yWo2qZ2t
std以外のcrateにも使えるから、モジュールとの名前かぶりで使わざるを得ないときもある
testとか
0580デフォルトの名無しさん
垢版 |
2020/05/27(水) 10:28:00.44ID:dVIhbWpz
2018の次期バージョンっていくつ?
0582デフォルトの名無しさん
垢版 |
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!(),
}
}
}
0583デフォルトの名無しさん
垢版 |
2020/05/28(木) 10:15:20.06ID:Xow4Xb3r
>>582
どっちでもいいと思うけど自分ならfrom_str選ぶ
理由はenumをnewするのにResult(かOption)が返されるシグニチャよりも
input.parse::<KansaiPref>()してResultが返されるほうが意図が伝わりやすいから
0584デフォルトの名無しさん
垢版 |
2020/05/28(木) 12:26:13.92ID:XHarSIwj
>>582
俺は初心者だから意見としてはそれほどあてにならないけど、
from_str を使った方がいいと思う。
new はただの習慣だが FromStr は制約として機能するので、
既存の枠組みの中で便利に機能する可能性がある。
0587デフォルトの名無しさん
垢版 |
2020/05/29(金) 16:33:26.54ID:nAKVwuCz
let a : Box<[T; 1000]> = Box::new([Default::default();1000]);

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

前提条件として変数の型は Box<[T; 1000]> というのは固定ということにして、
unsafe も避けられるものなら避けたい。
0589デフォルトの名無しさん
垢版 |
2020/05/29(金) 21:21:26.13ID:tZarZhzR
>>586
標準でString or &str のパース失敗時に返すErrの型とかあんの?
0590デフォルトの名無しさん
垢版 |
2020/05/30(土) 00:58:42.40ID:wj/8yI7A
vec! と同じような使い勝手の box! があってもよさそうな気がするけど、
そういうクレートがあったりする?
0595デフォルトの名無しさん
垢版 |
2020/05/30(土) 13:01:17.39ID:QgJ1kT2w
>>594
#は直後の構文要素に対するアノテーションで
#!はそれを含むスコープ全体へのアノテーション。
0597デフォルトの名無しさん
垢版 |
2020/06/01(月) 10:13:32.80ID:QCREwpDy
loopとスレッドスリープでやるのもいいけど、いい感じにデーモン立てて一定時間経ったら関数実行してくれるような仕組みのクレートってない?
0598デフォルトの名無しさん
垢版 |
2020/06/01(月) 10:31:33.62ID:o7IiynR8
借用や所有の概念って、Rustがはじめてなのかと思ったら、D言語に既にあったんだね。
0600デフォルトの名無しさん
垢版 |
2020/06/01(月) 11:12:31.20ID:o7IiynR8
Rustのヒープは必ず参照カウンタが入ってしまうので、C/C++言語に比べれば遅くなるね。
0601デフォルトの名無しさん
垢版 |
2020/06/01(月) 11:19:51.79ID:dfhSq8hG
>>600
Rc以外は参照カウンタ入らないよ。
解放タイミングはコンパイル時に決定するんだからカウンタいらない。
0604デフォルトの名無しさん
垢版 |
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>
ということなの?
どこに書いてある??
0605デフォルトの名無しさん
垢版 |
2020/06/01(月) 11:37:31.71ID:dfhSq8hG
>>603
RcやArcのドキュメントにはreference counting pointerと書いてある。
Boxとか入ってないやつにわざわざ入ってないとは書いてないけど。
0606デフォルトの名無しさん
垢版 |
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文でしか代入できないんじゃなかった?
0609デフォルトの名無しさん
垢版 |
2020/06/01(月) 11:49:39.54ID:o7IiynR8
>>607
>a_boxは2行目では値が入ってないので、3行目が最初の代入だから変更ではなくmutはいらない。
なるほど、最初かどうかをコンパイラが追跡していたんだね。
知らなかった。
immutableな変数は、必ず let 文でしか代入できないとばかり思っていた。
最初に読んだ documentでは、例としてそう書いてあったから。
0611デフォルトの名無しさん
垢版 |
2020/06/01(月) 12:19:02.82ID:o7IiynR8
「変数のアドレスを他の変数に代入することを借用(borrowing)という」
という理解で有ってる?
0612デフォルトの名無しさん
垢版 |
2020/06/01(月) 12:37:12.92ID:QCREwpDy
ID: o7IiynR8
こいつやべーだろ。なんにも知らないくせにRustのヒープは必ず参照カウンタが入るとか嘘吹かしてんじゃねえか
蓋開けれみりゃ初心者のクレクレゴミだし、どういう自信で最初言ったんだよ
0614デフォルトの名無しさん
垢版 |
2020/06/01(月) 13:18:58.22ID:0yVOdbpz
コンパイル時に所有権のチェックをしてるってのがよくわかってなくて変なことを言ってるのかもね。
「所有権の移動」が「実行時にアドレスと一緒に所有権が渡される」みたいな認識だとしたら
参照カウンタによって実装されるという ID:o7IiynR8 みたいな言説になるのはわからんでもない。

が、 Rust は静的解析の賢さでメモリの安全性を高めるのがウリのひとつなんだからそんなわけねーだろというくらいには
想像できて欲しいよ。
0617デフォルトの名無しさん
垢版 |
2020/06/01(月) 14:10:26.06ID:0yVOdbpz
所有権回りは Rust の重要な特徴だから
どんな入門書でも書いてないはずはないんだよな。
0618デフォルトの名無しさん
垢版 |
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の統合」だ。
0620デフォルトの名無しさん
垢版 |
2020/06/01(月) 15:45:21.43ID:o7IiynR8
ちょっと変わった傾向だな:

55% of Rust users develop on Linux
24% develop on Windows
23% develop on macOS
0621デフォルトの名無しさん
垢版 |
2020/06/01(月) 15:59:56.59ID:QCREwpDy
間違った知識を他人に教えるのは説明書読む以前の問題
0622デフォルトの名無しさん
垢版 |
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
0623デフォルトの名無しさん
垢版 |
2020/06/01(月) 17:53:49.92ID:o7IiynR8
Some a = xxx; // 何か初期済みであると仮定
let b1 = Box::new(a);
let b2 = b1;
とした場合、b1が持っていた所有権はb2に移ってしまい、
b1はこれ以後使えなくなるという理解で有ってますか?
0624デフォルトの名無しさん
垢版 |
2020/06/01(月) 18:03:59.31ID:o7IiynR8
初心者なもので、正しく(?)は、
let b1 = Box<Some>::new();
let b2 = b1;
なのかも知れません。
0627デフォルトの名無しさん
垢版 |
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 のエラーメッセージはめっちゃ親切なんだから、
「この場合はどうですか」なんて質問する間があったらやってみりゃいいんだよ。
0628デフォルトの名無しさん
垢版 |
2020/06/01(月) 19:13:13.12ID:is4FQXAW
Rustのエラーメッセージがすごく親切なのは分かるんだけど、小手先で直そうとするとどんどん修正範囲が広くなっていって最終的に「設計が悪い」みたいな結論になっちゃう
他言語よりコーディング時に考慮すべき点が多いというか違うというか…慣れればそういうことも無くなるのかね
0629デフォルトの名無しさん
垢版 |
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++よりプログラムがしにくくなるだろう。
0630デフォルトの名無しさん
垢版 |
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()関数を作ってしまうことで対応できるかも知れない。
0634デフォルトの名無しさん
垢版 |
2020/06/01(月) 23:37:56.02ID:QCREwpDy
もうこのスレで公式すら読んでないような初心者質問するやつ無視でよくね。文章から見て同一人物っぽいし
それとそのテンプレ追加も次立てる人お願い >>999
0636デフォルトの名無しさん
垢版 |
2020/06/02(火) 10:57:29.35ID:UmuMxSnR
diesel辛いっていう人多いけど、乗り換えるならどんなクレートになんだろうね
0640デフォルトの名無しさん
垢版 |
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.
0641デフォルトの名無しさん
垢版 |
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にはないことが
残念だと書かれていた。
0642デフォルトの名無しさん
垢版 |
2020/06/03(水) 02:45:19.00ID:TdRUmxlv
そのサイトに寄れば、Rustで難しいのは、借用や所有の概念ではなく、
lifetimeなのだそうだ。
個人的にも、構造体のlifetimeについて説明不足を感じた。
構造体の変数のスコープと構造体のメタ部分で記述するライフタイムの
関係性がbookなどでは書かれて無いように思えた。
分からんけど。
0643デフォルトの名無しさん
垢版 |
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.
0645デフォルトの名無しさん
垢版 |
2020/06/04(木) 12:10:41.88ID:4kMLpsX6
>>636
sqlxじゃないか
0646デフォルトの名無しさん
垢版 |
2020/06/04(木) 13:20:58.04ID:YCN7KCgu
難しいのはネストした場合のオブジェクトに対するイミュータブルかどうかとライフタイムだろう。
0647デフォルトの名無しさん
垢版 |
2020/06/04(木) 14:06:07.27ID:hCECm/yf
ライフタイムはコンパイラが親切丁寧に指摘してくれるから難しくは無いだろ
依存関係とか指摘出来ない系のエラーで詰まる事のが多い
0648デフォルトの名無しさん
垢版 |
2020/06/04(木) 19:40:21.91ID:pT22FhoL
>>647
コンパイラに指摘されれば問題ないかというと総でも無い。
プログラミングはコンパイルする前に予想可能で無いと困る。
0650デフォルトの名無しさん
垢版 |
2020/06/04(木) 20:37:04.46ID:ZbgQHKA+
>>648
難しくないってのは「学習は」難しくないって話じゃね?
いずれは自分でわかるようになるというのは当然の前提で、
まあわかるようになっても間違えることはあるのでそれを指摘してくれるのもありがたい。
0651デフォルトの名無しさん
垢版 |
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も同じように難しくて同じようなことは起こると考えている。
0652デフォルトの名無しさん
垢版 |
2020/06/04(木) 22:49:18.31ID:VyuaeUph
そのレベルで理解できてない人がC++使うのはどういうメリットがあるのだろうか
0653デフォルトの名無しさん
垢版 |
2020/06/04(木) 22:52:33.61ID:x+eVDE0s
実はC++は、forwardやmove, templateなどの詳細を理解できてなくても高級言語的な部分だけを使ってプログラムすることは出来る。
それはRustでも同じ。
0654デフォルトの名無しさん
垢版 |
2020/06/04(木) 23:01:33.43ID:iTcUmNL8
C++は仕様が難しいというより
仕様ではないけど当然知ってるべきイディオムが
たくさんあってきつい、という感じがするな。
0655デフォルトの名無しさん
垢版 |
2020/06/05(金) 01:02:20.04ID:D80WdA6t
将棋しか知らない人が囲碁というゲームを見ると
何やってるかわからないしなんだかむずかしそうと言う
しかし実は囲碁はルールそのものはおそろしくシンプルなのだ
ところがルールだけ知っていても、囲碁は打てない
(打てるけど次に何していいかわからなくなる)
なぜなら囲碁はルールとは別に「こういう場面はこういう風に
打ち回す」というイデォムが大量にあってそれを知る必要があるからだ
C++はそれに似ている
0656デフォルトの名無しさん
垢版 |
2020/06/05(金) 01:41:15.67ID:27EcDywu
そもそもRustの仕様って難しいか?
いろんな言語から取り込んだ概念があって
C一筋とかRuby一筋みたいな人には学ぶべきことが多いとは思うけど、
特に複雑な仕様って思い当たらないんだけどな。
JSの型変換の仕様とかの方がよっぽど複雑だしワケわからんと思う。
0657デフォルトの名無しさん
垢版 |
2020/06/05(金) 09:30:38.65ID:9qGH+5zI
>>651
C が仕様や例で理解できるってどんな超人だよ。
コンパイルエラーにも実行時エラーにもならない未定義だの処理系定義だのが山もりだろうが。
初心者の書くコードで完全に仕様に沿ったコードなんて見たことないぞ。
0658デフォルトの名無しさん
垢版 |
2020/06/05(金) 09:38:30.26ID:9qGH+5zI
Haskell の入門書を一通りは読んでたから Rust の型システムは似たようなものとして理解できたなぁ。
ライフタイムもプログラムの字面に書きこそしないでも C/C++ では意識せざるを得ないし、
複雑になるとわけわからんってときは C/C++ で書いてもわけわからんようになるやつ。
0659デフォルトの名無しさん
垢版 |
2020/06/05(金) 12:01:32.43ID:lHXK6is7
きっとそういう感じでべた褒めする人が多いから、Rubyみたいに一回大人気言語になった後、急速に衰退する気がする。
Rubyも最初は良いと思われていた。
0660デフォルトの名無しさん
垢版 |
2020/06/05(金) 12:13:12.11ID:lHXK6is7
>>657
Cの仕様はシンプルで、
ポインタと明示的な型宣言と文字列比較をstrcmp()で行うという以外、
基本的な枠組みは既存の言語と変わりはなかったので理解は難しくなかった。
0661デフォルトの名無しさん
垢版 |
2020/06/05(金) 12:14:22.73ID:9qGH+5zI
Ruby は今でも十分に使われているよ。 (俺は使ってないけど。)
適切ではないところまで広がった分がそぎ落とされてちょうどいい感じに落ち着いたってだけ。
プログラミング言語の良さはスカラ値で測定できるようなものではなくて、用途による。
利用事例が減ったからといってその勢いで衰退して消えるっていうような話ではない。

Rust はまだ実際のプロダクトでどう使うのが適切なのか見極め切れていないから過剰に広まっている
というのはあると思うが、少なくとも C/C++ で問題だった部分を解決したという側面はある。
そんでそのかわりに出てきた問題ももちろんあるので両方を天秤にかけて判断する材料を集めているとこって感じ。
0663デフォルトの名無しさん
垢版 |
2020/06/05(金) 12:32:15.42ID:lHXK6is7
Google Trends によれば、検索数の増加曲線はほぼ kotlinと同じ位。
ただし、kotlinは、2017/05に急激に上がってRustと重なりあった曲線になったのに対し、Rustは、2014/01に急激に上がった後、徐々に増えている感じ。
Rustはこの1年くらいでわずかに増加速度がKotlinより上がったが、それでもKotlinの曲線とほぼ重なった状態からは脱してはいない。
0664デフォルトの名無しさん
垢版 |
2020/06/05(金) 12:34:07.49ID:lHXK6is7
>>662
匿名性掲示板では何でも言えてしまうが、実績を見れば俺がちゃんとCやC++を使いこなしていることは分かる。
ただし、C++は一度学んでも仕様が大幅に変更されるので、細かいところを理解するのは時間が掛かるようになってきている。
Cはそんなことはなかったが。
0667デフォルトの名無しさん
垢版 |
2020/06/05(金) 13:32:05.31ID:9qGH+5zI
>>664
仮に C や C++ を使いこなせているとして、
使いこなせている言語よりも使いこなせてない言語の方が難しいに決まってるじゃないの。
あなたはそうなんですねってだけ。
0668デフォルトの名無しさん
垢版 |
2020/06/05(金) 13:35:12.28ID:9qGH+5zI
>>666
符号付きなのがなんでってこと?
month や day はマイナスになる意味はないけど、
年はマイナス (紀元前) を扱いたいこともあるんじゃね。
知らんけど。
0671デフォルトの名無しさん
垢版 |
2020/06/05(金) 14:17:19.64ID:lHXK6is7
>>670
有る意味では僅かな修正であっても、基礎的な部分における修正は多大な影響を及ぼすことがある。
moveを出来るようにするために追加されたもろもろの事や、=を書かないタイプの{}
による初期化はそれに該当する。
なんでも無いようでいて、可読性を下げたり危険をもたらすことがある。
0674デフォルトの名無しさん
垢版 |
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
0676デフォルトの名無しさん
垢版 |
2020/06/05(金) 15:11:02.16ID:lHXK6is7
>>675
それは、使う側にはシンプルそうに見えるCも実は細かく見るとシンプルではないということであって、使う側目線で既に複雑なものはそれ以前の問題他。
0677デフォルトの名無しさん
垢版 |
2020/06/05(金) 15:43:45.14ID:9qGH+5zI
依存先より寿命が長くなってはいけないなんていうのは C でも当たり前のことだろ。
Rust のライフタイムはライフタイムを簡単に「表現 (したものをチェック)」する言語機能であって、
C でプログラマがやってる (はずの) ライフタイムの管理より複雑ということはない。

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

Rust のライフタイムの管理は制約が厳しいとか面倒くさいとかいうなら話はわかるが、
複雑だとか学習難易度が高いというのは納得しかねる。
0678デフォルトの名無しさん
垢版 |
2020/06/05(金) 15:54:02.73ID:lHXK6is7
>>677
>Rust のライフタイムの管理は制約が厳しいとか面倒くさいとかいうなら話はわかるが、
>複雑だとか学習難易度が高いというのは納得しかねる。
一つあるとすれば、難しさは、ちゃんと本も読んでいるか、ネットに書かれている情報だけに頼っているかの違いに起因している可能性。
0679デフォルトの名無しさん
垢版 |
2020/06/05(金) 21:26:05.32ID:Py5zog1r
これにて、このスレがRust関連の本の作者の巣窟であることが証明されました。
0680デフォルトの名無しさん
垢版 |
2020/06/05(金) 21:32:24.36ID:cXh0Dvtv
だいぶ前からじつは言語系のスレはほとんどソレなんだな
宣伝してるやつは気付かれれないと思ってるだろうけど
0681デフォルトの名無しさん
垢版 |
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%)、
0682デフォルトの名無しさん
垢版 |
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 うるさく注文を求める.)
・切符をプレミア付きで売る, ダフ屋をやる.
・うるさく勧める.
・ほめちぎる.
0683デフォルトの名無しさん
垢版 |
2020/06/05(金) 22:04:18.63ID:Py5zog1r
誤:安全性と正確性のために言語が非常にうるさく押し付けてくる特長
誤:安全性と正確性のために言語が非常にうるさく押し付けてくる機構(機能)
0685デフォルトの名無しさん
垢版 |
2020/06/06(土) 04:00:23.67ID:Vvt5YBJp
この言語廃れてきそうな気がした。
だってみんなが触るって未来が想像できないもん
0687デフォルトの名無しさん
垢版 |
2020/06/06(土) 05:29:47.06ID:i8tpraSw
Rustを使ったことはないけどC++は既存の資源で堅実に作るのに対して
Rustは一人のスーパープログラマが複雑高度なライブラリやモジュールを一点突破で書くのに使われそうなイメージ
0688デフォルトの名無しさん
垢版 |
2020/06/06(土) 09:51:25.89ID:9F/1KVDa
まあScalaと同じ道を辿るだろうね
あっちはビッグウェア系でそれなりに採用されてたから被害が甚大だったけど、
Rustに関してはそういうビジネス的な得意分野は今のところ無いのが救いか
0689デフォルトの名無しさん
垢版 |
2020/06/06(土) 15:58:34.19ID:HBMrgMqa
>>687
ところがスーパープログラマは、C++でもメモリー関連のバグで詰んで挫折したりすることはないんだな、これが。
0690デフォルトの名無しさん
垢版 |
2020/06/06(土) 17:06:05.01ID:58RXXUUu
>>687
Rust の偉大さのひとつには crates.io の存在がある。
資源の利用という意味じゃ Rust はかなり積極的だぞ。
0691デフォルトの名無しさん
垢版 |
2020/06/06(土) 17:17:15.77ID:P/b6XOwm
C++は標準のライブラリリポジトリと標準のビルドツールがあればなぁ、と思う。
野良のは乱立してるけど、結局ほしいライブラリはなかったりするし…。
0693デフォルトの名無しさん
垢版 |
2020/06/06(土) 18:11:03.05ID:58RXXUUu
>>691
各環境のパッケージマネージャに乗っかってることが多いからある意味では一等の地位ともいえる。
メジャーなものは apt-get とか pacman とかで一発で入るだろ。
0694デフォルトの名無しさん
垢版 |
2020/06/06(土) 18:38:18.22ID:Vvt5YBJp
>>690
crates.ioがダメダメだから代替のサイトあるのってご存知でない?
0697デフォルトの名無しさん
垢版 |
2020/06/06(土) 19:37:13.44ID:P/b6XOwm
>>693
結局それってディストリビューション依存だからなぁ。
バージョンだって固定できないし、OSS拾ってきてコンパイルが通るようにするだけで試行錯誤が必要。

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

環境構築が、各言語でバラバラになるのは面倒なので、
anyenv・asdf などを使えば?
0701デフォルトの名無しさん
垢版 |
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
}
0702デフォルトの名無しさん
垢版 |
2020/06/07(日) 00:19:04.85ID:uvQLWD0s
ループ {
// 1. あなたはついに lifetime を理解した。
// 2. あなたはコンパイラに lifetimeやborrow の苦情を複数個言われる。
// 3. 5行未満のコードを直すのに何時間もとられることにあなたは馬鹿馬鹿しさを感じる。
}
0704デフォルトの名無しさん
垢版 |
2020/06/07(日) 17:57:12.72ID:WIpxuhAg
Rsutって、早い話が、CやC++に、NULLバグ等々が発生しないようにするための補助機能がついた言語ってこと?
0705デフォルトの名無しさん
垢版 |
2020/06/07(日) 18:44:36.11ID:r/6oC92T
そうだね〜、で、俺様はNullチェックは忘れないしダングリングポインタなんて組み込まないのでC/C++で良いや
という俺様スパハカがゴミグラムを生み出してきたのでRustは必須
0707デフォルトの名無しさん
垢版 |
2020/06/07(日) 19:46:37.12ID:WIpxuhAg
>>706
いや、言語誕生の思想を考えただけです。
言語誕生の思想をきちんと抑えないと、メリットとデメリットを正答に評価出来ないから
0709デフォルトの名無しさん
垢版 |
2020/06/07(日) 22:51:27.97ID:fhJ4vSsJ
Hindley-Milner 型推論を元にしているから考え方は ML 系統からの影響は大きいと思う。
0710デフォルトの名無しさん
垢版 |
2020/06/08(月) 02:06:14.90ID:jeqh3aBJ
C++の地獄をML(とアフィン型)の知見で楽にしようとした言語

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

言語仕様での理屈がどうあれ最終的には使い方次第。
0718デフォルトの名無しさん
垢版 |
2020/06/08(月) 13:53:57.25ID:LDYBA2kC
RustではpChildがHeapにとられている時、次のようなループすら書けない。
CPerson *pChild=pPerson->pChild;
while(pChild != NULL) {
(pChildに対する処理);
pChild=pChild->pNext;
}
0719デフォルトの名無しさん
垢版 |
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 に対する処理
}
}
0720デフォルトの名無しさん
垢版 |
2020/06/08(月) 14:39:32.30ID:LDYBA2kC
>>719
Heap領域にある構造体の中に、さらにHeap領域にあるデータへの
参照を持つためにBox型のメンバが有る場合、後者のBoxは、unique_ptrなので
ローカル変数にmoveすることができないためコンパイルエラーになる。
なので、参照カウント方式のRcを使う必要がある。
0721デフォルトの名無しさん
垢版 |
2020/06/08(月) 14:44:31.30ID:LDYBA2kC
>>719 の場合だと personがスタック領域にあるが、もしそれがHeap領域に
あったとすると、
let childs = person.childs;
とするとエラーになるはずだ。
0724デフォルトの名無しさん
垢版 |
2020/06/08(月) 14:56:15.14ID:LDYBA2kC
そもそも、
struct Person {
 pub child: Box<[Person]>
}
がおかしくて、正しくは、
struct Person {
 pub child: Box<Person>
 pub next: Box<Person>
}
だ。
0726デフォルトの名無しさん
垢版 |
2020/06/08(月) 14:58:43.87ID:KAmnJXdU
後付けやめろよ。
C++ のどういうコードを Rust でどう書けて欲しい (そして実際にはどういうエラーになる) のかちゃんと書け。



いや、書くな。 (どうせ見当違いなので。)
0727デフォルトの名無しさん
垢版 |
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に確保した場合はエラーにならない。
実験済み。
0728デフォルトの名無しさん
垢版 |
2020/06/08(月) 15:04:31.00ID:LDYBA2kC
>>726
海外のサイトでも、RustはC/C++から単純移行ができ無い事が問題とされている。
FortranからCへは単純移行が出来たからCが普及したと書いてあった。
0730デフォルトの名無しさん
垢版 |
2020/06/08(月) 15:47:14.20ID:KAmnJXdU
>>727
型・寿命・所有権の条件が同じならヒープかスタックかというのは関係ない。
お前が結果的に違う条件で書いるだけ。

>>728
知らんがな。
同じように書けるんなら新しい言語を導入する意味ないだろ。
制約が厳しい替わりに問題点が検出されやすいのが Rust の利点なんだから、
その利点が要らんなら別に Rust を使わんでいいよ。
0731デフォルトの名無しさん
垢版 |
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>の場合にだけエラーになる。
0732デフォルトの名無しさん
垢版 |
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();

とかすることでもコンパイルは通る。
0738デフォルトの名無しさん
垢版 |
2020/06/08(月) 18:20:45.97ID:KAmnJXdU
>>734
ワイも初心者ではあるんよ。
The book (第二版の日本語訳の無料で読めるやつ) を読み終わって、試しに 500 行くらいのコードを書いてみたって程度。
本を読んでいる間はコードを書いてない。
手を動かすと理解しやすいという人も多いけど、
感覚でやってしまいがちで書いてある理屈をしっかり把握するのが疎かになる気がするから。

で、 The book を読めばこの程度には理解できるので理解できてないやつは単にアホという証明でもあるし、
逆に返答に詰るようなら俺がまだ入門級のことが理解できてない (どこが理解できていないか) ことがわかるので
練習の題材としてちょうどいいわという気持ちで相手してた。
0739デフォルトの名無しさん
垢版 |
2020/06/08(月) 18:37:00.38ID:LDYBA2kC
>>738
では、>>732
>let ref x = vec[0].x;
の borrow が合法かどうか、どうやってコンパイラが静的に解析しているか
アルゴリズムを説明してみてください。
0740デフォルトの名無しさん
垢版 |
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); と書くのと理屈は同じ。
0741デフォルトの名無しさん
垢版 |
2020/06/08(月) 21:34:44.64ID:RC1s4U+D
公式で丁寧にしかも無料で公開されてる本もろくに読めないガイジたちがわらわらするスレになっちまったな
ちょっと名が知れ渡っただけでこんなことになんだから、一般的になったらとんでもないな
0742デフォルトの名無しさん
垢版 |
2020/06/08(月) 22:57:09.22ID:42GeKV2i
rust+wasmちょっとやってみたけど、単純な処理に記述だけが無駄に複雑になりすぎる
組み込みとかシステム系で使われそうだけど、一般的とか言う広く色々な使われ方はしないだろコレ
0743デフォルトの名無しさん
垢版 |
2020/06/08(月) 23:32:06.17ID:RC1s4U+D
JSみたいに直接DOM触れて、直接実行できるなら普及するけど、現状のめんどくささならなぁ・・・
0744デフォルトの名無しさん
垢版 |
2020/06/09(火) 00:44:22.52ID:SETbyCsO
>>740
それは分かっている。
iとjがループ内で変化したような場合、
vec[i].x
からmutableで借用した場合、
vec[j].x
からimmutableで借用できるかどうかの判定をコンパイラが一般的に行うのが難しいんだよ。
だからそのアルゴリズムを理解しているのかと聞いている。
0745デフォルトの名無しさん
垢版 |
2020/06/09(火) 00:52:40.12ID:SETbyCsO
>>744
似た例で言えば、
dst[i]をmutableで借用した場合、src[i]をimmutableで借用しようとしたときに、
srcとdstが同じアドレスに被って無いかの判定が静的には物凄く難しいと
されているので、エラーになってしまうかも知れないというようなことを心配
しているんだよ。
0746デフォルトの名無しさん
垢版 |
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では借用できないというルールを
この場合にはコンパイラが静的には判断できなくなってコンパイル・エラーになって
しまう可能性を心配している。

つまり、コンパイルの借用チェッカは、予めよくあるパターンに対して特別な
処理を実装している場合には通るが、一般的には判断できるわけ無いので通らない
のではないかと考えられるんだよ。
0748デフォルトの名無しさん
垢版 |
2020/06/09(火) 08:13:44.15ID:H8Y2HqIE
let x = 5;
println!("{}", if 0 < x < 10 { "in" } else { "out" });
この比較方法ができない理由ってなんかある?例えば最適化に響く?とか
可読性も労力もこれ出来たほうがいいと思うんだけど
0749デフォルトの名無しさん
垢版 |
2020/06/09(火) 10:15:42.01ID:DLyUUrRW
最初の比較でBoolになってんのを整数と比較してるからじぇね?
特に可読性が上がるとも思わないし、むしろ老眼で見逃す勢が出るから&&挟んだ方が見やすいな
0751デフォルトの名無しさん
垢版 |
2020/06/09(火) 10:40:14.84ID:0Ox9n+fW
a < x > b
これを見て何がしたいのか直感的に理解できる人間は多数派ではないだろう
結局 lb < x < ub のパターンしか使わないんなら range で十分
0752デフォルトの名無しさん
垢版 |
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 を使わない限り。)
0754デフォルトの名無しさん
垢版 |
2020/06/09(火) 14:37:23.22ID:H8Y2HqIE
しかもそいつら繋がってんのな、Rust大嫌いなのに隠してここでやりとりしてんのな
とりあえず二人とも気持ち悪いからミュート、ブロックした
https://qiita.com/Yutaka_Aoki
https://qiita.com/SFITB
0758デフォルトの名無しさん
垢版 |
2020/06/09(火) 19:23:53.82ID:9Q2vOhVs
dropが飴玉みたいって批判?がちょっと面白かった。
その発想はなかった的な。
0759デフォルトの名無しさん
垢版 |
2020/06/09(火) 20:40:17.08ID:hxMyXunA
drop out とか drop off とかのニュアンスでしょ?
スコープから消えろという意味での drop であって、結果的に解体もするというのは実装側の都合だよな。
その型を利用する側の都合からするとただ消えろって話なので、drop という語をあてるのは Rust 的にはそこそこ妥当な選択だと思える。
やることが同じだから同じというのは抽象化を軽視する暴論だ。
0760デフォルトの名無しさん
垢版 |
2020/06/09(火) 23:30:17.61ID:dBtT67N+
linuxカーネルでキャッシュをドロップする、みたいなのが用法としては近いのかな。
0764デフォルトの名無しさん
垢版 |
2020/06/10(水) 09:37:48.27ID:2ezYpnf+
実際にプログラミングするのは英語話者ばかりではないので
既に浸透した用語を使って欲しいというのはわからんでもないんだが、
似て非なるものに同じ名前を与えると調べにくかったりすることもあるしなぁ。

他の言語からの「移行」という視線でばかり見ていると良くなった部分も移行コストに見えてしまうんだなというのはわかった。
0765デフォルトの名無しさん
垢版 |
2020/06/10(水) 10:10:31.54ID:XLjKTHkb
そもそもdropについて言えば既存の言語でも
free, delete, dispose, finalizeとバラバラなので
浸透もクソもない。
0766デフォルトの名無しさん
垢版 |
2020/06/10(水) 10:24:08.29ID:2ezYpnf+
それぞれの用語の大まかな使い分けはあるけども、
じゃあ drop がそのどれかに当てはまるかといえば当てはまらないし。
0767デフォルトの名無しさん
垢版 |
2020/06/10(水) 12:27:01.09ID:wKk8b9p0
qiitaの記事数は、Rustに対し、Goが8倍、Kotlinが1.5倍、C++が50倍、Javaが16倍。
唯一、Haskelに対しては、Rustは、100倍以上の記事数がある。
0769デフォルトの名無しさん
垢版 |
2020/06/10(水) 18:22:57.35ID:eINpUyJE
Haskelは触ったことのある人数で言えばRustよりずっと多いだろうけど、マサカリが怖くて記事書きづらいんだろう
0771デフォルトの名無しさん
垢版 |
2020/06/11(木) 05:09:15.88ID:LlBqG++A
宣言型マクロでRustの処理書けない理由ってある?
今のパターンマッチ風構文で作ったから処理文入れるところがない的な?
0773デフォルトの名無しさん
垢版 |
2020/06/11(木) 15:19:33.86ID:EKtCO5aX
ガチ関数型と違って難しいポイントはただ複雑なだけなので、頭悪くても慣れさえすればマウンティングしやすいのが人気の理由だと思ってる
0774デフォルトの名無しさん
垢版 |
2020/06/11(木) 17:27:55.76ID:Th6rh/3U
「一番愛する言語」と聞かれたら、C++もC#もJSもPythonも全面的に好きで
使ってるわけではないから、消去法でRustを選ぶしかない。
そもそも愛すべき言語なんて一般人にはあるわけ無いし。
Rustだったら「愛すべき」と公表しても馬鹿にされないで済むみたいな。
他のどの言語を選んでも、白い目で見られそうだから。
0776デフォルトの名無しさん
垢版 |
2020/06/11(木) 17:43:19.49ID:VpmD2Oc5
>>774
SOのサーベイのことをいってるなら、あれは別に「愛する言語は何ですか?」というアンケートではないので「愛する」と日本語で考えてもあまり意味ないぞ。

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

なので5%の人しか使ってないというのとは別に矛盾しないし、
Rustを使ってない人の意見はそもそも反映されない。
0779デフォルトの名無しさん
垢版 |
2020/06/11(木) 23:14:58.90ID:lDcKCiP3
このあたり元のアンケートに答えた人や
SOのレポートを隅々まで読んだ人なら分かるんだけど
ニュースサイトの伝言ゲームで「最も人気のある言語」とかになってしまうと
ものすごく語弊があるんだよな。
0780デフォルトの名無しさん
垢版 |
2020/06/11(木) 23:41:02.95ID:Th6rh/3U
>>778
あれ? 
それだと、全体の母集団の中でRustを使っている人が5%ということになってしまい、
「Rustが好きです」、と答えた人でも 95%が使ってないということとは違ってくるよ。
0781デフォルトの名無しさん
垢版 |
2020/06/11(木) 23:47:20.09ID:lDcKCiP3
>>780
使ってる人が5%というのは合ってて、
その5%のうちの86%が今後も使いたいってこと。
だからRustを好きな人が多いんじゃなくて、好きな人の割合が高いというだけ。
実際に好きな人の絶対数でいけば、ユーザーの多いPythonとかが圧勝だと思う。
0784587
垢版 |
2020/06/12(金) 15:38:31.69ID:Du26dNpG
>>783
unwind の段階でってことですか?
0786デフォルトの名無しさん
垢版 |
2020/06/12(金) 22:06:49.25ID:ROT3upn7
要素がMaybeUninitなので未初期化領域にアクセスすることはないだろうけど、逆に初期化済みの領域が解放されずに残るような?
0787587
垢版 |
2020/06/12(金) 22:21:06.94ID:Du26dNpG
>>786
panic したときのことなので UB でさえなければメモリが解放されないのは問題にならないと思いますが。
0789デフォルトの名無しさん
垢版 |
2020/06/13(土) 09:06:43.07ID:4a9xUc1f
>>783
Default::default() が panic起こす実装してるからUB以前にそこを直すべきだと思うけど違う?
0790デフォルトの名無しさん
垢版 |
2020/06/14(日) 08:51:59.74ID:GVwShxqI
playgroundで手続きマクロ書きたいんだけど
#![crate_type="proc-macro"]
で出来なくてCargo.tomlも触れないから変更出来ないんだけどどうやっても触れない??
0793デフォルトの名無しさん
垢版 |
2020/06/21(日) 01:44:24.45ID:KswBNjV4
こういうコードを書いててどこを直せばいいかわかんないので教えてーー

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

AddAssign の型引数のところに与えてるライフタイムがおかしいとは思うんだけど、
どう直せばいいかわかんない。
この書き方だと += の左辺以上の寿命を右辺が持ってるという意味になるの?
0794デフォルトの名無しさん
垢版 |
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())
}
}
0795793
垢版 |
2020/06/21(日) 21:05:29.71ID:KswBNjV4
デフォルトで usize を基礎に据えているんですが、 BigUint なども効率的に扱いたいので
clone はなるべく少なくしたいという意図で参照で受け取る AddAssign を前提にしたいんですよね……。
0797793
垢版 |
2020/06/21(日) 22:48:41.52ID:KswBNjV4
>>796
期待通り動きました!
for の使い方について調べたところこのへんにあるのを見つけたのですが、
どうにもはっきりとは理解できてないです。

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

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

現在Actix+teraで実装しようと考えていますがなかなかうまくいかないので・・・
0802デフォルトの名無しさん
垢版 |
2020/06/24(水) 03:07:05.31ID:tDxYjRXk
actix-webとactix-filesではだめなの
0803デフォルトの名無しさん
垢版 |
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
0808デフォルトの名無しさん
垢版 |
2020/06/24(水) 19:37:44.39ID:hh4NKeEg
>>805
あのテンプレートの書き方がDjangoに似てたので・・・(じゃあPythonでやれっていうのはなしで)


別に使わなくてもできるのならそれでいいんですが
0810デフォルトの名無しさん
垢版 |
2020/06/26(金) 04:24:36.46ID:rzSuBmAQ
この前作ったツールではrouilleを使った
CLIツールにおまけのWeb UIを付けるため

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

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

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

悪いけどホラ吹いてるようにしてみえない
0825デフォルトの名無しさん
垢版 |
2020/07/01(水) 21:21:04.78ID:V2OaFanu
ソルト
0827デフォルトの名無しさん
垢版 |
2020/07/01(水) 21:35:15.59ID:JRtBzTKp
ハッシュの生成はアルゴリズムに対して決定的なんだからハッシャーがどうのなんて馬鹿げてる
0828デフォルトの名無しさん
垢版 |
2020/07/02(木) 00:00:35.12ID:53deMRLD
Result<T,E> を要素とするイテレータを Result<Vec<T>,E> にしたくて、
よくありそうなパターンだと思うんだけどさらっと上手くやる方法ってないもんかな?
0830デフォルトの名無しさん
垢版 |
2020/07/02(木) 01:46:12.20ID:T8l/o3UF
collect::<Result<Vec<_>, _>>()
0831デフォルトの名無しさん
垢版 |
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
変わらないよ?
0832デフォルトの名無しさん
垢版 |
2020/07/02(木) 10:42:54.83ID:NJoiTLER
>>831
HashMapと同じことをしたいなら、RandomStateからbuild_hasherでhasherを得ればよい。別に画面更新しなくてもRUN押す度に変わるよ。
0833デフォルトの名無しさん
垢版 |
2020/07/02(木) 10:47:40.50ID:NJoiTLER
ちなみにDefaultHasher::newで変わらないのは、単に内部的にSipHasher13::new_with_keys(0,0)を呼んでるから。
RandomStateがその0,0をランダムに変えている。
0834デフォルトの名無しさん
垢版 |
2020/07/02(木) 12:36:00.56ID:2uT/XA4a
Hash値の計算そのものも、本当はかなり速度が求められるものなので、それを
自在に変えるというのはどうやっているのか興味が有る。
Hash値そのものの計算は、遅いわけではないが、それでも膨大なデータを処理する
場合には、その問題になることがある。
0835デフォルトの名無しさん
垢版 |
2020/07/02(木) 14:34:38.77ID:O6Sxhm4J
SipHasher13::new_with_keys(0,0)はソルト?シード?
0840デフォルトの名無しさん
垢版 |
2020/07/03(金) 01:32:48.51ID:A3vf6ary
>>839
FromIterator::from_iter呼んでる
From呼ばれるかどうかはFromIteratorの実相次第だけど
普通はIterator::Itemがそのままコレクションのデータ型になるから呼ばれないと思う
0841デフォルトの名無しさん
垢版 |
2020/07/04(土) 01:28:15.59ID:MbDjr1Zt
これがコンパイルエラーになる(sum::<i64>()としないといけない)のってなんでですか?
let s: i64 = (0i64..10).sum() + 10i64;

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

ちなみにこれなら通ります
let s: i64 = (0..10).sum();
0842デフォルトの名無しさん
垢版 |
2020/07/04(土) 07:36:29.64ID:mye4TJ7/
rangeはusizeだから
0845デフォルトの名無しさん
垢版 |
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;
}
0846デフォルトの名無しさん
垢版 |
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)から互換性を失う可能性がある。公開された型と関数のシグネチャに依存してるんで。
0848デフォルトの名無しさん
垢版 |
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)
0849デフォルトの名無しさん
垢版 |
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 の継承っぽく書くのはいかが
0850デフォルトの名無しさん
垢版 |
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と同じような機能でしっくりくる構文持ってる他言語とかないのかなぁ
0852デフォルトの名無しさん
垢版 |
2020/07/11(土) 19:10:01.60ID:F8ozXmMr
Winrtよく知らないんだけどWindows環境でGUI簡単にいじれるようになったの?
0854デフォルトの名無しさん
垢版 |
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 { "+" }の綺麗な順番とかの定石の書き方ってある?
0855デフォルトの名無しさん
垢版 |
2020/07/14(火) 16:21:46.36ID:0FZUPBc1
match delta.cmp(&0) {
std::cmp::Ordering::Equal => "",
std::cmp::Ordering::Greater => "-",
std::cmp::Ordering::Less => "+",
}
0856デフォルトの名無しさん
垢版 |
2020/07/14(火) 18:24:58.52ID:Ott4Q6kl
n == 0の時だけ記号なしにしてそれ以外は{:+}でフォーマット
(n > 0の時だけ{:+}にするのでも結果は同じ)
0857デフォルトの名無しさん
垢版 |
2020/07/14(火) 20:20:46.59ID:GDMj7Uve
>>855
>>856
ありがとう、両方いいね!
0859デフォルトの名無しさん
垢版 |
2020/07/15(水) 20:29:35.32ID:hr2ndtrb
両方有るってことはどっちにでも出来るってこった。
どちらかが良いなんてことはない。
0861デフォルトの名無しさん
垢版 |
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だけ型注釈が必要になるのも意味がわからないです
0862デフォルトの名無しさん
垢版 |
2020/07/16(木) 23:09:40.63ID:NQlI+enB
jsonをパースして、その中身に対して更に値を追加し
最後にはまたjsonでシリアライズということをやりたいのですが、
serdeだと事前に入力と出力の型を定義していないと難しいですか?

from_stringでValue型に入れて、mapのようにキー名で値を取れることは分かったのですが
そこに新たに値を追加する方法がわからないです
0863デフォルトの名無しさん
垢版 |
2020/07/16(木) 23:23:19.49ID:iYXNZZst
as_object_mut
あたりかな
0866デフォルトの名無しさん
垢版 |
2020/07/18(土) 18:30:51.49ID:XPr1Z8D3
神がついてるから大丈夫
0867デフォルトの名無しさん
垢版 |
2020/07/20(月) 13:18:08.21ID:8IyUCuKf
actix-wevからRocketに移行します
0869デフォルトの名無しさん
垢版 |
2020/07/21(火) 18:35:05.91ID:jydcaLWL
スライスから差集合を作るの際にスライスをそれぞれhashsetにしてdifference呼ぶ以外で良い書き方ありますか?
0871デフォルトの名無しさん
垢版 |
2020/07/22(水) 01:18:16.47ID:EHcGprvb
>>869
シンメトリックじゃない単なる差集合なら
片方だけsetにしてもう片方の要素でループしながらチェックするのでもいい気がする
あと状況によってはBroom filterみたいなのを使うと高速化できるかも
0872デフォルトの名無しさん
垢版 |
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!を書いてる時点でコンパイルになるんだけど回避方法ってないかな
0873デフォルトの名無しさん
垢版 |
2020/07/22(水) 13:33:41.15ID:toRz6DNg
こういう風にコンパイル時にコンパイルエラー出したいんだけど、実際はcompile_error!を書いてる時点でコンパイルになるんだけど回避方法ってないかな

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

マクロを展開する段階では変数の値を評価できないから
文字列を受け取る関数に対して特定の文字列を渡すコードがあったらコンパイルエラーってのは無理な気がする
0880デフォルトの名無しさん
垢版 |
2020/07/23(木) 01:38:31.65ID:es6swX3J
最近RustのSlackでも出てきた福野泰介ってやつ声でかいよな
こいつどのコミュニティでも何かしら主張して目障りだわ
0881デフォルトの名無しさん
垢版 |
2020/07/23(木) 01:41:56.15ID:5yzO6ql9
Ubuntu Japanese Team に言いつけて潰してもらおうぜ
0882デフォルトの名無しさん
垢版 |
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!を成功させる方法を教えてください
迷惑をかけてしまうかもしれませんがご教授お願いします
0883デフォルトの名無しさん
垢版 |
2020/07/23(木) 19:05:44.31ID:es6swX3J
福野泰介はたしかにどこでも目立つ。
自己顕示欲もあそこまでいったら面白い、反面教師として役立つ
0884デフォルトの名無しさん
垢版 |
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
0885デフォルトの名無しさん
垢版 |
2020/07/24(金) 00:48:59.83ID:j+hLU6yH
>>884
ありがとうございます動きました!
非常に長文だった自覚はあるんですが分かりやすくすっきりした回答ありがとうございますm(_ _)m
0886デフォルトの名無しさん
垢版 |
2020/07/24(金) 10:22:52.41ID:c87Ipt6p
同じサーバー内でポート別にクライアント用サーバー(Nuxt)とAPI用サーバー(Rust)立ち上げるのってどう思う?
クライアント用サーバーは初回しか性能響かないからあれだけど、Rustの方が断然速いし、SPAだからルートの設定も全然しなくていいし、Rustの方でフロントページも返した方がいいんじゃないかと思ってるんだけども
要はRustを実行すればポート別に2つサーバーが立ち上がるようにするってこと
0888デフォルトの名無しさん
垢版 |
2020/07/26(日) 03:19:09.22ID:XCGG5OQ8
diesel使いづらくない?
0889デフォルトの名無しさん
垢版 |
2020/07/26(日) 18:57:03.68ID:uWZribv0
rustcの-C llvm-args=が取り得るオプションの説明ってどこかに書いてある?
clangのttps://clang.llvm.org/docs/ClangCommandLineReference.html#x86
あたりがそれっぽいけど説明が全くないのでデフォルト値も効果もよく判らない
0891デフォルトの名無しさん
垢版 |
2020/07/26(日) 23:02:23.88ID:XCGG5OQ8
あるモジュールクラスを別のモジュールで使いたい場合ってどう宣言するのが正しいの?

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

main.rsでそれぞれのモジュールをmod宣言
0900デフォルトの名無しさん
垢版 |
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
0902デフォルトの名無しさん
垢版 |
2020/07/29(水) 21:31:44.28ID:4K5iZ0U7
>>900
str::from_utf8でエラーになるのは
0~127までのUTF-8互換のASCII以外の文字が含まれてるからでは?

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

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

LIBCLANG_PATHタイポして時間潰してしまった。
0905デフォルトの名無しさん
垢版 |
2020/08/01(土) 14:02:57.08ID:cK8sGWsa
やっぱactixよりrocketだな
0908デフォルトの名無しさん
垢版 |
2020/08/01(土) 15:19:22.53ID:cK8sGWsa
>>906
ドキュメントがしっかりしてそう
0910デフォルトの名無しさん
垢版 |
2020/08/01(土) 22:13:51.53ID:cK8sGWsa
rocketってmultipartサポートしてないのか
0911小石茶輝
垢版 |
2020/08/01(土) 23:31:58.80ID:hdo7vbOv
unsafe という機能があるのは unsafe が必要だからです。
設計方針に対して必要以上に unsafe があるのはダメですが、
少なければ少ないほど良いというわけでもありません。

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

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

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

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

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

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

>>926
事実上の標準っていうかc++のboostみたいなもんだけど足並み揃ってるかは別。
0929デフォルトの名無しさん
垢版 |
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じゃないから出来ない
0931デフォルトの名無しさん
垢版 |
2020/08/11(火) 17:18:59.34ID:vv5Ejmf9
>>930
i32 か u32を受け取るトレイト境界ってつくれない?
あとAdd<u32> for u64とかの実装していない理由とかって何?
0933デフォルトの名無しさん
垢版 |
2020/08/13(木) 18:54:36.47ID:ilszh1HB
ゲーム開発言語はrustに移行されるかな?
0935デフォルトの名無しさん
垢版 |
2020/08/14(金) 22:24:07.75ID:O4QC6Gpt
>>933
個人の開発に使ってるけどバインディングだらけになる。
ミドルウェア1から作る新規開発くらいじゃないとrustの恩恵がフルに受けられないと思う。
あと、コンパイル遅いのが辛い。
0936デフォルトの名無しさん
垢版 |
2020/08/15(土) 03:05:14.85ID:py5/TuN/
ラズパイとかでコンパイルすると糞遅いのなんとかならんかな
0937デフォルトの名無しさん
垢版 |
2020/08/15(土) 06:26:45.05ID:KV0ftL1X
禁断のCPU換装とかないの?
DOS/Vパワーリポートとか買ってみたら。
0940デフォルトの名無しさん
垢版 |
2020/08/15(土) 23:19:51.01ID:aMnBEbVz
rustじゃないけど適当な設定で大きいライブラリビルドしたら過熱でラズパイ落ちた事あるわ
0942デフォルトの名無しさん
垢版 |
2020/08/18(火) 04:18:41.28ID:Hi0tASG0
rustって日本で人気という勝手なイメージがあるけど世界的にはどうなんだろ
0944デフォルトの名無しさん
垢版 |
2020/08/18(火) 15:54:29.74ID:GTs4Jp23
>>941
Goの方がマスコットがかわいいからしゃーない。
0947デフォルトの名無しさん
垢版 |
2020/08/18(火) 18:17:07.57ID:xqTakpBf
>>941
調査によって、まちまちだな。
StackOverflowでは、Rustは好きな言語ランキングでは、五年連続Topらしいが、
「人気」は低い。
今のところ「好き」だが「人気」は無いのがRust。
恐らくこの場合、「人気」= 「Popular」のことで、英語の Poluarは、
「人気」と言う意味のほかに、「普及している」とか「一般的」、というような
意味もあるのでややこしい:
https://news.mynavi.jp/article/20190412-807191/
0948デフォルトの名無しさん
垢版 |
2020/08/18(火) 18:30:54.90ID:xqTakpBf
「好き」ならば「学びたい」のだろう、と思いきや、そうでもないということか。
「最も好きな言語は何ですか?」
という問に対して、相手に馬鹿にされないためには、Rustが丁度よい言語
である気はする。
でも、結構、実際に使用したいと思っているどうかは別。
俺もそんな質問されたら、答えに窮して Rust と答えてしまうかも知れんが、
使う気はほぼ無い。
0949デフォルトの名無しさん
垢版 |
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があってまだ熟してない部分があり厳しい立ち位置にいるという認識だ
0950◆QZaw55cn4c
垢版 |
2020/08/18(火) 22:03:32.42ID:67oHHRca
>>949
>計算高速化のcalleeとしては安全性があまり旨味のない要素だからC++の選択
C++ が呼ばれ側になるのですか?
0951デフォルトの名無しさん
垢版 |
2020/08/18(火) 22:21:20.07ID:y+NJXGZa
>>949
その中だとパフォーマンス的にはGoでいいけど言語仕様が簡素すぎて辛い、みたいな層の受け皿としてRustが使われてるケースはありそうかな。
ScalaがいいけどJVMは厳しい、みたいなのとかも。
まぁニッチなのは間違いない。
0953デフォルトの名無しさん
垢版 |
2020/08/18(火) 23:14:15.49ID:eVuhfWpC
>>950
TensorflowとかPytorchのバックはC++だよね
これらは当然CUDAとの兼ね合いであるのは間違いないけど、CUDA側がRustではなくC++を選択してる意図として安全性の旨味のなさは間違ってないと思う
C++の仕様が先立つ言語であることや人口の多さ、既存資産との兼ね合いの比重のが大きいだろうけどね
0954デフォルトの名無しさん
垢版 |
2020/08/18(火) 23:33:09.98ID:bX3QY+Cn
>>953
そりゃCUDA1.0の頃(もう10年以上前だぞ)にRustなんて影も形もなかったんだから選択されないのは当然だろう。
その視点で見るならここ1-2年で開発開始されるプロジェクトでどの程度採用されるか、では?
今だとブロックチェーン界隈とかかね。
0956デフォルトの名無しさん
垢版 |
2020/08/19(水) 03:59:31.08ID:HXpA5baw
"abc".split("").collect::<Vec<_>>()は["", "a", "b", "c", ""]になるんだけど、うまく空白なしでスプリットでできない?
0959デフォルトの名無しさん
垢版 |
2020/08/19(水) 10:35:25.48ID:HXpA5baw
>>957
charだとparse()がなくて変換めんどくさい
あと容量無駄
0961デフォルトの名無しさん
垢版 |
2020/08/19(水) 10:54:53.71ID:HXpA5baw
>>960
Splitは
type Item = &'a str
だから無駄に生成しないって意味ね
0962デフォルトの名無しさん
垢版 |
2020/08/19(水) 11:03:27.99ID:6EiBw6oz
>>961
でも最後にVecに格納するポインタは一文字ごとに8バイト取られるんだから、charの方が小さくない?
0964デフォルトの名無しさん
垢版 |
2020/08/19(水) 13:05:48.82ID:P3FDipJp
確かに16バイトだね。parseにしてもto_digitでいいし、Vec<&str>のメリットはなさそう。
0965デフォルトの名無しさん
垢版 |
2020/08/19(水) 14:18:38.67ID:Rgg+SJNu
Rustのコア開発者達がMozillaのリストラで大量解雇されたようだが大丈夫なのか?
0966デフォルトの名無しさん
垢版 |
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の再編計画によりプロジェクトが大きな影響を受けることはないとしている。
0967デフォルトの名無しさん
垢版 |
2020/08/19(水) 15:18:50.67ID:tsnEmyts
解雇された人のtwitterとか見てると
「弊社でRust書きませんか?」なオファーが殺到って感じだし
個人の生活としてはそんなに問題ないんじゃないかな。
Rustの開発に割ける時間が増えるのか減るのかは知らんが。
0968デフォルトの名無しさん
垢版 |
2020/08/19(水) 17:11:33.75ID:Zv91SX/x
Rust財団作って開発と管理を移管するのかね

その後プラチナスポンサーにMicrosoftがいても驚きはないな
0970デフォルトの名無しさん
垢版 |
2020/08/19(水) 21:07:57.58ID:g0VuJGRT
>>966の記事でも触れてるけどrustはコントリビュータが多いからmozillaの再編は影響すくない。
mozillaの中のままでmozillaの計画の影響受けたら面倒くさいからこの際独立しようって考えだろうね。

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

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

>>991
早くuchar.hを自分で用意する作業に戻るんだ!
0993デフォルトの名無しさん
垢版 |
2020/08/21(金) 22:26:40.07ID:JrVTIgi/
逆にCの代替になる必要はないと思う
CとのFFIは不自由なくできるわけで
むしろFFIが不自由なC++の代替にはなりづらいと思う
0994デフォルトの名無しさん
垢版 |
2020/08/21(金) 22:39:33.13ID:7UnAdk+W
Cの代替ってのは別にCの用途すべてを置き換えうるって意味じゃないでしょ
ripgrepとか見れば十分Cの代替と言える
0995デフォルトの名無しさん
垢版 |
2020/08/21(金) 23:03:52.36ID:QT6UwXc0
例えばQEMUなんかは既存のCの書き直しは大変過ぎるからやらないけど、
新規開発のデバイスエミュレーションコードはRustでって言ってるね。
そういう代替の仕方もあると思う。
0999デフォルトの名無しさん
垢版 |
2020/08/22(土) 10:58:14.06ID:oUSNiZjo
Linuxのカーネルハッカーが、凄腕プログラマとは限らないと言っているんだ。
プログラマの世界は、レベルの差が大きいから、その程度では凄腕には
分類されない。
例えば、VzEditorのc.mosさんは、その程度ではなかった。
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を超えています。これ以上書き込みはできません。

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