Mozilla発のRust言語のスレ
公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust
Web上の実行環境
https://play.rust-lang.org
前スレ
Rust Part7
http://mevius.5ch.net/test/read.cgi/tech/1563114707/
探検
Rust part8
■ このスレッドは過去ログ倉庫に格納されています
2020/01/24(金) 11:47:52.41ID:9oO1hUHl
2デフォルトの名無しさん
2020/01/24(金) 12:03:40.01ID:ytRnz1Ft このスレにバグがある確率
↓
↓
3デフォルトの名無しさん
2020/01/24(金) 13:58:51.88ID:rcCZSgTk この世のC/C++プログラムにバグが一つでもあるぐらい%
2020/01/24(金) 15:10:27.64ID:2IgFvbdV
2020/01/24(金) 23:17:19.37ID:CbfOEjVR
質問です。
こんな構造体を作っていました。
struct Iter<T: Iterator> {
buffer : Option<char>,
iter : T
}
このとき T::Item が char であるような制限を表現する方法はありますか?
こんな構造体を作っていました。
struct Iter<T: Iterator> {
buffer : Option<char>,
iter : T
}
このとき T::Item が char であるような制限を表現する方法はありますか?
2020/01/25(土) 00:04:14.38ID:m3Nt4oA+
struct Iter<T: Iterator<Item=char>>
2020/01/25(土) 00:07:06.67ID:NV/40SqZ
8デフォルトの名無しさん
2020/01/25(土) 09:25:49.56ID:yPlwm7j6 どういたしまして
9デフォルトの名無しさん
2020/01/25(土) 10:02:56.84ID:cxLY0DeL ミスがある前提で作られたソフトウェアなんぞ使いたくないわ。
2020/01/25(土) 10:26:45.49ID:m3Nt4oA+
個人のミスが重大な問題にならないようシステムで防ぐんだぞ
1つのミスがそのままProductionのバグになるわけじゃないから
個々の部品が予期しない故障をする前提で設計したシステムと
個々の部品は想定外の故障はしない前提で設計したシステムと
どちらのほうが高い信頼性を実現できるのかは歴史を見れば明らか
だから優れたプログラマーは自分がミスを犯す前提で
そのミスが重大な問題につながらないよう個人単位でもシステムを構築してる
1つのミスがそのままProductionのバグになるわけじゃないから
個々の部品が予期しない故障をする前提で設計したシステムと
個々の部品は想定外の故障はしない前提で設計したシステムと
どちらのほうが高い信頼性を実現できるのかは歴史を見れば明らか
だから優れたプログラマーは自分がミスを犯す前提で
そのミスが重大な問題につながらないよう個人単位でもシステムを構築してる
2020/01/25(土) 10:50:03.15ID:hZDj10w+
ミスをしないエンジニアは存在する
俺だ
俺だ
12デフォルトの名無しさん
2020/01/25(土) 10:53:31.57ID:cxLY0DeL2020/01/25(土) 10:59:09.24ID:cUlFTyRf
14デフォルトの名無しさん
2020/01/26(日) 03:02:59.13ID:0RGBrSLm https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=511e2be2ae90342a9c36f759e73108b6
勉強がてらたらい回し関数をメモ化仕様で書いてみたんですけどあってますかね…自信がないです
勉強がてらたらい回し関数をメモ化仕様で書いてみたんですけどあってますかね…自信がないです
2020/01/26(日) 14:50:16.22ID:0RGBrSLm
返す変数間違ってました
2020/01/26(日) 15:15:02.80ID:0RGBrSLm
あーなんかいろいろ間違ってたんで出直します
2020/01/26(日) 17:36:36.36ID:HuWRexcG
プルリクとかも出す前にさんざん確認してんのに出してからすぐ「あ、ここ間違ってた…」みたいになるよね(´・ω・`)
18デフォルトの名無しさん
2020/01/26(日) 21:41:08.18ID:afCDhAgp Vec<String> を拡張すると定義外ってエラー出るんですけどなんでかわかる人います?
他のライブラリでVec拡張してるソース見ると特殊なことせずにimplできてるんですけどどうすればこのエラー取り除けますか?
impl From<Vec<&str>> for Vec<String> {
fn from(v: Vec<&str>) -> Self {
v.into_iter().map(String::from).collect()
}
}
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
88 | impl From<Vec<&str>> for Vec<String> {
| ^^^^^---------------^^^^^-----------
| | | |
| | | `std::vec::Vec` is not defined in the current crate
| | `std::vec::Vec` is not defined in the current crate
| impl doesn't use only types from inside the current crate
|
他のライブラリでVec拡張してるソース見ると特殊なことせずにimplできてるんですけどどうすればこのエラー取り除けますか?
impl From<Vec<&str>> for Vec<String> {
fn from(v: Vec<&str>) -> Self {
v.into_iter().map(String::from).collect()
}
}
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
|
88 | impl From<Vec<&str>> for Vec<String> {
| ^^^^^---------------^^^^^-----------
| | | |
| | | `std::vec::Vec` is not defined in the current crate
| | `std::vec::Vec` is not defined in the current crate
| impl doesn't use only types from inside the current crate
|
2020/01/26(日) 22:08:40.96ID:ux8Vy6ZU
>>18
ざっくりいうと
外部crateで定義された型 + 外部crateで定義されたtrait
の組み合わせでインプリするのは無理
どっちか片方が自crateで定義されたものなら問題ない
coherence ruleとかorphan ruleとかいうやつ
https://doc.rust-lang.org/error-index.html#E0117
ざっくりいうと
外部crateで定義された型 + 外部crateで定義されたtrait
の組み合わせでインプリするのは無理
どっちか片方が自crateで定義されたものなら問題ない
coherence ruleとかorphan ruleとかいうやつ
https://doc.rust-lang.org/error-index.html#E0117
20デフォルトの名無しさん
2020/01/26(日) 23:22:19.61ID:afCDhAgp >>19
おお、ありがとう
impl Vec<&str> の単体でも駄目だったから自trait作って実装した!
結構制約厳しいな
外部トレイトに実装するならめんどくさいけどマーカーつけとけよって意味かな
おお、ありがとう
impl Vec<&str> の単体でも駄目だったから自trait作って実装した!
結構制約厳しいな
外部トレイトに実装するならめんどくさいけどマーカーつけとけよって意味かな
2020/01/27(月) 17:44:19.37ID:e3ktUGSY
こんな関数は書けますか?
@ イテレータを受け取る
A 受け取る引数は @ のただひとつのみ
B 条件を満たす範囲を「スライスで」返す
スライスを作る記法は &s[1..10] みたいな感じなのでスライスの元になるオブジェクト s が必要なように見えますが、
スライスを返したいというのはいかにもありそうなことなので出来ないはずはないだろうという思いもあります。
イテレータは実際にはなんらかのシーケンスをたどるものではなく値の生成器である場合もありますが、
それらを区別するような制約を表現できますか?
@ イテレータを受け取る
A 受け取る引数は @ のただひとつのみ
B 条件を満たす範囲を「スライスで」返す
スライスを作る記法は &s[1..10] みたいな感じなのでスライスの元になるオブジェクト s が必要なように見えますが、
スライスを返したいというのはいかにもありそうなことなので出来ないはずはないだろうという思いもあります。
イテレータは実際にはなんらかのシーケンスをたどるものではなく値の生成器である場合もありますが、
それらを区別するような制約を表現できますか?
2020/01/27(月) 18:55:02.93ID:Ad8VU0Ek
2020/01/27(月) 22:07:00.22ID:0eef+IwM
スライスは連続したメモリ領域である必要があって
任意のイテレータがその条件を満たすのは不可能。
たまたま連続した場合だけスライスを返すのはunsafe使えば書ける。
ただ普通はイテレータ返してランダムアクセス必要なタイミングでcollectすると思う。
任意のイテレータがその条件を満たすのは不可能。
たまたま連続した場合だけスライスを返すのはunsafe使えば書ける。
ただ普通はイテレータ返してランダムアクセス必要なタイミングでcollectすると思う。
2020/01/27(月) 22:21:05.46ID:0eef+IwM
あと標準のイテレータは特に値の生成方法に関する型制約はないので
区別したいなら独自のイテレータ型を作って
標準イテレータへの変換を実装する感じかな。
区別したいなら独自のイテレータ型を作って
標準イテレータへの変換を実装する感じかな。
2020/01/27(月) 22:29:13.49ID:ZEgWdqLw
入力が連続したメモリ領域だってんなら引数をイテレータじゃなくてスライスにすればいい
当たり前だけどスライスを作れるもの以外からはスライスは作れないからな
当たり前だけどスライスを作れるもの以外からはスライスは作れないからな
2020/01/27(月) 22:46:49.78ID:ZEgWdqLw
ごめん、なんか変なこと言ってるわ・・・スルーして
2020/01/27(月) 23:06:14.69ID:Ad8VU0Ek
>>23
>たまたま連続した場合だけスライスを返すのはunsafe使えば書ける。
イテレータを受け取ってスライスを返すとした場合
スライスの元になってるシーケンスのlifetimeが関数内に閉じるから
unsafe使ったとしてもborrow checkerにひっかからない?
>たまたま連続した場合だけスライスを返すのはunsafe使えば書ける。
イテレータを受け取ってスライスを返すとした場合
スライスの元になってるシーケンスのlifetimeが関数内に閉じるから
unsafe使ったとしてもborrow checkerにひっかからない?
2020/01/27(月) 23:19:10.77ID:2FR/nuYZ
>>27
from_raw_partsでスライスを作った場合は元のポインタ由来のライフタイムは関係なくなるので
ボローチェッカは通るんじゃないかな?
もちろんそのスライスの実体が生きているかどうかは
自己責任になるけど。
from_raw_partsでスライスを作った場合は元のポインタ由来のライフタイムは関係なくなるので
ボローチェッカは通るんじゃないかな?
もちろんそのスライスの実体が生きているかどうかは
自己責任になるけど。
2020/01/28(火) 00:18:00.02ID:nzUBCcWX
>>28
なるほど
イテレータからイテレータの元のシーケンスが取得できればそれでいけるってことか
ちょっと見てみたらslice::Iterのas_sliceとかも内部でfrom_raw_parts使ってた
自分では使わないと思うけど勉強になった
なるほど
イテレータからイテレータの元のシーケンスが取得できればそれでいけるってことか
ちょっと見てみたらslice::Iterのas_sliceとかも内部でfrom_raw_parts使ってた
自分では使わないと思うけど勉強になった
30デフォルトの名無しさん
2020/01/28(火) 10:36:24.22ID:ijxMtirO RustでOSのkernel描いてる例ある?
3121
2020/01/28(火) 10:56:11.58ID:jIEBko3c >>22-29
ありがとうございます。
スライスの役目や Rust の習慣について誤解していたみたいです。
【誤解】
スライスは範囲を表現する高級なオブジェクト
Vec にも配列にも使えるのでコンテナ全般に使えると思った
【正解】
スライスは「メモリの」範囲を表現するオブジェクト
実体としてはいわゆる fat pointer
【背景】
Vec は内部的に連続したメモリ領域で管理しているので普通の配列のようにスライスを作れる
C++ でいえば vector の data や string の c_str みたいなもの
【見落とし】
配列でも Vec でもスライスの型表記は同じなのでどうしてだろうと気にかかってはいたが掘り下げて調べなかった
型が同じなのは実際に同じだからなわけですね
ありがとうございます。
スライスの役目や Rust の習慣について誤解していたみたいです。
【誤解】
スライスは範囲を表現する高級なオブジェクト
Vec にも配列にも使えるのでコンテナ全般に使えると思った
【正解】
スライスは「メモリの」範囲を表現するオブジェクト
実体としてはいわゆる fat pointer
【背景】
Vec は内部的に連続したメモリ領域で管理しているので普通の配列のようにスライスを作れる
C++ でいえば vector の data や string の c_str みたいなもの
【見落とし】
配列でも Vec でもスライスの型表記は同じなのでどうしてだろうと気にかかってはいたが掘り下げて調べなかった
型が同じなのは実際に同じだからなわけですね
32デフォルトの名無しさん
2020/01/28(火) 12:14:44.10ID:w1x5kgyo 質問あると自分の理解が怪しいのが分かって助かるわ。
33デフォルトの名無しさん
2020/01/28(火) 19:57:36.65ID:DC7dbBDx let template = if spaces { "{1}{0}{1}" } else { "{1}{0}" };
format!(template, 1, 2);
これだとリテラルかけってエラー出るだけど、解決方法ないかな?
format!(template, 1, 2);
これだとリテラルかけってエラー出るだけど、解決方法ないかな?
2020/01/28(火) 20:03:41.33ID:UeuUZ8OR
iter[1..4]とか書けた方がiter.skil(1).take(4).collect()よりシンプルでええやん!
とは思ったが、そういう使い方したらそもそも駄目よ、という意思が表れているのかもしれん
とは思ったが、そういう使い方したらそもそも駄目よ、という意思が表れているのかもしれん
2020/01/28(火) 20:21:31.82ID:F/6MF06M
36デフォルトの名無しさん
2020/01/28(火) 22:00:20.47ID:DC7dbBDx >>34
range(&self, from: usize, to: usize) -> Option
があればいいのにね
>> 35
ありがとう、リテラルのみは統一感出るけどかなり不便だね。
デバッグ用じゃなくともDisplayとかもあるからResult返すマクロも入れといてくれたらいいのにね
range(&self, from: usize, to: usize) -> Option
があればいいのにね
>> 35
ありがとう、リテラルのみは統一感出るけどかなり不便だね。
デバッグ用じゃなくともDisplayとかもあるからResult返すマクロも入れといてくれたらいいのにね
2020/01/28(火) 22:12:59.36ID:hojGZimv
>>36
いえいえ
いえいえ
2020/01/28(火) 22:31:23.29ID:KmVlGMrW
39デフォルトの名無しさん
2020/01/29(水) 00:56:46.27ID:OlGAjZi3 collectを二度書くと罪悪感で一度にならないか一生懸命考える
2020/01/29(水) 02:14:46.64ID:V4INQ4I7
>>33
単純な用途ならリテラル返すマクロを書くといいかも
複雑な用途ならテンプレートエンジンかな
macro_rules! my_format {
(true) => ("{1}{0}{1}");
(false) => ("{1}{0}");
}
println!(my_format!(true), 1, 2);
単純な用途ならリテラル返すマクロを書くといいかも
複雑な用途ならテンプレートエンジンかな
macro_rules! my_format {
(true) => ("{1}{0}{1}");
(false) => ("{1}{0}");
}
println!(my_format!(true), 1, 2);
2020/02/01(土) 18:37:08.80ID:saBYxsru
https://tech-blog.optim.co.jp/entry/2019/07/18/173000#%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%A9%9F%E8%83%BD%E3%81%AE%E6%B4%BB%E7%94%A8
のデバッグ機能の追加のところを読んで一通り導入してみたんだが、ブレークポイントで止まったところがなぜかバイナリ表示になってしまう
解決策を教えてください
のデバッグ機能の追加のところを読んで一通り導入してみたんだが、ブレークポイントで止まったところがなぜかバイナリ表示になってしまう
解決策を教えてください
2020/02/02(日) 05:59:15.53ID:DhujQgFD
Slackで聞け
2020/02/02(日) 19:09:35.21ID:Ng7YaIlp
>>41
CodeLLDB初めて使ってみたがオレ環では特に問題なく使える
ソースマップ定義してないから標準ライブラリとかにstep inすればバイナリで表示されるけど
自分のソースのブレークポイントでバイナリ表示はされない
単純にdebug symbolが有効になってないとか?
launch.jsonのcargoのコマンド確認してそれでbuildしたバイナリを
rust-lldbでデバッグできるかどうかで切り分けてみたら?
CodeLLDB初めて使ってみたがオレ環では特に問題なく使える
ソースマップ定義してないから標準ライブラリとかにstep inすればバイナリで表示されるけど
自分のソースのブレークポイントでバイナリ表示はされない
単純にdebug symbolが有効になってないとか?
launch.jsonのcargoのコマンド確認してそれでbuildしたバイナリを
rust-lldbでデバッグできるかどうかで切り分けてみたら?
2020/02/02(日) 21:47:21.49ID:RNwzrPPX
解決しました
上記はMac用のデバッグのやり方のようです
上記はMac用のデバッグのやり方のようです
2020/02/04(火) 01:45:10.19ID:5y86WC+2
vscodeでrust始めたんだけどオートコンプリートがまともに働いてくれてない気がする
メソッド内の変数だと候補を出したり出さなかったりする
メソッド内の変数だと候補を出したり出さなかったりする
2020/02/04(火) 02:12:55.41ID:Pt7gvJNj
>>45
vscodeやめてインテリなんとか使えば?
vscodeやめてインテリなんとか使えば?
2020/02/04(火) 02:38:52.83ID:w9dkRQaa
vscode での Rust の補完って LSP を使うんでないの?
処理系と連携するって最強じゃんと思ってたんだが。
処理系と連携するって最強じゃんと思ってたんだが。
2020/02/04(火) 20:47:39.21ID:3rIDek9/
コンパイラから出てくる補完情報が成熟してないんで、まだ完璧には遠い
独自の解析はracerとintellij rustがやってて、精度はintellijの方が高い
あんまIDE使いたくないからrlsには頑張って欲しい
独自の解析はracerとintellij rustがやってて、精度はintellijの方が高い
あんまIDE使いたくないからrlsには頑張って欲しい
49デフォルトの名無しさん
2020/02/04(火) 21:22:29.69ID:YIjVTtZH 本体のソース見たいけど/* compiler built-in */ってなってて読めない。
どうやったら見れる?
どうやったら見れる?
2020/02/05(水) 23:43:19.76ID:85RuEno5
Rust の char::is_ascii とかは pub const fn is_ascii(&self) -> bool なのに is_whitespace とかは pub fn is_whitespace(self) -> bool みたいになってるのなんでだろ?
&self でも self でもどっちかに統一してよさそうな気がするんだけど。
&self でも self でもどっちかに統一してよさそうな気がするんだけど。
2020/02/05(水) 23:45:58.49ID:D4pcZnSz
なんかツイッターで以下2つについてコンパイルできねーっていうつぶやきがあったんですが、
試してみたらコンパイルできちゃったんですがどういうことなのでしょう
Rust2015/2018どっちでもコンパイルできちゃいました
//その1
let y: &i32;
let x = 5;
y = &x;
println!("{}", y);
参照元yの変数宣言が参照先のxより先に変数宣言されたからエラー。
//その2
let mut x = 5;
let y = &mut x;
*y += 1;
println!("{}", x); //これがエラー
試してみたらコンパイルできちゃったんですがどういうことなのでしょう
Rust2015/2018どっちでもコンパイルできちゃいました
//その1
let y: &i32;
let x = 5;
y = &x;
println!("{}", y);
参照元yの変数宣言が参照先のxより先に変数宣言されたからエラー。
//その2
let mut x = 5;
let y = &mut x;
*y += 1;
println!("{}", x); //これがエラー
2020/02/05(水) 23:58:35.71ID:sFY5zr3G
>>50
is_asciiはstrやsliceにもあるからそれに揃えたんじゃないかな
is_asciiはstrやsliceにもあるからそれに揃えたんじゃないかな
2020/02/06(木) 00:18:39.33ID:yO6jvvKT
2020/02/06(木) 00:30:48.24ID:kEyn3Q9D
drop順でエラーになってたやつだね
2020/02/06(木) 00:59:10.03ID:jSrTrJa0
>>52
なるほど、全部を &self に揃えなかったのは、やっぱ self の方が効率的って判断なのかな?
ワイはまだ初心者で Rust 脳になりきれてないんだけど、参照渡しってのは実質的に (C/C++ で言うところの) ポインタをやりとりしてる感じでしょ?
(単純な場合は最適化で消えると思うけど。)
char 程度の大きさならポインタを渡すのでもコピーして渡すのでも差はないし、ポインタだと間接参照になる分だけ無駄っぽい。
という理解をしてて、 char のメソッドは全部 self でいいくらいじゃないかと思ってた。
なるほど、全部を &self に揃えなかったのは、やっぱ self の方が効率的って判断なのかな?
ワイはまだ初心者で Rust 脳になりきれてないんだけど、参照渡しってのは実質的に (C/C++ で言うところの) ポインタをやりとりしてる感じでしょ?
(単純な場合は最適化で消えると思うけど。)
char 程度の大きさならポインタを渡すのでもコピーして渡すのでも差はないし、ポインタだと間接参照になる分だけ無駄っぽい。
という理解をしてて、 char のメソッドは全部 self でいいくらいじゃないかと思ってた。
2020/02/06(木) 01:31:54.89ID:yO6jvvKT
2020/02/06(木) 01:51:52.29ID:jSrTrJa0
58デフォルトの名無しさん
2020/02/06(木) 11:48:46.94ID:GExFx9na The Rust Programming Language 第2版で勉強中なんだけど
この内容に連動した練習問題か使用例みたいなのどこかにないだろうか?英語でいい
この内容に連動した練習問題か使用例みたいなのどこかにないだろうか?英語でいい
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 高市内閣の支持率72%、高い水準維持…読売世論調査 [どどん★]
- 【発信国情報】X、プロフィール上に「VPN使用の有無」も表示か… [BFU★]
- 【外交】オーストラリア市民党全国委員長「高市首相の発言は極めて破壊的」 [1ゲットロボ★]
- 高市首相の台湾有事答弁「問題ない」50% 「問題があったと思う」25%を大きく上回る 毎日新聞世論調査 ★3 [尺アジ★]
- 香港、日本側と交流停止 首相発言受け中国に追従 [蚤の市★]
- 【速報】 中国国営新聞社 「日本はすでに代価を支払った」 中国SNSで1位に 高市総理の発言めぐり ★4 [お断り★]
- 【日本一決定戦】大阪府民ちょっと来いkskすっぞ【ミャクミャク様が大屋根リングでお休みやでええ】
- 「ドリームキャスト 最高傑作」 👈これwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww [316257979]
- 眼鏡ってずり落ちて来るのがクソだよな
- 若者、徴兵されたがっていた。対中強硬姿勢評価が圧倒的 [237216734]
- 【📛専】とうふさんすこすこ😊👎スレッド【とうふゲームズ🏡】
- 【日本一決定戦】愛知県民ちょっと来やぁ!kskしてって【三河も来い】
