[過去ログ] Rust part24 (1002レス)
上下前次1-新
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
507(1): デフォルトの名無しさん [sage] 2024/06/30(日) 16:49:10.64 ID:MSv8cbxu(1/5) AAS
Rustで関数型のように書くなら
use std::env;
use std::fs::File;
use std::io::{self, BufRead, BufReader};
fn main() -> io::Result<()> {
env::args()
.skip(1)
.inspect(|file_name| println!("{file_name}"))
.map(|file_name| {
File::open(file_name).and_then(|file| {
BufReader::new(file)
.lines()
.enumerate()
.map(|(i, line)| line.map(|line| println!("{}: {line}", i + 1)))
.collect()
})
})
.collect()
}
509(1): デフォルトの名無しさん [sage] 2024/06/30(日) 17:13:06.42 ID:MSv8cbxu(2/5) AAS
>>508508(1): デフォルトの名無しさん [] 2024/06/30(日) 16:59:35.48 ID:WATrci3L(3/4) AAS
質問です。
.map(|(i, line)| line.map(|line| println!("{}: {line}", i + 1)))
↑
line.mapは文字列へのmapで1文字1文字に番号振ってる様に見えますが、違うのでしょうか?
素直に
.map(|(i, line)| println!("{}: {line}", i + 1))
とは出来ないのでしょうか?
そこは手続き型で書くと
let line = line?;
のところ
最初のlineはio::Result<String>型
それをmapして次のlineがString型
513(1): デフォルトの名無しさん [sage] 2024/06/30(日) 18:28:40.79 ID:MSv8cbxu(3/5) AAS
関数型のように書きたいならば基本はfor_eachを使わない
行き詰まりのfor_eachを使うと値もエラーも返せなくなる
517: デフォルトの名無しさん [sage] 2024/06/30(日) 21:23:59.76 ID:MSv8cbxu(4/5) AAS
>>515515(1): デフォルトの名無しさん [] 2024/06/30(日) 20:38:10.26 ID:oQ6wZd+v(1) AAS
let a: [u32; 4] = [1, 2, 3, 4];
let s: &[u32] = &a[1..3];
a[5]; と書くとコンパイルエラーが発生しますが、
s[5]; と書くとコンパイルは通り実行時にエラーが発生します。
なぜ、 s[5]; が範囲外の領域へのアクセスであることをコンパイル時に見抜けないのでしょうか?
本を見ても、理由が書いてないです。
ただ、そうなるとしか書いてありません。
静的にサイズが定数だと静的に比較できるから事前にコンパイルエラーとなる
配列は静的にサイズが定数
スライスもこのように静的にサイズを定数にしてやれば事前にコンパイルエラーとなる
const X: &[u32] = &[1, 2, 3, 4];
let x = X[5];
521(1): デフォルトの名無しさん [sage] 2024/06/30(日) 23:09:55.43 ID:MSv8cbxu(5/5) AAS
>>520for_eachは値を返せない
関数は基本的に値やエラーを返す
イテレータ利用で値やエラーを返すためにはfor_eachではなくcollectやfoldなどを用いる
>>507のように表示するだけで値を返さない場合であっても
関数はエラーを返さなければならない
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 1.443s*