公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust
Web上の実行環境
https://play.rust-lang.org
日本語の情報
https://rust-jp.rs/
※Rustを学びたい人はまず最初に公式のThe Bookを読むこと
https://doc.rust-lang.org/book/
※Rustのasyncについて知りたければ「async-book」は必読
https://rust-lang.github.io/async-book/
※C++との比較は専用スレへ
C++ vs Rust
https://mevius.5ch.net/test/read.cgi/tech/1619219089/
※次スレは原則>>980が立てること
前スレ
Rust part12
https://mevius.5ch.net/test/read.cgi/tech/1629813327/
探検
Rust part13
■ このスレッドは過去ログ倉庫に格納されています
2021/11/07(日) 10:04:59.35ID:pJhT3MIE
303デフォルトの名無しさん
2021/12/14(火) 15:30:19.02ID:QBQJlKEt304デフォルトの名無しさん
2021/12/15(水) 07:48:40.06ID:inpCEPk8 技術を高める目的なら windows-rs や wgpu-rs みたいな一段下から積み上げるのも楽しいよ。
ゲーム作る道のりは遠くなるけど、画面に三角形出したり、キーの入力受け付けたりするだけで達成感が出てくる。
ゲーム作る道のりは遠くなるけど、画面に三角形出したり、キーの入力受け付けたりするだけで達成感が出てくる。
305デフォルトの名無しさん
2021/12/17(金) 12:43:03.76ID:jilrKB7M https://forest-watch-impress-co-jp.cdn.ampproject.org/c/s/forest.watch.impress.co.jp/docs/serial/yajiuma/1374/986/amp.index.html
エディタ自体はvscodeに勝つの難しそうだがGPUIとやらが定番GUIフレームワークにならないか期待
エディタ自体はvscodeに勝つの難しそうだがGPUIとやらが定番GUIフレームワークにならないか期待
306デフォルトの名無しさん
2021/12/17(金) 16:39:33.05ID:6JlgT7vi 既出だったらすいません
前から疑問だったのですが、出力におけるprint!マクロのような入力用マクロが標準ライブラリに用意されていない理由ってなんですか?
前から疑問だったのですが、出力におけるprint!マクロのような入力用マクロが標準ライブラリに用意されていない理由ってなんですか?
307デフォルトの名無しさん
2021/12/17(金) 18:11:01.90ID:tWB5K5S1 >>297
1対多で、broadcast するチャットルームのバックエンドなら、
Ruby on Rails 6 のAction Cable(WebSocket)が基本
JavaScript は、React, Phaser とか
【Rails】(送信時のリロード無し!)Action CableでSlack風チャットアプリを作成、2019/12
https://www.youtube.com/watch?v=o6PuxDr8Meg
1対多で、broadcast するチャットルームのバックエンドなら、
Ruby on Rails 6 のAction Cable(WebSocket)が基本
JavaScript は、React, Phaser とか
【Rails】(送信時のリロード無し!)Action CableでSlack風チャットアプリを作成、2019/12
https://www.youtube.com/watch?v=o6PuxDr8Meg
308デフォルトの名無しさん
2021/12/17(金) 18:36:09.20ID:ePonqmC1309デフォルトの名無しさん
2021/12/17(金) 23:52:56.58ID:6JlgT7vi >>308
熟読させていただきました。
私としてはたった数十行のコードであること且つ他のほとんどの言語に存在しているものなのであっても良いのかなと思ったのですが、Rustの基本理念を考えると慎重になる理由も理解出来ました。
Rustの経験が浅い私目線ではあまり腑に落ちませんでしたが、皆さんはどう考えていますか?
熟読させていただきました。
私としてはたった数十行のコードであること且つ他のほとんどの言語に存在しているものなのであっても良いのかなと思ったのですが、Rustの基本理念を考えると慎重になる理由も理解出来ました。
Rustの経験が浅い私目線ではあまり腑に落ちませんでしたが、皆さんはどう考えていますか?
310デフォルトの名無しさん
2021/12/18(土) 15:05:52.37ID:JzdvFl4u 熟読はしてないけど、外部ライブラリで簡単に実現可能であるなら
直感的には、本体メンテナの苦労を増やすほど価値があると思えないし別にいらんかな
こういうIOとかCLIプロンプトらへんの機能ってどうしても好みが分かれるというか、
ユースケースによって必要な機能がかなり違ってきちゃうと思うし
直感的には、本体メンテナの苦労を増やすほど価値があると思えないし別にいらんかな
こういうIOとかCLIプロンプトらへんの機能ってどうしても好みが分かれるというか、
ユースケースによって必要な機能がかなり違ってきちゃうと思うし
311デフォルトの名無しさん
2021/12/18(土) 20:46:47.80ID:w6oxugk6 C++のiostreamが失敗作だから慎重になるのもわかる笑
312デフォルトの名無しさん
2021/12/18(土) 23:17:58.09ID:SfwydFh9 >>306
C言語でのprintf相当はあるのにscanf相当がstdにないのはなぜか?ですね
逆になぜprintf相当がRustの標準ライブラリにあるのか?を考えてみると
(1) 読み書きの非対称性
人間が読むためにプログラムが書くことはエラー表示を含めて利用必須かつ頻出
一方で人間が書いたものをプログラムが読むことはレア
ファイルや通信相手への読み書きは各プロトコル/各API/シリアライズ等で対象外
(2) コンパイラサポート
print!やformat!等は頻出するので効率面からコンパイラサポートが効率的
実際にそれらが利用しているformat_args!はコンパイラ内蔵マクロ
(3) 標準ライブラリ採用
外部ライブラリで実現可能なものは採用しないが基本
今回はコンパイラ内蔵マクロだから採用
つまり出力は頻度と効率化で採用がクリアされたけど
入力は外部ライブラリで十分かなと
C言語でのprintf相当はあるのにscanf相当がstdにないのはなぜか?ですね
逆になぜprintf相当がRustの標準ライブラリにあるのか?を考えてみると
(1) 読み書きの非対称性
人間が読むためにプログラムが書くことはエラー表示を含めて利用必須かつ頻出
一方で人間が書いたものをプログラムが読むことはレア
ファイルや通信相手への読み書きは各プロトコル/各API/シリアライズ等で対象外
(2) コンパイラサポート
print!やformat!等は頻出するので効率面からコンパイラサポートが効率的
実際にそれらが利用しているformat_args!はコンパイラ内蔵マクロ
(3) 標準ライブラリ採用
外部ライブラリで実現可能なものは採用しないが基本
今回はコンパイラ内蔵マクロだから採用
つまり出力は頻度と効率化で採用がクリアされたけど
入力は外部ライブラリで十分かなと
313デフォルトの名無しさん
2021/12/19(日) 02:25:28.05ID:KXG/wmTu しかし競プロでみんなproconioとかいう謎の専用ライブラリ使ってるの見た目悪すぎて笑える
314デフォルトの名無しさん
2021/12/19(日) 04:21:35.56ID:1R2jF/rb 競プロ全然知らないけどstdinに入力数値がくるからか
| 入力は以下の形式で標準入力から数値が与えられる。
| a b c d e
| 積が奇数なら Odd と、 偶数なら Even と出力せよ。
標準ライブラリだけ使うと毎回こんなの書くのは面倒だもんな
| use std::io::{stdin, BufRead, BufReader};
| println!("{}", if BufReader::new(stdin()).lines().next().unwrap().unwrap().split(' ').any(|s| s.parse::<isize>().unwrap() & 1 == 0) { "Even" } else { "Odd" });
>>313
そのproconioを使うとこうなるようだ
| proconio::input! { v: [isize; 5] }
| println!("{}", if v.into_iter().any(|n| n & 1 == 0) { "Even" } else { "Odd" });
| 入力は以下の形式で標準入力から数値が与えられる。
| a b c d e
| 積が奇数なら Odd と、 偶数なら Even と出力せよ。
標準ライブラリだけ使うと毎回こんなの書くのは面倒だもんな
| use std::io::{stdin, BufRead, BufReader};
| println!("{}", if BufReader::new(stdin()).lines().next().unwrap().unwrap().split(' ').any(|s| s.parse::<isize>().unwrap() & 1 == 0) { "Even" } else { "Odd" });
>>313
そのproconioを使うとこうなるようだ
| proconio::input! { v: [isize; 5] }
| println!("{}", if v.into_iter().any(|n| n & 1 == 0) { "Even" } else { "Odd" });
315デフォルトの名無しさん
2021/12/19(日) 06:54:36.03ID:KXG/wmTu >>314
ワンライナー大好きかよ
ワンライナー大好きかよ
316デフォルトの名無しさん
2021/12/19(日) 07:00:31.55ID:1R2jF/rb >>315
マルチラインだと標準ライブラリだけでもわかりやすくなる?
マルチラインだと標準ライブラリだけでもわかりやすくなる?
317デフォルトの名無しさん
2021/12/19(日) 08:28:47.39ID:KXG/wmTu >>316
あいやごめん。proconioのところはどうあがいてもプロコン専用のproconioが一番見やすいよ。それ用に特化されたライブラリだし
俺が大好きかよって言ったのは
println!("{}", if v.into_iter().any(|n| n & 1 == 0) { "Even" } else { "Odd" });
の部分
あいやごめん。proconioのところはどうあがいてもプロコン専用のproconioが一番見やすいよ。それ用に特化されたライブラリだし
俺が大好きかよって言ったのは
println!("{}", if v.into_iter().any(|n| n & 1 == 0) { "Even" } else { "Odd" });
の部分
318デフォルトの名無しさん
2021/12/19(日) 09:08:15.26ID:1R2jF/rb どの言語でも三項演算子(相当)はワンライナーで書くんじゃね?
319デフォルトの名無しさん
2021/12/19(日) 09:36:51.21ID:Tv9xxy1h 見た目汚いなw
320デフォルトの名無しさん
2021/12/19(日) 09:42:08.31ID:1R2jF/rb これでいいかね?
println!("{}", if v.into_iter().any(|n| n & 1 == 0) {
"Even"
} else {
"Odd"
});
println!("{}", if v.into_iter().any(|n| n & 1 == 0) {
"Even"
} else {
"Odd"
});
321デフォルトの名無しさん
2021/12/19(日) 09:57:56.98ID:KXG/wmTu 俺ならこんな感じかなあ
俺は頭悪いから、途中結果に一つ一つ名前つけないとわかんなくなっちゃうわ
まあワンライナー見た時に「グエー」って思っただけだからごめん。「大好きかよ」とかいっておいてなんだけどあんま気にしないで
use proconio::input;
fn main() {
input!(v: [usize; 5]);
let is_even = v.iter().any(|x| x % 2 == 0);
let result = if is_even {
"Even"
} else {
"Odd"
};
println!("{}", result);
}
俺は頭悪いから、途中結果に一つ一つ名前つけないとわかんなくなっちゃうわ
まあワンライナー見た時に「グエー」って思っただけだからごめん。「大好きかよ」とかいっておいてなんだけどあんま気にしないで
use proconio::input;
fn main() {
input!(v: [usize; 5]);
let is_even = v.iter().any(|x| x % 2 == 0);
let result = if is_even {
"Even"
} else {
"Odd"
};
println!("{}", result);
}
322デフォルトの名無しさん
2021/12/19(日) 10:13:36.41ID:1R2jF/rb >>321
なるほど
じゃあ最初の標準ライブラリのみはどのように分けるのかな
println!("{}", if BufReader::new(stdin()).lines().next().unwrap().unwrap().split(' ').any(|s| s.parse::<isize>().unwrap() & 1 == 0) { "Even" } else { "Odd" });
なるほど
じゃあ最初の標準ライブラリのみはどのように分けるのかな
println!("{}", if BufReader::new(stdin()).lines().next().unwrap().unwrap().split(' ').any(|s| s.parse::<isize>().unwrap() & 1 == 0) { "Even" } else { "Odd" });
323デフォルトの名無しさん
2021/12/19(日) 10:17:01.07ID:KXG/wmTu324デフォルトの名無しさん
2021/12/19(日) 12:54:53.29ID:XhCh7cuL325デフォルトの名無しさん
2021/12/19(日) 13:44:27.43ID:JD8Mu2Jr わけわからんくてビビってたらよく見るとPythonスレじゃなかった
326デフォルトの名無しさん
2021/12/19(日) 15:04:40.83ID:9UFbsF2U rustfmt使うでしょ普通
327デフォルトの名無しさん
2021/12/19(日) 21:36:12.89ID:1R2jF/rb >>326
println全体が改行されてしまった
println!(
"{}",
if BufReader::new(stdin())
.lines()
.next()
.unwrap()
.unwrap()
.split(' ')
.any(|s| s.parse::<isize>().unwrap() & 1 == 0)
{
"Even"
} else {
"Odd"
}
);
一方で分割するとこうなった
let cond = BufReader::new(stdin())
.lines()
.next()
.unwrap()
.unwrap()
.split(' ')
.any(|s| s.parse::<isize>().unwrap() & 1 == 0);
println!("{}", if cond { "Even" } else { "Odd" });
if式自体はワンライナーーで正解とrustfmtはおっしゃってる
println全体が改行されてしまった
println!(
"{}",
if BufReader::new(stdin())
.lines()
.next()
.unwrap()
.unwrap()
.split(' ')
.any(|s| s.parse::<isize>().unwrap() & 1 == 0)
{
"Even"
} else {
"Odd"
}
);
一方で分割するとこうなった
let cond = BufReader::new(stdin())
.lines()
.next()
.unwrap()
.unwrap()
.split(' ')
.any(|s| s.parse::<isize>().unwrap() & 1 == 0);
println!("{}", if cond { "Even" } else { "Odd" });
if式自体はワンライナーーで正解とrustfmtはおっしゃってる
328デフォルトの名無しさん
2021/12/19(日) 21:50:26.03ID:gPlFWszB ワンライナー云々はフォーマットの話ではないやろ
329デフォルトの名無しさん
2021/12/19(日) 22:05:50.34ID:1R2jF/rb330デフォルトの名無しさん
2021/12/19(日) 22:37:44.04ID:D79ys1jH 構造と書式を区別できんのはヤバイで
331デフォルトの名無しさん
2021/12/19(日) 23:10:30.41ID:ZhiL7Huf 心底どうでもいい。
保守性に貢献するどころかマイナスになるようなクソプライドコードの導入すんなよ。
保守性に貢献するどころかマイナスになるようなクソプライドコードの導入すんなよ。
332デフォルトの名無しさん
2021/12/19(日) 23:14:48.39ID:4jRnwXL4 また性懲りもなくコードべたべた書いてんのか
333デフォルトの名無しさん
2021/12/19(日) 23:21:45.51ID:cDs+Q4pL rustfmtだから書式の話やで
334デフォルトの名無しさん
2021/12/19(日) 23:25:17.24ID:/BRS7QS/ 区別できなかったからrustfmtを持ち出したんやろ
どこに改行入れるべきかって話だと思ったんだろなww
どこに改行入れるべきかって話だと思ったんだろなww
335デフォルトの名無しさん
2021/12/19(日) 23:41:46.15ID:1R2jF/rb rustfmtを持ち出したのは俺じゃないぜ
あと今回のケースならここは分割するよな
let reader = BufReader::new(stdin());
let line = reader.lines().next().unwrap().unwrap();
let is_even = line.split(' ').any(|s| s.parse::<isize>().unwrap() & 1 == 0);
あと今回のケースならここは分割するよな
let reader = BufReader::new(stdin());
let line = reader.lines().next().unwrap().unwrap();
let is_even = line.split(' ').any(|s| s.parse::<isize>().unwrap() & 1 == 0);
336デフォルトの名無しさん
2021/12/19(日) 23:48:52.91ID:m2ZvKw+8 汚コード
337デフォルトの名無しさん
2021/12/19(日) 23:59:56.43ID:cDs+Q4pL 問題文が>>314でこうなってるから
>> | 入力は以下の形式で標準入力から数値が与えられる。
>> | a b c d e
if let [a, b, c, d, e] = line
.splitn(5, ' ')
.map(|s| s.parse::<isize>().unwrap())
.collect::<ArrayVec<_, 5>>()[..] {
あとこれでいい
let is_even = a & b & c & d & e & 1 == 0;
>> | 入力は以下の形式で標準入力から数値が与えられる。
>> | a b c d e
if let [a, b, c, d, e] = line
.splitn(5, ' ')
.map(|s| s.parse::<isize>().unwrap())
.collect::<ArrayVec<_, 5>>()[..] {
あとこれでいい
let is_even = a & b & c & d & e & 1 == 0;
338デフォルトの名無しさん
2021/12/20(月) 05:23:59.31ID:XPDM+Al+ そういえばいつの間にか
let variable = 3;
println!("{variable}");
みたいな書き方が出来るんだけどこれ前からだっけ?
let variable = 3;
println!("{variable}");
みたいな書き方が出来るんだけどこれ前からだっけ?
339デフォルトの名無しさん
2021/12/20(月) 05:50:08.07ID:MpI5dMic340デフォルトの名無しさん
2021/12/20(月) 11:31:40.46ID:vxPhPqzv >>335
構造化の基本を学びましょう
構造化の基本を学びましょう
341デフォルトの名無しさん
2021/12/20(月) 18:38:24.90ID:+mZvzmRI どちらのコードも正解
342デフォルトの名無しさん
2021/12/20(月) 18:57:17.41ID:rubGoZ9q コードに「間違い」はあっても「正解」はない
343デフォルトの名無しさん
2021/12/20(月) 19:04:29.92ID:MpI5dMic 間違っているコードは出ていないような
問題視してる人は具体的に何を問題にしているの?
問題視してる人は具体的に何を問題にしているの?
344デフォルトの名無しさん
2021/12/20(月) 20:55:59.37ID:lwZpjeWf アスぺ思考はこれだから
345デフォルトの名無しさん
2021/12/21(火) 11:25:19.41ID:TTfv6HaA https://doc.rust-jp.rs/book-ja/ch18-03-pattern-syntax.html#%E3%83%9E%E3%83%83%E3%83%81%E3%82%AC%E3%83%BC%E3%83%89%E3%81%A7%E8%BF%BD%E5%8A%A0%E3%81%AE%E6%9D%A1%E4%BB%B6%E5%BC%8F
ここの最後のところに
パターンと関わるマッチガードの優先度は、以下のように振る舞います:
(4 | 5 | 6) if y => ...
以下のようにではありません:
4 | 5 | (6 if y) => ...
とあるんですが、後者のようになってほしい場合は4|5と6 if yを別々に書くしか無いですか?
ここの最後のところに
パターンと関わるマッチガードの優先度は、以下のように振る舞います:
(4 | 5 | 6) if y => ...
以下のようにではありません:
4 | 5 | (6 if y) => ...
とあるんですが、後者のようになってほしい場合は4|5と6 if yを別々に書くしか無いですか?
346デフォルトの名無しさん
2021/12/21(火) 11:56:47.99ID:BV9oeByN >>345
ガード構文がこう「『Pattern』 if 『Expression』」なのでそうなりますね
ガード構文がこう「『Pattern』 if 『Expression』」なのでそうなりますね
347デフォルトの名無しさん
2021/12/22(水) 20:44:35.79ID:7pEHjDF/ sixtyfpsってどう?
348デフォルトの名無しさん
2021/12/22(水) 22:58:00.27ID:mfli1g17 > しかし競プロでみんなproconioとかいう謎の専用ライブラリ使ってるの見た目悪すぎて笑える
いや、ほぼ公認のクレートなんだが・・・
謎の専用ライブラリとかいってる時点で、お察しか?
あと、見た目悪いってどういうことなんかね
includeしたら見た目悪すぎなわけ?
いや、ほぼ公認のクレートなんだが・・・
謎の専用ライブラリとかいってる時点で、お察しか?
あと、見た目悪いってどういうことなんかね
includeしたら見た目悪すぎなわけ?
349デフォルトの名無しさん
2021/12/22(水) 23:53:48.10ID:Wk3NOZd2 Rust bookの以下の記述について質問です
https://doc.rust-jp.rs/book-ja/ch19-05-advanced-functions-and-closures.html#クロージャを返却する
> 以下のコードは、クロージャを直接返そうとしていますが、コンパイルできません:
>
> fn returns_closure() -> Fn(i32) -> i32 {
> |x| x + 1
> }
> コンパイラには、クロージャを格納するのに必要なスペースがどれくらいかわからないのです。
> この問題の解決策は先ほど見かけました。
>
> fn returns_closure() -> Box<Fn(i32) -> i32> {
> Box::new(|x| x + 1)
> }
とBox化しなさいと書かれているのですが
以下のようにimplを付けるとBoxを使わなくてもコンパイルが通り動きました
fn make_closure_add1() -> impl Fn(i32) -> i32 {
|x| x + 1
}
このimpl付加は暗に自動的にBox化されているということなのでしょうか?
https://doc.rust-jp.rs/book-ja/ch19-05-advanced-functions-and-closures.html#クロージャを返却する
> 以下のコードは、クロージャを直接返そうとしていますが、コンパイルできません:
>
> fn returns_closure() -> Fn(i32) -> i32 {
> |x| x + 1
> }
> コンパイラには、クロージャを格納するのに必要なスペースがどれくらいかわからないのです。
> この問題の解決策は先ほど見かけました。
>
> fn returns_closure() -> Box<Fn(i32) -> i32> {
> Box::new(|x| x + 1)
> }
とBox化しなさいと書かれているのですが
以下のようにimplを付けるとBoxを使わなくてもコンパイルが通り動きました
fn make_closure_add1() -> impl Fn(i32) -> i32 {
|x| x + 1
}
このimpl付加は暗に自動的にBox化されているということなのでしょうか?
350デフォルトの名無しさん
2021/12/23(木) 00:23:38.98ID:p+r9sE2/351デフォルトの名無しさん
2021/12/23(木) 07:21:11.33ID:esNMmzKz >>348
そりゃあcratesio に上がったものは空っぽでもゴミでも全部公認だわなw
そりゃあcratesio に上がったものは空っぽでもゴミでも全部公認だわなw
352デフォルトの名無しさん
2021/12/23(木) 15:17:54.33ID:BEeWZFks >>342
逆だ、コードは常に「正解」で動いていて「間違い」ない。
あんたの書いたバグもコンピューターにとっては一部の隙もなく正解であり、書かれたその通りに動き、無慈悲である。
同じ目的で、多数、あるいは二人の人が書いたコードで違いが出るのは「表現の違い」であり「間違い」と決めつける
のは人間の主観や嗜好でしかなく、仮にコードへ正誤を求めるなら明確に表現できていなればならず、矛盾が生じる
逆だ、コードは常に「正解」で動いていて「間違い」ない。
あんたの書いたバグもコンピューターにとっては一部の隙もなく正解であり、書かれたその通りに動き、無慈悲である。
同じ目的で、多数、あるいは二人の人が書いたコードで違いが出るのは「表現の違い」であり「間違い」と決めつける
のは人間の主観や嗜好でしかなく、仮にコードへ正誤を求めるなら明確に表現できていなればならず、矛盾が生じる
353デフォルトの名無しさん
2021/12/23(木) 15:32:21.87ID:GoKXBRn5 コンパイルが通らないコードも正解なのかい?
354デフォルトの名無しさん
2021/12/23(木) 15:39:30.16ID:9VjYa60R えらいポエミーやな
355デフォルトの名無しさん
2021/12/23(木) 18:55:13.24ID:TD851Muu ”動いていて”と言っているからコンパイルは通ってる前提だろう、”コードへ正誤を求める”といっているから
仮にコンパイルが通らないコードは明確にそれ(誤り・間違い)が表現できている
ポエミーなのはその通りだろう
仮にコンパイルが通らないコードは明確にそれ(誤り・間違い)が表現できている
ポエミーなのはその通りだろう
356デフォルトの名無しさん
2021/12/23(木) 21:22:53.78ID:NwYcCv97 >>349
Boxとはヒープを使うということです
Rustではコードで明示的に指定しない限り勝手にヒープが使われることはないです
(もちろんBox以外にもVecやStringなどヒープを使うものを使ってもそれは明示的に指定したことになります)
その Box<Fn(i32) -> i32> は今は Box<dyn Fn(i32) -> i32> と書く必要があります
では本題の impl Fn(i32) -> i32 と書いた場合はどうなるのでしょうか?
以下のように3種類のクロージャを作ってサイズや型を表示させてみると
fn main() {
let direct_closure = |x: i32| x + 1;
let impl_closure = make_impl_closure();
let box_closure = make_box_closure();
println!("{} {}", std::mem::size_of_val(&direct_closure), type_of(&direct_closure));
println!("{} {}", std::mem::size_of_val(&impl_closure), type_of(&impl_closure));
println!("{} {}", std::mem::size_of_val(&box_closure), type_of(&box_closure));
}
fn make_impl_closure() -> impl Fn(i32) -> i32 {
|x| x + 1
}
fn make_box_closure() -> Box<dyn Fn(i32) -> i32> {
Box::new(|x| x + 1)
}
fn type_of<T>(_: &T) -> &'static str {
std::any::type_name::<T>()
}
実行結果は以下のように表示されます
0 tmp::main::{{closure}}
0 tmp::make_impl_closure::{{closure}}
16 alloc::boxed::Box<dyn core::ops::function::Fn<(i32,)>+Output = i32>
つまりimplでは直接クロージャ指定したのと全く同じです
(上記では定義した関数名だけが異なる)
Boxとはヒープを使うということです
Rustではコードで明示的に指定しない限り勝手にヒープが使われることはないです
(もちろんBox以外にもVecやStringなどヒープを使うものを使ってもそれは明示的に指定したことになります)
その Box<Fn(i32) -> i32> は今は Box<dyn Fn(i32) -> i32> と書く必要があります
では本題の impl Fn(i32) -> i32 と書いた場合はどうなるのでしょうか?
以下のように3種類のクロージャを作ってサイズや型を表示させてみると
fn main() {
let direct_closure = |x: i32| x + 1;
let impl_closure = make_impl_closure();
let box_closure = make_box_closure();
println!("{} {}", std::mem::size_of_val(&direct_closure), type_of(&direct_closure));
println!("{} {}", std::mem::size_of_val(&impl_closure), type_of(&impl_closure));
println!("{} {}", std::mem::size_of_val(&box_closure), type_of(&box_closure));
}
fn make_impl_closure() -> impl Fn(i32) -> i32 {
|x| x + 1
}
fn make_box_closure() -> Box<dyn Fn(i32) -> i32> {
Box::new(|x| x + 1)
}
fn type_of<T>(_: &T) -> &'static str {
std::any::type_name::<T>()
}
実行結果は以下のように表示されます
0 tmp::main::{{closure}}
0 tmp::make_impl_closure::{{closure}}
16 alloc::boxed::Box<dyn core::ops::function::Fn<(i32,)>+Output = i32>
つまりimplでは直接クロージャ指定したのと全く同じです
(上記では定義した関数名だけが異なる)
357デフォルトの名無しさん
2021/12/23(木) 21:33:09.04ID:soQwByyI 今日はポエマー多いなw
358デフォルトの名無しさん
2021/12/23(木) 22:34:57.88ID:NwYcCv97 では常に impl を使えばよいのかというと
以下のような条件によって異なるクロージャを返す時
ここで Box を使わず impl Fn(i32) -> i32 にしようとすると
2つのクロージャの型が違うとコンパイラに怒られます
fn make_closure(curry: Option<i32>) -> Box<dyn Fn(i32) -> i32> {
if let Some(curry) = curry {
Box::new(move |x| x + curry)
} else {
Box::new(|x| x + 1)
}
}
結局クロージャでない場合と同じ話で
同じトレイトでも型が異なるものが同居する時にBox化します
>>349のRust bookの例はBox化が不要なケースでBox化だから混乱しますね
以下のような条件によって異なるクロージャを返す時
ここで Box を使わず impl Fn(i32) -> i32 にしようとすると
2つのクロージャの型が違うとコンパイラに怒られます
fn make_closure(curry: Option<i32>) -> Box<dyn Fn(i32) -> i32> {
if let Some(curry) = curry {
Box::new(move |x| x + curry)
} else {
Box::new(|x| x + 1)
}
}
結局クロージャでない場合と同じ話で
同じトレイトでも型が異なるものが同居する時にBox化します
>>349のRust bookの例はBox化が不要なケースでBox化だから混乱しますね
359デフォルトの名無しさん
2021/12/24(金) 11:53:17.86ID:8qqh3vKr コンパイル通ってれば全て正解とかバカ丸出し。
厳密な定義でも使えない定義があるってことすら理解してなさそう。
厳密な定義でも使えない定義があるってことすら理解してなさそう。
360デフォルトの名無しさん
2021/12/24(金) 12:05:46.49ID:0hdsBqvb 型安全だったらコンパイル通れば実行時エラーにならないという点で全て正解っていうのは別に間違ってないと思うけど?
これにケチつけるのは流石にどうかと
これにケチつけるのは流石にどうかと
361デフォルトの名無しさん
2021/12/24(金) 12:44:01.96ID:2tHLRFeD バカ丸出しにお前バカだろとわざわさ言うのもバカなんじゃなかろうか
362デフォルトの名無しさん
2021/12/24(金) 15:42:15.21ID:8qqh3vKr >>360
実行時エラーにならないなんて最低限のところだっつーの。だからバカだっていうんだよ。
実行時エラーにならないなんて最低限のところだっつーの。だからバカだっていうんだよ。
363デフォルトの名無しさん
2021/12/24(金) 16:05:46.66ID:GD01KKAb もしかしてrustはlinuxに取り込まれるわけねーだろって言い張っていた人?
予言外していたよね。お疲れ様です。
予言外していたよね。お疲れ様です。
364デフォルトの名無しさん
2021/12/24(金) 16:08:19.93ID:7q1GmIfa365デフォルトの名無しさん
2021/12/24(金) 16:10:39.10ID:GD01KKAb なんか草
366デフォルトの名無しさん
2021/12/24(金) 16:20:12.59ID:GD01KKAb 25 デフォルトの名無しさん sage 2021/04/27(火) 08:00:23.09 ID:/+bIFNU8
>>23
あのね。。書けばそうなるってものじゃなくてそれを実装しなきゃならんのよ。。
コンパイラにそういったコンテクストを判断させるのがめちゃくちゃ難しいっていってるでしょ?
なんでそんなに読み取れないの?
27 デフォルトの名無しさん sage 2021/04/27(火) 16:10:45.63 ID:/+bIFNU8
>>26
だからそのコードじゃpanic捉えきれねーからカーネルに入れるわけねーだろって
言ってんじゃん。。何読んでんだよ。
28 デフォルトの名無しさん sage 2021/04/27(火) 18:23:48.67 ID:n/AWrch2
まあ半年後どうなるかで誰が正しかったかは分かるわな
29 デフォルトの名無しさん sage 2021/04/27(火) 20:32:29.92 ID:/+bIFNU8
半年も経たなくてももうわかってるっつーの。。だからちゃんと英語の勉強しましょうね。
完全に同一人物だよね
>>23
あのね。。書けばそうなるってものじゃなくてそれを実装しなきゃならんのよ。。
コンパイラにそういったコンテクストを判断させるのがめちゃくちゃ難しいっていってるでしょ?
なんでそんなに読み取れないの?
27 デフォルトの名無しさん sage 2021/04/27(火) 16:10:45.63 ID:/+bIFNU8
>>26
だからそのコードじゃpanic捉えきれねーからカーネルに入れるわけねーだろって
言ってんじゃん。。何読んでんだよ。
28 デフォルトの名無しさん sage 2021/04/27(火) 18:23:48.67 ID:n/AWrch2
まあ半年後どうなるかで誰が正しかったかは分かるわな
29 デフォルトの名無しさん sage 2021/04/27(火) 20:32:29.92 ID:/+bIFNU8
半年も経たなくてももうわかってるっつーの。。だからちゃんと英語の勉強しましょうね。
完全に同一人物だよね
367デフォルトの名無しさん
2021/12/24(金) 16:26:02.78ID:GD01KKAb368デフォルトの名無しさん
2021/12/24(金) 16:31:02.04ID:GD01KKAb 予想が完全に外れたID:8qqh3vKrを晒し上げ♪♪♪
ここまで簡単な予想を外すとかバカ過ぎて生きていけなさそうwww
馬鹿丸出しですねwwwwww
ここまで簡単な予想を外すとかバカ過ぎて生きていけなさそうwww
馬鹿丸出しですねwwwwww
369デフォルトの名無しさん
2021/12/24(金) 16:40:31.03ID:8qqh3vKr 素でバカなんだな。。もうコンパイル通ったんで俺の仕事終わりとか現場で言ってろよ。。話にもならん。
370デフォルトの名無しさん
2021/12/24(金) 16:42:14.31ID:/xk3NPni371デフォルトの名無しさん
2021/12/24(金) 16:45:16.93ID:/xk3NPni372デフォルトの名無しさん
2021/12/24(金) 16:46:19.44ID:/xk3NPni >>369
同一人物だってことはバレバレだっつーの。バカ丸出し。wwwwwwwwww
同一人物だってことはバレバレだっつーの。バカ丸出し。wwwwwwwwww
373デフォルトの名無しさん
2021/12/24(金) 17:12:05.04ID:jmk0MHfo どうでもええわRustの話しろ
374デフォルトの名無しさん
2021/12/24(金) 17:38:56.03ID:8qNIErj3 厳密な定義でも使えない定義?Rustに特定条件下でCのような未定義になる動作あったっけ?
375デフォルトの名無しさん
2021/12/24(金) 18:41:11.93ID:759ZBatD スレの文脈はしらんけど、
Rustではunsafeを使ってなければコンパイラが、未定義動作が起きないということや、データ競合がないことを保証をしてくれるよ
Rustではunsafeを使ってなければコンパイラが、未定義動作が起きないということや、データ競合がないことを保証をしてくれるよ
376デフォルトの名無しさん
2021/12/24(金) 19:10:24.57ID:/xk3NPni >>369
予言外れましたよね?wwwwwwww
予言外れましたよね?wwwwwwww
377デフォルトの名無しさん
2021/12/25(土) 15:28:33.08ID:lsYj53Mi Rustでフロントエンドしてる奴おる?
378デフォルトの名無しさん
2021/12/26(日) 12:56:45.57ID:NwCcamJz Rustの勉強を昨日から開始した。後は構造体とかかな。
379デフォルトの名無しさん
2021/12/26(日) 17:26:13.09ID:rNqv+UWs コード貼ったら糞だボケだゴミだと自称上級者に罵倒されるから注意しろ
380デフォルトの名無しさん
2021/12/26(日) 19:27:36.42ID:IL2U4vJU Rustはこう謳っている
>なぜRustか?
>パフォーマンス
>信頼性
>生産性
真っ向から反するコードを貼ってりゃゴミ・クソ言われて当然なんだよなぁ
>なぜRustか?
>パフォーマンス
>信頼性
>生産性
真っ向から反するコードを貼ってりゃゴミ・クソ言われて当然なんだよなぁ
381デフォルトの名無しさん
2021/12/26(日) 19:29:23.79ID:Haex5ds9 すまんが、配列に入った数値の平均ってパッと出せないもんなの?
他言語でふにゃふにゃになった俺の頭でコードを書いたら、桁の溢れとか精度とか酷えことになりそう・・・・
他言語でふにゃふにゃになった俺の頭でコードを書いたら、桁の溢れとか精度とか酷えことになりそう・・・・
382デフォルトの名無しさん
2021/12/26(日) 20:24:04.94ID:s+fXV5dW コードもゴミだったがそれ以上に考え方がゴミだったからな
383デフォルトの名無しさん
2021/12/26(日) 20:42:21.32ID:M+F+5/6j384デフォルトの名無しさん
2021/12/26(日) 22:30:25.75ID:L9HJqboW >>381
普通に平均を求めるだけではダメなのでしょうか?
fn main() {
assert_eq!(5.5, (1..=10).average());
assert_eq!(6.8, [2.3, 8.7, 9.4].average());
}
use num::ToPrimitive;
trait Average {
fn average(self) -> f64;
}
impl<I> Average for I
where I: IntoIterator, <I as IntoIterator>::Item: ToPrimitive,
{
fn average(self: I) -> f64 {
self.into_iter().fold((0.0, 1.0), |(ave, size), n| (ave + (n.to_f64().unwrap() - ave) / size, size + 1.0)).0
}
}
普通に平均を求めるだけではダメなのでしょうか?
fn main() {
assert_eq!(5.5, (1..=10).average());
assert_eq!(6.8, [2.3, 8.7, 9.4].average());
}
use num::ToPrimitive;
trait Average {
fn average(self) -> f64;
}
impl<I> Average for I
where I: IntoIterator, <I as IntoIterator>::Item: ToPrimitive,
{
fn average(self: I) -> f64 {
self.into_iter().fold((0.0, 1.0), |(ave, size), n| (ave + (n.to_f64().unwrap() - ave) / size, size + 1.0)).0
}
}
385デフォルトの名無しさん
2021/12/27(月) 00:09:24.17ID:wxukv015 カハンの加算アルゴリズムというのがある
386デフォルトの名無しさん
2021/12/27(月) 09:11:03.63ID:9DXmjbrK 汚コードキタ━!
387デフォルトの名無しさん
2021/12/27(月) 10:50:10.93ID:BFpPIAiX 何でもトレイト化するアホ
388デフォルトの名無しさん
2021/12/27(月) 12:29:15.17ID:PxL7gTAR ゴミをゴミだといって何が悪い!
389デフォルトの名無しさん
2021/12/27(月) 12:32:52.22ID:OyINMfYQ ここの人たちってplaygroundとかなんで完全に動かせるコードで提示しないんだろ・・・?
アドバイス貰うにも回答するにも一生懸命スペース全角置換したり、まじ両方キモイw
trait Averagewwwww
アドバイス貰うにも回答するにも一生懸命スペース全角置換したり、まじ両方キモイw
trait Averagewwwww
390デフォルトの名無しさん
2021/12/27(月) 13:09:28.61ID:PX/mZ8bI こう言う時って普通の関数にしちゃいかんの?
391デフォルトの名無しさん
2021/12/27(月) 14:19:38.18ID:Btn3kp2t 普通の関数にすべきかどうかはメソッドチェーンにしたいかどうかで判断すればよろしい
392デフォルトの名無しさん
2021/12/27(月) 14:43:10.42ID:0vghZEjd393デフォルトの名無しさん
2021/12/27(月) 15:03:42.29ID:6JVZDUUj394デフォルトの名無しさん
2021/12/27(月) 21:04:27.03ID:K3JIQJJi しょうがない、一応は専門家が書いているであろう他言語の実装を参考にしよう・・・・
https://source.dot.net/#System.Linq/System/Linq/Average.cs,2b4701af991d5425
俺様、信頼して使っていたメソッドの衝撃の事実を知る
https://source.dot.net/#System.Linq/System/Linq/Average.cs,2b4701af991d5425
俺様、信頼して使っていたメソッドの衝撃の事実を知る
395デフォルトの名無しさん
2021/12/27(月) 21:09:19.15ID:h+0xE8z4 浮動小数点型ならそういう素直な実装で十分だよ
396デフォルトの名無しさん
2021/12/27(月) 21:53:06.04ID:N7w3YVE+ >>384
それだと桁溢れは防止できているが誤差蓄積の対処ができていない
もう一つパラメタを増やしてこうしたほうがいい
fn average(self: I) -> f64 {
self.into_iter().fold((0.0, 1.0, 0.0), |(ave, size, fix), n| {
let diff = (n.to_f64().unwrap() - ave) / size - fix;
let new_ave = ave + diff;
(new_ave, size + 1.0, (new_ave - ave) - diff)
}).0
}
>>387
イテレータメソッド化するにはそのためのtrait宣言が必須
もしわからないならitertoolsなどのイテレータ拡張ライブラリを見よう
>>389
標準ライブラリのsum()がtrait Sumを使っているからtrait Averageでもまあいいとは思う
ただし今回はイテレータメソッド拡張のみに用いているようだからtrait IteratorExtなどの命名がわかりやすいとは思う
それだと桁溢れは防止できているが誤差蓄積の対処ができていない
もう一つパラメタを増やしてこうしたほうがいい
fn average(self: I) -> f64 {
self.into_iter().fold((0.0, 1.0, 0.0), |(ave, size, fix), n| {
let diff = (n.to_f64().unwrap() - ave) / size - fix;
let new_ave = ave + diff;
(new_ave, size + 1.0, (new_ave - ave) - diff)
}).0
}
>>387
イテレータメソッド化するにはそのためのtrait宣言が必須
もしわからないならitertoolsなどのイテレータ拡張ライブラリを見よう
>>389
標準ライブラリのsum()がtrait Sumを使っているからtrait Averageでもまあいいとは思う
ただし今回はイテレータメソッド拡張のみに用いているようだからtrait IteratorExtなどの命名がわかりやすいとは思う
397デフォルトの名無しさん
2021/12/27(月) 21:56:50.25ID:20E7BwbM IteratorExt大草原、まじに入院してほしいw
398デフォルトの名無しさん
2021/12/27(月) 22:01:57.73ID:6/3kWl6D イテレータメソッドにする必要ある?
399デフォルトの名無しさん
2021/12/27(月) 22:15:24.91ID:N7w3YVE+ >>398
標準ライブラリにおいてsum()やproduct()
それを一般化したfold()やreduce()
さらにmax()やmin()など当然イテレータメソッドになっている
むしろ今回のaverage()だけをイテレータメソッドにしない理由が見当たらない
標準ライブラリにおいてsum()やproduct()
それを一般化したfold()やreduce()
さらにmax()やmin()など当然イテレータメソッドになっている
むしろ今回のaverage()だけをイテレータメソッドにしない理由が見当たらない
400デフォルトの名無しさん
2021/12/27(月) 22:20:18.56ID:6/3kWl6D >>399
じゃあなんで標準ライブラリにないの?
じゃあなんで標準ライブラリにないの?
401デフォルトの名無しさん
2021/12/27(月) 22:25:16.01ID:h+0xE8z4 カハンの加算使ったのか
402デフォルトの名無しさん
2021/12/27(月) 22:31:56.63ID:/o/Y1bP3 >>400
入力型と出力型で大量の組み合わせ(例:i32→f32)が用途に応じて要求されるのと
単純に合計をサイズで割った平均でよい用途もあれば
件数が多いと合計がオーバーフローするからその対策が欲しい用途もあれば
桁が大きく異なるデータ列の場合に浮動小数点の誤差改善が欲しい用途など多岐にわたる
だから平均を標準ライブラリで何か一つ用意は無理
入力型と出力型で大量の組み合わせ(例:i32→f32)が用途に応じて要求されるのと
単純に合計をサイズで割った平均でよい用途もあれば
件数が多いと合計がオーバーフローするからその対策が欲しい用途もあれば
桁が大きく異なるデータ列の場合に浮動小数点の誤差改善が欲しい用途など多岐にわたる
だから平均を標準ライブラリで何か一つ用意は無理
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 首相官邸前で「戦争あおるな」 台湾有事巡る答弁に抗議 [蚤の市★]
- 高市首相告白「『なめられない服』を選ぶことに数時間を費やしました」「外交交渉でマウント取れる服、買わなくてはいかんかもなぁ」 [ぐれ★]
- 【高市リスク】立民・小西洋之参院議員「高市総理がとんでもない安全保障オンチで外交オンチ」 [ぐれ★]
- 『DOWNTOWN+』会員数50万人突破で見えてきた 松本人志の“月収4ケタ万円”驚愕収入 [阿弥陀ヶ峰★]
- 【赤坂ライブハウス刺傷】逃走していた自衛官の男(43)を殺人未遂の疑いで逮捕 警視庁 被害女性とは知人関係 [Ailuropoda melanoleuca★]
- 【芸能】永遠の童顔′ウ「光GENJI」53歳になった山本淳一の近影に「若いな?」「元気パワーもらえるよっ」 [湛然★]
- 日本人「憲法9条があれば侵略されないって叫んでた売国左翼のゴミどもは今どんな気分?😂wwwwww」 [441660812]
- 婚活女子(43)「アラフォーのおっさんが『同世代の女はおばさんに見える。10歳くらい歳の離れた女性がいい』と言っててドン引きしてる… [257926174]
- 【悲報】ドンキのドンチキとかいう激安チキン、バズりすぎてガチで売ってないwwwwwwwwwwwwwwwwww
- 安倍晋三「日本よ、世界の真ん中で咲き誇れ」高市早苗「日本外交を咲き誇らせてまいります」 [696684471]
- 女死ね
- 【悲報】東京都民さん、20過ぎてるのに自転車に乗っててて大炎上wwwwwwwwwwww女「いい歳した男で自転車に乗るのは知的障がい者だけだよ? [483447288]
