TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼
ARToolKitでARを作ろう
【StarSuite Basic/OpenOffice.org Basic】
【関数】Erlang Part 2【エリクソン】
文字コード総合スレ Part11
[特設]サマータイム対応相談室
【Java】Wicket【HTML】
Visual Studio Code / VSCode Part4
Visual Studio 2019 Part4
オナオナ開発プロジェクト
C言語なら俺に聞け 147

Rust part8


1 :2020/01/24 〜 最終レス :2020/06/13
Mozilla発のRust言語のスレ
公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust
Web上の実行環境
https://play.rust-lang.org
前スレ
Rust Part7
http://mevius.2ch.sc/test/read.cgi/tech/1563114707/

2 :
このスレにバグがある確率


3 :
この世のC/C++プログラムにバグが一つでもあるぐらい%

4 :
>>2
このスレの仕様が定義されてないから
バグがあるかどうかは不定です

5 :
質問です。
こんな構造体を作っていました。

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

このとき T::Item が char であるような制限を表現する方法はありますか?

6 :
struct Iter<T: Iterator<Item=char>>

7 :
>>6
ありがとうございます。
上手くいきました。

8 :
どういたしまして

9 :
ミスがある前提で作られたソフトウェアなんぞ使いたくないわ。

10 :
個人のミスが重大な問題にならないようシステムで防ぐんだぞ
1つのミスがそのままProductionのバグになるわけじゃないから
個々の部品が予期しない故障をする前提で設計したシステムと
個々の部品は想定外の故障はしない前提で設計したシステムと
どちらのほうが高い信頼性を実現できるのかは歴史を見れば明らか
だから優れたプログラマーは自分がミスを犯す前提で
そのミスが重大な問題につながらないよう個人単位でもシステムを構築してる

11 :
ミスをしないエンジニアは存在する
俺だ

12 :
>>10
おまえの関わった製品には署名しといて。
絶対使わないから。

13 :
>>11
2chに書き込んでる時点で
何か人生ミスってる気がする

14 :
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=511e2be2ae90342a9c36f759e73108b6
勉強がてらたらい回し関数をメモ化仕様で書いてみたんですけどあってますかね…自信がないです

15 :
返す変数間違ってました

16 :
あーなんかいろいろ間違ってたんで出直します

17 :
プルリクとかも出す前にさんざん確認してんのに出してからすぐ「あ、ここ間違ってた…」みたいになるよね(´・ω・`)

18 :
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
|

19 :
>>18
ざっくりいうと
外部crateで定義された型 + 外部crateで定義されたtrait
の組み合わせでインプリするのは無理
どっちか片方が自crateで定義されたものなら問題ない
coherence ruleとかorphan ruleとかいうやつ
https://doc.rust-lang.org/error-index.html#E0117

20 :
>>19
おお、ありがとう
impl Vec<&str> の単体でも駄目だったから自trait作って実装した!
結構制約厳しいな
外部トレイトに実装するならめんどくさいけどマーカーつけとけよって意味かな

21 :
こんな関数は書けますか?
? イテレータを受け取る
? 受け取る引数は ? のただひとつのみ
? 条件を満たす範囲を「スライスで」返す
スライスを作る記法は &s[1..10] みたいな感じなのでスライスの元になるオブジェクト s が必要なように見えますが、
スライスを返したいというのはいかにもありそうなことなので出来ないはずはないだろうという思いもあります。
イテレータは実際にはなんらかのシーケンスをたどるものではなく値の生成器である場合もありますが、
それらを区別するような制約を表現できますか?

22 :
>>21
無理じゃね?
スライスじゃなくtakeやskip使ってイテレータを返すべきケースだと思うけど

23 :
スライスは連続したメモリ領域である必要があって
任意のイテレータがその条件を満たすのは不可能。
たまたま連続した場合だけスライスを返すのはunsafe使えば書ける。
ただ普通はイテレータ返してランダムアクセス必要なタイミングでcollectすると思う。

24 :
あと標準のイテレータは特に値の生成方法に関する型制約はないので
区別したいなら独自のイテレータ型を作って
標準イテレータへの変換を実装する感じかな。

25 :
入力が連続したメモリ領域だってんなら引数をイテレータじゃなくてスライスにすればいい
当たり前だけどスライスを作れるもの以外からはスライスは作れないからな

26 :
ごめん、なんか変なこと言ってるわ・・・スルーして

27 :
>>23
>たまたま連続した場合だけスライスを返すのはunsafe使えば書ける。

イテレータを受け取ってスライスを返すとした場合
スライスの元になってるシーケンスのlifetimeが関数内に閉じるから
unsafe使ったとしてもborrow checkerにひっかからない?

28 :
>>27
from_raw_partsでスライスを作った場合は元のポインタ由来のライフタイムは関係なくなるので
ボローチェッカは通るんじゃないかな?
もちろんそのスライスの実体が生きているかどうかは
自己責任になるけど。

29 :
>>28
なるほど
イテレータからイテレータの元のシーケンスが取得できればそれでいけるってことか
ちょっと見てみたらslice::Iterのas_sliceとかも内部でfrom_raw_parts使ってた
自分では使わないと思うけど勉強になった

30 :
RustでOSのkernel描いてる例ある?

31 :
>>22-29
ありがとうございます。
スライスの役目や Rust の習慣について誤解していたみたいです。

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

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

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

【見落とし】
 配列でも Vec でもスライスの型表記は同じなのでどうしてだろうと気にかかってはいたが掘り下げて調べなかった
 型が同じなのは実際に同じだからなわけですね

32 :
質問あると自分の理解が怪しいのが分かって助かるわ。

33 :
let template = if spaces { "{1}{0}{1}" } else { "{1}{0}" };
format!(template, 1, 2);
これだとリテラルかけってエラー出るだけど、解決方法ないかな?

34 :
iter[1..4]とか書けた方がiter.skil(1).take(4).collect()よりシンプルでええやん!
とは思ったが、そういう使い方したらそもそも駄目よ、という意思が表れているのかもしれん

35 :
>>33
標準のformatでは無理だね。templateのパースエラーを返す手段がないので。
dynfmtクレートとかならいけると思う。

36 :
>>34
range(&self, from: usize, to: usize) -> Option
があればいいのにね

>> 35
ありがとう、リテラルのみは統一感出るけどかなり不便だね。
デバッグ用じゃなくともDisplayとかもあるからResult返すマクロも入れといてくれたらいいのにね

37 :
>>36
いえいえ

38 :
>>34
Rust的にはcollectによるメモリコピーみたいな
重い操作は見た目上も重くしたいんだと思ってる。

39 :
collectを二度書くと罪悪感で一度にならないか一生懸命考える

40 :
>>33
単純な用途ならリテラル返すマクロを書くといいかも
複雑な用途ならテンプレートエンジンかな

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

println!(my_format!(true), 1, 2);

41 :
https://tech-blog.optim.co.jp/entry/2019/07/18/173000#%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%A9%9F%E8%83%BD%E3%81%AE%E6%B4%BB%E7%94%A8
のデバッグ機能の追加のところを読んで一通り導入してみたんだが、ブレークポイントで止まったところがなぜかバイナリ表示になってしまう

解決策を教えてください

42 :
Slackで聞け

43 :
>>41
CodeLLDB初めて使ってみたがオレ環では特に問題なく使える
ソースマップ定義してないから標準ライブラリとかにstep inすればバイナリで表示されるけど
自分のソースのブレークポイントでバイナリ表示はされない

単純にdebug symbolが有効になってないとか?
launch.jsonのcargoのコマンド確認してそれでbuildしたバイナリを
rust-lldbでデバッグできるかどうかで切り分けてみたら?

44 :
解決しました
上記はMac用のデバッグのやり方のようです

45 :
vscodeでrust始めたんだけどオートコンプリートがまともに働いてくれてない気がする
メソッド内の変数だと候補を出したり出さなかったりする

46 :
>>45
vscodeやめてインテリなんとか使えば?

47 :
vscode での Rust の補完って LSP を使うんでないの?
処理系と連携するって最強じゃんと思ってたんだが。

48 :
コンパイラから出てくる補完情報が成熟してないんで、まだ完璧には遠い
独自の解析はracerとintellij rustがやってて、精度はintellijの方が高い

あんまIDE使いたくないからrlsには頑張って欲しい

49 :
本体のソース見たいけど/* compiler built-in */ってなってて読めない。
どうやったら見れる?

50 :
Rust の char::is_ascii とかは pub const fn is_ascii(&self) -> bool なのに is_whitespace とかは pub fn is_whitespace(self) -> bool みたいになってるのなんでだろ?
&self でも self でもどっちかに統一してよさそうな気がするんだけど。

51 :
なんかツイッターで以下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); //これがエラー

52 :
>>50
is_asciiはstrやsliceにもあるからそれに揃えたんじゃないかな

53 :
>>51
NLLで救えるようになったケースだね。
Rust1.30くらいまで戻せばエラーになるけど
今は2015でも2018でもNLLがデフォルトなのでエラーにはならない。

54 :
drop順でエラーになってたやつだね

55 :
>>52
なるほど、全部を &self に揃えなかったのは、やっぱ self の方が効率的って判断なのかな?
ワイはまだ初心者で Rust 脳になりきれてないんだけど、参照渡しってのは実質的に (C/C++ で言うところの) ポインタをやりとりしてる感じでしょ?
(単純な場合は最適化で消えると思うけど。)
char 程度の大きさならポインタを渡すのでもコピーして渡すのでも差はないし、ポインタだと間接参照になる分だけ無駄っぽい。
という理解をしてて、 char のメソッドは全部 self でいいくらいじゃないかと思ってた。

56 :
>>55
ascii系は昔はAsciiExtってトレイトに別れてたから
その名残だと思う。

57 :
>>56
歴史的経緯ってやつか。
比較的新しい言語なのに、やっぱりそういうこともあるのね。

58 :
The Rust Programming Language 第2版で勉強中なんだけど
この内容に連動した練習問題か使用例みたいなのどこかにないだろうか?英語でいい

59 :
https://www.rust-lang.org/learn
このページの上のほうにある3つのボタンがそれそれ
1. The Bookの最新版
2. Rustlings course(練習問題的なやつ)
3. Rust by Example(使用例)
英語で問題ないなら2018対応してる最新のThe Book読んだほうがいいかも

60 :
英語がしんどい人 (日本語しかわからん人) にオススメなのはありますか?

61 :
The Bookの日本語版かオライリーの訳本
https://doc.rust-jp.rs/book-ja-pdf/book.pdf
https://www.oreilly.co.jp/books/9784873118550/
原著で読んだから訳の良し悪しはわからないけど
The Book含めて数冊読んだ中ではオライリー本が圧倒的にわかりやすかった

62 :
>>59
ありがと
こんな感じの欲しかった
って言うかPDFだけ読んでたから思い付かなかったけど本家にあったのか

63 :
手を動かしたいなら自転車本もあり
オライリーはちょっと古くなってるからなー

64 :
オライリー本の古くなってる箇所はEdition Guide読めば問題ないよ
多少古くてもOwnershipやLifetimeあたりの重要コンセプトをわかりやすく書いてるものがおすすめ

65 :
>>58みたいに英語でいいならrustupでインストールしたら付いてくるdocとそのリンク先にあるやつ読んだほうが良いぞ。
// ランタイム持ってないからasync/awaitがゼロコスト理論斬新すぎる

66 :
自クレートの名前やバージョンを取得するマクロって無かったっけ?

67 :
Rust のライブラリって検索できるようになってるじゃん?
あれって名前だけじゃなくて引数の型とかで検索できたりしないのかなぁ。
Haskell (GHC) の Hoogle みたいに

68 :
>>67
あ、 Inparameters ってやつをクリックすれば出てくるのか。

69 :
>>66
これ?
https://doc.rust-lang.org/cargo/reference/environment-variables.html#environment-variables-cargo-sets-for-crates

70 :
>>69
それだ!ありがとう

71 :
>>69
へー。
そのための専用のマクロってわけじゃなくて cargo が環境変数を設定してくれるって話なのね。
Cargo.toml を見ないとわかるはずもないからなんらかの連携があるのは当たり前といえば当たり前だけど。

72 :
io::Errorとかってprintln!("{:?}", err )とかしても
Os { code: 13, kind: PermissionDenied, message: "Permission denied" }
みたいに出るだけで「どのファイル」かが分からないんですが、外部のクレートの関数から上のようなエラーが帰ってきた場合それが「どのファイル」によって起きてるのかというのはどうやって知れば良いんでしょうか?

73 :
>>72
自分が明示的にパスを渡してるケースじゃなければ
クレートの作者にファイルパスも入れてクレメンスするしかないかも

74 :
バイナリサイズはまだCの方が全然小さいけどRustはC以上になにが含まれてるの?
もちろん標準ライブラリとかは使ってないやつはバイナリに含まれないよね?

75 :
>>74
明らかに大きいのはbacktrace用のデバッグシンボル。
これはstripすれば縮む。
それ以外はC側が共有ライブラリとしてどれだけ外に出してるかによるかと。

76 :
メモリ管理がランタイムにあるしdrop checkerもあるからランタイムはデカイよ。

77 :
>>75
backtrace用のデバッグシンボルってreleaseでもついてくるの?

>>76
drop checkerってborrow checkerの書き間違え?borrow checkerってcompile-time以外でも走るのって一部の実装だけって認識だけど
ARCとか使うとランタイムとか増えるの分かるけど使ってないハロワだけのやつでもCより多いのが疑問

78 :
https://www.reddit.com/r/rust/comments/bzdwru/hello_world_executable_size_268k_in_rustrelease/

79 :
Windows10のキャラクターがゴミ過ぎて無駄に苦労する
やっぱLinux使うしか無いんか?
でもゲームしたいからWindows環境が良いんだよな…

80 :
>>77
releaseでもデバッグシンボルはついてくる。
取って欲しいってIssueは立ってるけど
stripすればいいって感じなのか、あまり動きはない。
あとCのHelloWorldが小さいのはコードの大半が
libcにあるせいなのでは。

81 :
バイナリサイズを小さくしたいならここを読む
https://github.com/johnthagen/min-sized-rust

82 :
組み込みで使おうなんて本気で考えてる奴はこんなところで聞いたりせんだろ。

83 :
>>70
いえいえ

84 :
cargo install mdbook
としたとき、依存するライブラリクレートも一斉にインストール (というかキャッシュみたいな扱い?) されたようです。
ローカルに入ったライブラリクレートのドキュメントから一斉に、網羅的に検索する仕組みはありますか?
標準ライブラリのドキュメントは名前や引数で検索できますが、それを手元に入っているライブラリ全てに拡大したようなものが欲しいです。

85 :
>>84
ビルド用の一時ディレクトリ以下に展開されただけで他から使えるようにはなってないよ

86 :
>>85
そうなんですか。 Windows でやってるんですけど、
C:\Users\<ユーザー名>\.cargo\registry\src
に入っているのはビルド時の一時ファイル扱いという理解でいいんですかね?
他のプログラムをビルドしたときに必要になるライブラリクレートに共通するものが (このフォルダに) あったときでも
使いまわしはされないんでしょうか?
見かけ上は独立してるけど cargo が裏でうまいことやってくれるって感じなんでしょうか?
本当は Cargo book を読めばいいんでしょうけど、英語がわからなすぎて基本的な理念がよくわかってないです。

87 :
$ cargo doc --open
doc生成すればプロジェクトの依存クレートすべてWeb形式で検索できるけど
そういうことではない?

88 :
>>84
cargo installはバイナリクレートをインストールするためのワンライナーなんで
ライブラリクレートをどうこうする為のものではないよ。
バイナリのビルドに成功したら.cargo\binにコピーしてゴミは削除する。
バイナリクレートのドキュメントを読みたいならそれ自身を読みに行くんだよ。
rustdocは開発者向けでユーザー向けじゃない。
mdbookのrustdocが読みたいなら単にソースコードをクローンして自分でcargo doc叩けばビルドしてくれるけど。

89 :
構造体のメソッドでメンバ変数の値ひっぺがすのにstd::mem::take使うの面倒だな

90 :
>>87
「そのプロジェクト (に依存する全ての)」ではなく「ローカルに残っている全ての」というつもりでした。
>>88
> cargo installはバイナリクレートをインストールするためのワンライナーなんで
> ライブラリクレートをどうこうする為のものではないよ。
「為のものではない」ということは察していたんですが、
ライブラリのソースコードは残っているので裏で Cargo が動くために情報を残してもいるのだろう
と考えて特定のプロジェクトに限定せず横断的な処理をする方法があるのかどうかということを考えていました。
バイナリクレートをアップデートするときのために残してあるだけなんですかね……?
とりあえず、プロジェクトごとに独立していると考えておきます。

91 :
>>90
.cargoは全プロジェクト共通のキャッシュなので
プロジェクトまたいでも再利用はされる。
ただcargoコマンド自体はプロジェクト毎の操作しか提供しない、という感じ。
そういうツールを作ること自体は可能と思うけど。

92 :
>>91
なるほど。
見かけ上はプロジェクトの独立性があるように抽象化されているという感じですね。

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

ツールの使い方もおぼつかないので定番と言えるのがどのあたりなのかとかいった肌感覚もなくて、
実際のコードを色々と見て回るのにどういうやり方が良いのか模索しています。

93 :
https://ideone.com/6mGYO9
これの14行目15行目のところを10行目のところのように1つの文で書ける方法ってありますか?

94 :
Haskell の default 宣言みたいなのは Rust にありますか?
たとえば関数 foo が返す値の型が a もしくは b の可能性があり、
関数 bar が受け取る値の型が a もしくは b のときに bar(foo()) という式で型が定まりません。
このときに a と b の間での優先度を決める方法があるかという質問です。
具体的な状況があるわけではなくて、言語機能を学ぶ中で生じた疑問です。

95 :
>>93
こんな感じかな。
buf = buf.replace(ch, &<String as std::iter::FromIterator<&char>>::from_iter(&[' ', ch, ' ']));

96 :
>>95
thanks!

97 :
俺だったらformat!(" {} ", ch)にするかforを[" ( ", " ) ", ...]で回すかな

98 :
>>94
>たとえば関数 foo が返す値の型が a もしくは b の可能性があり

Rustで戻り値の型が1つに決まらない関数書ける?

99 :
型が曖昧な時はだいたいターボフィッシュでなんとかなるやろ

100 :
>>94
型が定まらない関数は定義不能。
aまたはbを返したいならenum c {a, b}にしてcで返すしかないかと。


100〜のスレッドの続きを読む
マルチスレッドプログラミング相談室 その9
HSP総合スレ【part 10】 [無断転載禁止](c)2ch.net
+ JavaScript の質問用スレッド vol.123 +
Java入門・初心者質問スレ Part.10
なあ、再帰関数好きな人いる? パート3
HSP総合スレ【part 10】 [無断転載禁止](c)2ch.net
TopCoder
ふらっと C#,C♯,C#(初心者用) Part127
Visual Studio 2019 Part3
シェルスクリプト総合 その28
--------------------
【ミラー】ミラーマン5【スパーク!】
40歳前後、職歴なし、約20年引き篭もりの仕事探し その4
【1ヶ月達成】中級卒煙者のスレ【1年未満】
18禁じゃないエロエロアニメ総合スレ276
劇場版 響け!ユーフォニアム総合♪9
【ペルソナ5】明智吾郎&信者アンチスレ6
アグネス、なにやってるの
【ネタバレ】遊戯王ARC-X TURN-207【雑談】
【完治】剥脱性口唇炎14【みんなで飯食いにいこうぜ!】
【ちはやふる】真島太一は同じ決意を返すからかっこいい 第19首 [無断転載禁止]&#169;2ch.net
■学生運動をした芸能人〜吉永小百合、坂本龍一
【悲報】人気Vtuberさん、ナルコレプシー病を発症し完全終了か。 [676450713]
ベスト8を何かに例えるスレ2018
Michael F. Atiyahがリーマン予想を証明しました。
【芥見下々】呪術廻戦 19
こんなゲームは誰も作らない
筑波東病院 横山治之 鈴木一弥精神科専門医
【アメリカ】「性奉仕ロボットの登場で男性はオワコン化する」 女性数学者の恐ろしい分析が話題に[1/8]
山本大介 2018周目
【悲報】 PS4の販売が振るわないソニー、携帯機は撤退予定 ★7 【ソースあり】
TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼