Universal Function Call Syntax

https://doc.rust-lang.org/book/ufcs.html

複数のtraitを実装したことにより、同じ名前の関数を持った際は、Trait::関数名としてどの関数を実行するか指定する必要がある。

trait Foo {
    fn f(&self);
}
trait Bar {
    fn f(&self);
}
struct Baz;
impl Foo for Baz {
    fn f(&self) { println!("Baz’s impl of Foo"); }
}
impl Bar for Baz {
    fn f(&self) { println!("Baz’s impl of Bar"); }
}

fn main() {
    let b = Baz;
    // b.f(); // エラーになる。
    Foo::f(&b);
    Bar::f(&b);
}

Closures #2

https://doc.rust-lang.org/book/closures.html

closureを引数や戻り値にする事ができる。戻り値にするのは結構面倒というか、あまり直感的ではない感じ。

fn main() {
    fn call_with_one2(some_closure: &Fn(i32) -> i32) -> i32 { // closureを引数に取る。
        some_closure(1) // 引数で取ったclosureをコールする。
    }
    fn add_one(i: i32) -> i32 {
        i + 1
    }
    let f = add_one;
    let answer = call_with_one2(&f);
    assert_eq!(2, answer);

    fn factory() -> Box<(Fn(i32) -> i32)> { // closureを戻す。
        let num = 5;

        Box::new(move |x| x + num)
    }
    let f = factory();
    let answer = f(1);
    assert_eq!(6, answer);
}

Trait Objects #2

https://doc.rust-lang.org/book/trait-objects.html

サンプルが一部動かせなかったということもあって理解出来ていない。 そもそも動くサンプルではなく、概念を示すコードなのかもしれないが・・・

分からないなりに、この先を進める。

Trait Objects

https://doc.rust-lang.org/book/trait-objects.html

trait Foo {
    fn method(&self) -> String;
}

impl Foo for u8 {
    fn method(&self) -> String { format!("u8: {}", *self) }
}

impl Foo for String {
    fn method(&self) -> String { format!("string: {}", *self) }
}

fn do_something<T: Foo>(x: T) {
    x.method();
}

fn main() {
    let x = 5u8;
    let y = "Hello".to_string();

    do_something(x); // u8向けのmethod関数が呼ばれる
    do_something(y); // String向けのmethod関数が呼ばれる
}

if let

https://doc.rust-lang.org/book/if-let.html

if letという構文を使うと簡潔に書けることがある。

fn foo(x: i32) {
    println!("{}", x);
}

fn main() {
    let option: Option<i32> = Some(5);

    match option {
        Some(x) => { foo(x) },
        None => {},
    }

    if option.is_some() {
        let x = option.unwrap();
        foo(x);
    }

    if let Some(x) = option {
        foo(x);
    }

    if let Some(x) = option {
        foo(x);
    } else {
        // bar();
    }

    let mut v = vec![1, 3, 5, 7, 11];
    loop {
        match v.pop() {
            Some(x) =>  println!("{}", x),
            None => break,
        }
    }

    let mut v = vec![1, 3, 5, 7, 11];
    while let Some(x) = v.pop() {
        println!("{}", x);
    }
}
$ cargo run
    Finished debug [unoptimized + debuginfo] target(s) in 0.0 secs
     Running `target/debug/4_21_if_let`
5
5
5
5
11
7
5
3
1
11
7
5
3
1

Osaka HoloLens Meetup vol.1 参加してきました

Osaka HoloLens Meetup vol.1 - connpass」に参加してきました。 ハンズオンと、Meetupの2部構成で、ハンズオンからの参加。

ハンズオンでは、Unity + Visual Studioにて書いたソフトを動かす体験と、HoloLens複数台で場所(?)を共有して動かす体験。 こんな感じにHoloLensで同じアプリケーションを動かすとお互い見える。

MeetupのHoloトークも一つ一つが濃かったです。HoloLensはこれから来ますね。

HoloLensは購入していたものの、特に触れていなかったのでとても有意義な会となりました。