目次

Rustの勉強[高度な関数とクロージャ その2]

(更新: )ぎじゅつ

はじめに

#

NO IMAGEThe Rust Programming Language 日本語版 - The Rust Programming Language 日本語版
を読んでいる

お勉強

#

NO IMAGE高度な関数とクロージャ - The Rust Programming Language 日本語版

  • これやってる

メモ

#
fn add_one(x: i32) -> i32 {
    x + 1
}

fn do_twice(f: fn(i32) -> i32, arg: i32) -> i32 {
    f(arg) + f(arg)
}

fn main() {
    let answer = do_twice(add_one, 5);

    // 答えは{}
    println!("The answer is: {}", answer);
}
  • クロージャーのポインタをもらう方法らしい
  • add_oneを入れてるよねって話か
  • えー
    • こんな記述したら悪魔のコードが出来上がりそう

クロージャはトレイトによって表現されます。つまり、クロージャを直接は返却できないのです。

  • ふむ
fn returns_closure() -> Fn(i32) -> i32 {
    |x| x + 1
}
  • これはだめらしい
error[E0277]: the trait bound `std::ops::Fn(i32) -> i32 + 'static:
std::marker::Sized` is not satisfied
-->
|
1 | fn returns_closure() -> Fn(i32) -> i32 {
|                         ^^^^^^^^^^^^^^ `std::ops::Fn(i32) -> i32 + 'static`
does not have a constant size known at compile-time
|
= help: the trait `std::marker::Sized` is not implemented for
`std::ops::Fn(i32) -> i32 + 'static`
= note: the return type of a function must have a statically known size
  • ということはtrait boundみたいな表現をどっかでするのかな?

エラーは、再度Sizedトレイトを参照しています!コンパイラには、クロージャを格納するのに必要なスペースがどれくらいかわからないのです。

  • また長さが分からない問題か
fn returns_closure() -> Box<Fn(i32) -> i32> {
    Box::new(|x| x + 1)
}
  • わろた
    • そりゃそうなんだけど、そういうことか
    • スマートポインタにしろってことね
  • 難しー

まとめ

#
  • マクロちょっとやる
  • あと20、21だけかなー

NO IMAGEマクロ - The Rust Programming Language 日本語版