関数の返し型を具体的に書くかimpl Traitと書くかの違いはもちろん明瞭にある
簡単な例で説明する
// まず実験用のおもちゃ(5ずつ増えるイテレータStepFive)を用意
pub struct StepFive { n: i64 }
impl StepFive {
fn new(init: i64) -> Self { StepFive { n: init } }
pub fn cur_value(&self) -> i64 { self.n } // 注意: イテレータには不要な追加機能
}
impl Iterator for StepFive {
type Item = i64;
fn next(&mut self) -> Option<Self::Item> { self.n += 5; Some(self.n) }
}
// このおもちゃイテレータを返す関数を二つ用意する
// 返し型を具体的に StepFive と書くケース
pub fn step_five_1(init: i64) -> StepFive { StepFive::new(init) }
// 返し型を impl Trait の形で書くケース
pub fn step_five_2(init: i64) -> impl Iterator<Item = i64> { StepFive::new(init) }
fn main() {
// イテレータとしてはどちらも当然機能する
assert_eq!(vec![5, 10, 15], step_five_1(0).take(3).collect::<Vec<_>>());
assert_eq!(vec![5, 10, 15], step_five_2(0).take(3).collect::<Vec<_>>());
// しかしイテレータにない機能を使うと違いが明瞭に出る
assert_eq!(123, step_five_1(123).cur_value()); // コンパイル通る
assert_eq!(123, step_five_2(123).cur_value()); // コンパイルエラー method not found in `impl Iterator<Item = i64>`
}
結局C++とRustってどっちが良いの? 5traits
レス数が950を超えています。1000を超えると書き込みができなくなります。
960デフォルトの名無しさん
2023/07/28(金) 16:45:41.21ID:4cjf/6GXレス数が950を超えています。1000を超えると書き込みができなくなります。
ニュース
- テレビ朝日本社から20~30代の関連会社社員とみられる男性が転落し死亡 六本木けやき坂通りの通行人にはけが人なし [少考さん★]
- テレビ朝日 本社から男性が転落し死亡。関連会社社員か 当たった通行人が左肩軽傷 [阿弥陀ヶ峰★]
- 【紅白】back number 白組で3年ぶり2回目の出場へ 「幅広い世代から支持」複数曲を披露する見込み [ひかり★]
- 【米FRB】0.25%利下げ決定 3会合連続、雇用下支え [蚤の市★]
- 「残クレ」でマイホーム、国が銀行向け保険 新型住宅ローン普及促す -日経 ★3 [少考さん★]
- 小島瑠璃子さん、代表取締役を務める会社を破産申請 [牛丼★]
