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); }
Closures
https://doc.rust-lang.org/book/closures.html
fn main() { let num = 5; let plus_num = |x: i32| x + num; let num = 6; println!("{}", num); // 6が表示される assert_eq!(10, plus_num(5)); // エラーとならない。 }
plus_num
内のnum
と、main
直下のnum
は別モノ扱いとなる。
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で同じアプリケーションを動かすとお互い見える。
はしもとさん pic.twitter.com/Eq9EPSqZ5G
— 中村 薫 (@kaorun55) 2017年2月4日
MeetupのHoloトークも一つ一つが濃かったです。HoloLensはこれから来ますね。
HoloLensは購入していたものの、特に触れていなかったのでとても有意義な会となりました。