Rustã¯ãè¥ããŠéå¿çãªã·ã¹ãã ããã°ã©ãã³ã°èšèªã§ãã ã¬ããŒãžã³ã¬ã¯ã¿ãŒããã®ä»ã®ã©ã³ã¿ã€ã ãªãŒããŒããããªãã§èªåã¡ã¢ãªç®¡çãå®è£
ããŸãã ããã«ãããã©ã«ãèšèªã¯Rustèšèªã§äœ¿çšãããå¯å€ããŒã¿ã«ã¢ã¯ã»ã¹ããããã®åäŸã®ãªãã«ãŒã«ãããããªã³ã¯ã®æå¹æéãèæ
®ãããŸãã ããã«ãããããŒã¿ã®ç«¶åããªããããã¡ã¢ãªã®ã»ãã¥ãªãã£ãä¿èšŒãããã«ãã¹ã¬ããããã°ã©ãã³ã°ã容æã«ããããšãã§ããŸãã
ããã¯ãã¹ãŠãå°ãªããšãæè¿ã®ããã°ã©ãã³ã°ãã¯ãããžã®éçºã«è¿œéãããã¹ãŠã®äººã«ããç¥ãããŠããŸãã ããããã·ã¹ãã ããã°ã©ããŒã§ã¯ãªãããããžã§ã¯ãã«ãã«ãã¹ã¬ããã³ãŒããããŸããªãå Žåã§ããRustã®ããã©ãŒãã³ã¹ã«é
äºãããŸãã ã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšããããšã§è¿œå ã®å©ç¹ãåŸãããŸããïŒ ãããšãã圌ãããªãã«äžãããã¹ãŠã¯ãã³ã³ãã€ã©ãšã®å³ããæŠãã§ãããããã¯ããªããåžžã«åçšãšæææš©ã«é¢ããèšèªã®èŠåã«åŸãããã«ããã°ã©ã ãæžãããšã匷å¶ããŸããïŒ
ãã®èšäºã§ã¯ãRustã䜿çšããããšã§åŸãããéèªæã§ç¹ã«å®£äŒãããŠããªãå€ãã®å©ç¹ãåéããŸãããããã¯ããããžã§ã¯ãã§ãã®èšèªãéžæããéã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã
1.èšèªã®æ®éæ§
Rustã¯ã·ã¹ãã ããã°ã©ãã³ã°ã®èšèªãšããŠäœçœ®ä»ããããŠãããšããäºå®ã«ãããããããé«åºŠãªå¿çšåé¡ã®è§£æ±ºã«ãé©ããŠããŸãã ã¿ã¹ã¯ã«å¿
èŠãªå Žåãé€ããçã®ãã€ã³ã¿ãŒã䜿çšããå¿
èŠã¯ãããŸããã æšæºèšèªã©ã€ãã©ãªã«ã¯ãã¢ããªã±ãŒã·ã§ã³éçºã«å¿
èŠãªã»ãšãã©ã®ã¿ã€ããšæ©èœããã§ã«å®è£
ãããŠããŸãã å€éšã©ã€ãã©ãªãç°¡åã«æ¥ç¶ããŠäœ¿çšããããšãã§ããŸãã Rustã®åã·ã¹ãã ãšæ±çšããã°ã©ãã³ã°ã§ã¯ãããªãé«ãã¬ãã«ã®æœè±¡åã䜿çšã§ããŸããããã®èšèªã§ã¯OOPãçŽæ¥ãµããŒãããŠããŸããã
Rustã®ç°¡åãªäœ¿çšäŸãèŠãŠã¿ãŸãããã
2ã€ã®ã€ãã¬ãŒã¿ãèŠçŽ ã®ãã¢ã§1ã€ã®ã€ãã¬ãŒã¿ã«çµåããäŸïŒ
let zipper: Vec<_> = (1..).zip("foo".chars()).collect(); assert_eq!((1, 'f'), zipper[0]); assert_eq!((2, 'o'), zipper[1]); assert_eq!((3, 'o'), zipper[2]);
èµ°ã
æ³šïŒ name!(...)
圢åŒã®åŒã³åºãã¯ãæ©èœãã¯ãã®åŒã³åºãã§ãã Rustã®ãã®ãããªãã¯ãã®ååã¯ãåžžã«ã·ã³ãã«ã§çµãããŸã!
é¢æ°åãä»ã®èå¥åãšåºå¥ã§ããããã«ã ãã¯ãã䜿çšããå©ç¹ã«ã€ããŠã¯ã以äžã§èª¬æããŸãã
regex
ãæäœããããã«å€éšregex
ã©ã€ãã©ãªã䜿çšããäŸïŒ
extern crate regex; use regex::Regex; let re = Regex::new(r"^\d{4}-\d{2}-\d{2}$").unwrap(); assert!(re.is_match("2018-12-06"));
èµ°ã
è¿œå æŒç®åããªãŒããŒããŒãããããã®ãã€ãã£ãPoint
æ§é ã®Add
å®è£
äŸïŒ
use std::ops::Add; struct Point { x: i32, y: i32, } impl Add for Point { type Output = Point; fn add(self, other: Point) -> Point { Point { x: self.x + other.x, y: self.y + other.y } } } let p1 = Point { x: 1, y: 0 }; let p2 = Point { x: 2, y: 3 }; let p3 = p1 + p2;
èµ°ã
æ§é äœã§ãžã§ããªãã¯åã䜿çšããäŸïŒ
struct Point<T> { x: T, y: T, } let int_origin = Point { x: 0, y: 0 }; let float_origin = Point { x: 0.0, y: 0.0 };
èµ°ã
Rustã§ã¯ãå¹ççãªã·ã¹ãã ãŠãŒãã£ãªãã£ã倧èŠæš¡ãªãã¹ã¯ãããã¢ããªã±ãŒã·ã§ã³ããã€ã¯ããµãŒãã¹ãWebã¢ããªã±ãŒã·ã§ã³ïŒRustã¯Wasmã§ã³ã³ãã€ã«ã§ãããããã¯ã©ã€ã¢ã³ãéšåãå«ãïŒãã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ïŒèšèªãšã³ã·ã¹ãã ã¯ãŸã ãã®æ¹åã§äžååã«éçºãããŠããŸããïŒãèšè¿°ã§ããŸãã ãã®ãããªæ±çšæ§ã¯ãå€ãã®ç°ãªããããžã§ã¯ãã§åãã¢ãããŒããšåãã¢ãžã¥ãŒã«ã䜿çšã§ããããããã«ããããžã§ã¯ãããŒã ã«ãšã£ãŠå©ç¹ãšãªããŸãã åããŒã«ãç¬èªã®çãã¢ããªã±ãŒã·ã§ã³åéåãã«èšèšãããŠãããšããäºå®ã«æ
£ããŠããå Žåã¯ãåãä¿¡é Œæ§ãšå©äŸ¿æ§ãåããããŒã«ããã¯ã¹ãšããŠRustãæ€èšããŠãã ããã ãããããããã¯ãŸãã«ããªããèŠéããŠãããã®ã§ãã
2.䟿å©ãªãã«ãããã³äŸåé¢ä¿ç®¡çããŒã«
ããã¯æããã«å®£äŒãããŠããŸããããå€ãã®äººã¯ãRustãçŸåšå©çšå¯èœãªæé«ã®ãã«ãããã³äŸåé¢ä¿ç®¡çã·ã¹ãã ã®1ã€ã§ããããšãèªèããŠããŸãã CãŸãã¯C ++ã§ããã°ã©ãã³ã°ããå€éšã©ã€ãã©ãªãç°¡åã«äœ¿çšã§ãããšããåé¡ãéåžžã«æ·±å»ãªå ŽåãRustããã«ãããŒã«ãšCargoäŸåé¢ä¿ãããŒãžã£ãŒãšãšãã«äœ¿çšããããšã¯ãæ°ãããããžã§ã¯ãã«é©ããéžæè¢ã«ãªããŸãã
CargoãäŸåé¢ä¿ãããŠã³ããŒãããããŒãžã§ã³ã管çããã¢ããªã±ãŒã·ã§ã³ããã«ãããã³å®è¡ãããã¹ããå®è¡ããããã¥ã¡ã³ããçæãããšããäºå®ã«å ããŠãä»ã®äŸ¿å©ãªæ©èœã®ãã©ã°ã€ã³ã§æ¡åŒµããããšãã§ããŸãã ããšãã°ãCargoããããžã§ã¯ãã®å»æ¢ãããäŸåé¢ä¿ãå€æãããããœãŒã¹ã³ãŒãã®éçåæãå®è¡ããããWebã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ã€ã¢ã³ãéšåããã«ãããã³åãããã€ãããã§ããæ¡åŒµæ©èœããããŸãã
Cargoæ§æãã¡ã€ã«ã¯ããã¬ã³ããªãŒã§æå°éã®tomlããŒã¯ã¢ããèšèªã䜿çšããŠãããžã§ã¯ãèšå®ãèšè¿°ããŸãã å
žåçãªCargo.toml
æ§æCargo.toml
äŸã次ã«ç€ºãCargo.toml
ã
[package] name = "some_app" version = "0.1.0" authors = ["Your Name <you@example.com>"] [dependencies] regex = "1.0" chrono = "0.4" [dev-dependencies] rand = "*"
以äžã¯ãCargoã䜿çšããããã®3ã€ã®å
žåçãªã³ãã³ãã§ãã
$ cargo check $ cargo test $ cargo run
圌ãã®å©ããåããŠããœãŒã¹ã³ãŒãã®ã³ã³ãã€ã«ãšã©ãŒããããžã§ã¯ãã®ã¢ã»ã³ããªãšãã¹ãã®èµ·åãå®è¡ã®ããã®ããã°ã©ã ã®ã¢ã»ã³ããªãšèµ·åããããããã§ãã¯ããŸãã
3.çµã¿èŸŒã¿ãã¹ã
Rustã§ã®åäœãã¹ãã®èšè¿°ã¯éåžžã«ç°¡åã§åçŽãªã®ã§ãäœåºŠãç¹°ãè¿ããŠãããããšæããŸãã :)å¥ã®æ¹æ³ã§æ©èœããã¹ãããããããåäœãã¹ããæžãæ¹ãç°¡åãªå ŽåããããããŸãã 次ã«ãé¢æ°ãšãããã®ãã¹ãã®äŸã瀺ããŸãã
pub fn is_false(a: bool) -> bool { !a } pub fn add_two(a: i32) -> i32 { a + 2 } #[cfg(test)] mod test { use super::*; #[test] fn is_false_works() { assert!(is_false(false)); assert!(!is_false(true)); } #[test] fn add_two_works() { assert_eq!(1, add_two(-1)); assert_eq!(2, add_two(0)); assert_eq!(4, add_two(2)); } }
èµ°ã
#[test]
å±æ§ã§ããŒã¯ãããtest
ã¢ãžã¥ãŒã«ã®é¢æ°ã¯ãåäœãã¹ãã§ãã ãããã¯ã cargo test
ã³ãã³ããåŒã³åºããããšäžŠè¡ããŠå®è¡ãããŸãã ã¢ãžã¥ãŒã«å
šäœããã¹ãã§ããŒã¯ããæ¡ä»¶ä»ãã³ã³ãã€ã«å±æ§#[cfg(test)]
ã¯ããã¹ãã®å®è¡æã«ã®ã¿ã¢ãžã¥ãŒã«ãã³ã³ãã€ã«ãããéåžžã®ã¢ã»ã³ããªã«ã¯å
¥ããªããšããäºå®ã«ã€ãªãããŸãã
test
ãµãã¢ãžã¥ãŒã«ãè¿œå ããã ãã§ããã¹ã察象ã®æ©èœã¢ãžã¥ãŒã«ãšåãã¢ãžã¥ãŒã«ã«ãã¹ããé
眮ããããšã¯éåžžã«äŸ¿å©ã§ãã çµ±åãã¹ããå¿
èŠãªå Žåã¯ããããžã§ã¯ãã®ã«ãŒãã«ããtests
ãã£ã¬ã¯ããªã«ãã¹ããé
眮ããã¢ããªã±ãŒã·ã§ã³ãå€éšããã±ãŒãžãšããŠäœ¿çšããŸãã ãã®å Žåãåå¥ã®test
ã¢ãžã¥ãŒã«ãšæ¡ä»¶ä»ãã³ã³ãã€ã«ãã£ã¬ã¯ãã£ããè¿œå ããå¿
èŠã¯ãããŸããã
ãã¹ããšããŠå®è¡ãããããã¥ã¡ã³ãã®ç¹å¥ãªäŸã¯ç¹å¥ãªæ³šæã«å€ããŸãããããã«ã€ããŠã¯ä»¥äžã§èª¬æããŸãã
çµã¿èŸŒã¿ã®ããã©ãŒãã³ã¹ãã¹ãïŒãã³ãããŒã¯ïŒã䜿çšã§ããŸããããŸã å®å®ããŠããªããããã³ã³ãã€ã©ãã€ãã¢ã»ã³ããªã§ã®ã¿äœ¿çšã§ããŸãã å®å®ããRustã§ã¯ããã®ã¿ã€ãã®ãã¹ãã«ã¯å€éšã©ã€ãã©ãªã䜿çšããå¿
èŠããããŸãã
4.é©åãªããã¥ã¡ã³ããšé¢é£ããäŸ
æšæºã®Rustã©ã€ãã©ãªã¯éåžžã«ããææžåãããŠããŸãã HTMLããã¥ã¡ã³ãã¯ãããã¯ã®ã³ã¡ã³ãã«ããŒã¯ããŠã³ã®èª¬æãå«ãŸãããœãŒã¹ã³ãŒãããèªåçã«çæãããŸãã ããã«ãRustã³ãŒãã®ããã¥ã¡ã³ãã³ã¡ã³ãã«ã¯ããã¹ãã®å®è¡æã«å®è¡ããããµã³ãã«ã³ãŒããå«ãŸããŠããŸãã ããã«ãããäŸã®é¢é£æ§ãä¿èšŒãããŸãã
ããã¥ã¡ã³ã
String
åã®as_bytes
ã¡ãœããã®äœ¿çšäŸã次ã«ç€ºããŸã
let s = String::from("hello"); assert_eq!(&[104, 101, 108, 108, 111], s.as_bytes());
ãã¹ãã®èµ·åæã«ãã¹ããšããŠå®è¡ãããŸãã
ããã«ããããžã§ã¯ãã®ã«ãŒãã«ããexamples
ãã£ã¬ã¯ããªã«ããå°ããªç¬ç«ããããã°ã©ã ã®åœ¢ã§äœ¿çšäŸãäœæããç¿æ
£ã¯ãRustã©ã€ãã©ãªã§ã¯äžè¬çã§ãã ãããã®äŸãããã¥ã¡ã³ãã®éèŠãªéšåã§ããããã¹ãå®è¡äžã«ã³ã³ãã€ã«ããã³å®è¡ãããŸããããã¹ããšã¯ç¡é¢ä¿ã«å®è¡ã§ããŸãã
5.åã®ã¹ããŒããªèªåæŒduction
Rustããã°ã©ã ã§ã¯ãã³ã³ãã€ã©ã䜿çšç¶æ³ã«åºã¥ããŠèªåçã«åŒãåºåã§ããå ŽåãåŒã®ã¿ã€ããæ瀺çã«æå®ããããšã¯ã§ããŸããã ãããŠãããã¯å€æ°ã宣èšãããŠããå Žæã ãã«åœãŠã¯ãŸããŸããã äŸãèŠãŠã¿ãŸãããïŒ
let mut vec = Vec::new(); let text = "Message"; vec.push(text);
èµ°ã
å泚éãé
眮ãããšããã®äŸã¯æ¬¡ã®ããã«ãªããŸãã
let mut vec: Vec<&str> = Vec::new(); let text: &str = "Message"; vec.push(text);
ã€ãŸããæååã¹ã©ã€ã¹ã®ãã¯ãã«ãšæååã¹ã©ã€ã¹åã®å€æ°ããããŸãã ãã ãããã®å Žåãã³ã³ãã€ã©ãŒã¯ïŒ Hindley-Milnerã¢ã«ãŽãªãºã ã®æ¡åŒµããŒãžã§ã³ã䜿çšããŠïŒåç¬ã§åãåºåã§ãããããåã®æå®ã¯å®å
šã«åé·ã§ãã vec
ããã¯ãã«ã§ãããšããäºå®ã¯ã Vec::new()
ããã®æ»ãå€ã®åã«ãã£ãŠæ¢ã«æ確ã«ãªã£ãŠããŸããããã®èŠçŽ ã®åãã©ããªããã¯ãŸã æ確ã§ã¯ãããŸããã ã¿ã€ãtext
ãæååã¹ã©ã€ã¹ã§ãããšããäºå®ã¯ããã®ã¿ã€ãã®ãªãã©ã«ãå²ãåœãŠãããŠãããšããäºå®ã«ãã£ãŠç解ã§ããŸãã ãããã£ãŠã vec.push(text)
åŸããã¯ãã«ã®èŠçŽ ã®ã¿ã€ããæããã«ãªããŸãã vec
å€æ°ã®ã¿ã€ãã¯ãåæå段éã§ã¯ãªããå®è¡ã¹ã¬ããã§ã®äœ¿çšã«ãã£ãŠå®å
šã«æ±ºå®ãããããšã«æ³šæããŠãã ããã
ãã®ãããªèªååæšè«ã·ã¹ãã ã¯ãã³ãŒããããã€ãºãé€å»ããåçã«åæå®ãããããã°ã©ãã³ã°èšèªã®ã³ãŒããšåããããç°¡æœã«ããŸãã ãããŠãããã¯å³å¯ãªéçåä»ããç¶æããªããïŒ
ãã¡ãããéçã«åä»ããããèšèªã§ã®åä»ããå®å
šã«ãªããããšã¯ã§ããŸããã ããã°ã©ã ã«ã¯ãä»ã®å Žæã§ãããã®ã¿ã€ãã衚瀺ã§ããããã«ããªããžã§ã¯ãã®ã¿ã€ããæ¢ç¥ã§ããããšãä¿èšŒãããŠãããã€ã³ããå¿
èŠã§ãã Rustã®ãã®ãããªãã€ã³ãã¯ããŠãŒã¶ãŒå®çŸ©ã®ããŒã¿åãšé¢æ°ã·ã°ããã£ã®å®£èšã§ããããã§ã¯ã䜿çšããåãæå®ãããããããŸããã ãã ããäžè¬åããã°ã©ãã³ã°ã䜿çšããŠããã¿ã€ãã®ã¡ã¿å€æ°ããå
¥åã§ããŸãã
6.å€æ°å®£èšãã€ã³ãã§ã®ãã¿ãŒã³ãããã³ã°
let
let p = Point::new();
æ¬åœã«æ°ããå€æ°ã宣èšããã ãã«ãšã©ãŸããŸããã 圌女ãå®éã«è¡ãã®ã¯ãçå·ã®å³åŽã®è¡šçŸãå·ŠåŽã®ãã¿ãŒã³ãšäžèŽãããããšã§ãã ãŸãããµã³ãã«ã®äžéšãšããŠæ°ããå€æ°ãå°å
¥ã§ããŸãïŒãã®å Žåã®ã¿ïŒã 次ã®äŸãèŠãŠãã ããããããŠããã¯ããªãã«æããã«ãªããŸãïŒ
let Point { x, y } = Point::new();
èµ°ã
ãã®ãããªæ¯èŒã§ã¯ãå€æ°x
ãšy
ãå°å
¥ããã Point::new()
åŒã³åºããŠè¿ãããPoint
æ§é äœã®ãªããžã§ã¯ãã®ãã£ãŒã«ãx
ãšy
å€ã§åæåãããŸãã ãã®å Žåãå³åŽã®åŒã®ã¿ã€ãã¯å·ŠåŽã®ã¿ã€ãPoint
ãã¿ãŒã³ã«å¯Ÿå¿ãããããæ¯èŒã¯æ£ããã§ãã åæ§ã®æ¹æ³ã§ãããšãã°é
åã®æåã®2ã€ã®èŠçŽ ãååŸã§ããŸãã
let [a, b, _] = [1, 2, 3];
ãããŠãããã«å€ãã®ããšãè¡ããŸãã æã泚ç®ãã¹ãããšã¯ããã®ãããªæ¯èŒã¯ãRustã§æ°ããå€æ°åãå
¥åã§ãããã¹ãŠã®å Žæã§å®è¡ãããããšã§ããã€ãŸãã match
ã let
ã if let
ã while let
if let
ã for
ã«ãŒãã®ããããŒãé¢æ°ãšã¯ããŒãžã£ãŒã®åŒæ°ã§ãã for
ã«ãŒãã§ãã¿ãŒã³ãããã³ã°ããšã¬ã¬ã³ãã«äœ¿çšããäŸã次ã«ç€ºããŸãã
for (i, ch) in "foo".chars().enumerate() { println!("Index: {}, char: {}", i, ch); }
èµ°ã
ã€ãã¬ãŒã¿ã§åŒã³åºãããenumerate
ã¡ãœããã¯ãæ°ããã€ãã¬ãŒã¿ãäœæããŸããã€ãã¬ãŒã¿ã¯ãåæå€ã§ã¯ãªããã¿ãã«ããé åºã€ã³ããã¯ã¹ãåæå€ãã®ãã¢ãå埩åŠçããŸãã ãµã€ã¯ã«ã®å埩äžã®ãããã®åã¿ãã«ã¯ãæå®ããããã¿ãŒã³(i, ch)
ã«ãããã³ã°ãããŸãããã®çµæãå€æ°i
ã¯ã¿ãã«ããæåã®å€ïŒã€ã³ããã¯ã¹ïŒãåãåããå€æ°ch
ã¯2çªç®ïŒæååã®æåïŒãåãåããŸãã ããã«ã«ãŒãã®æ¬äœã§ã¯ããããã®å€æ°ã䜿çšã§ããŸãã
for
ã«ãŒãã§ãã¿ãŒã³ã䜿çšããå¥ã®äžè¬çãªäŸïŒ
for _ in 0..5 {
ããã§ã¯ã _
ãã¿ãŒã³ã䜿çšããŠã€ãã¬ãŒã¿å€ãç¡èŠããŸãã ã«ãŒãã®æ¬äœã§ã¯å埩çªå·ã䜿çšããªãããã§ãã ããšãã°ãé¢æ°ã®åŒæ°ã䜿çšããŠãåãããšãã§ããŸãã
fn foo(a: i32, _: bool) {
ãŸãã¯ãäžèŽã¹ããŒãã¡ã³ãã§äžèŽããå ŽåïŒ
match p { Point { x: 1, .. } => println!("Point with x == 1 detected"), Point { y: 2, .. } => println!("Point with x != 1 and y == 2 detected"), _ => (),
èµ°ã
ãã¿ãŒã³ãããã³ã°ã«ãããã³ãŒãã¯éåžžã«ã³ã³ãã¯ãã§è¡šçŸåè±ãã«ãªããŸãããŸãã match
ã¹ããŒãã¡ã³ãã§ã¯ãéåžžã眮ãæããããŸããã match
æŒç®åã¯å®å
šãªå€ååæã®æŒç®åã§ãããã®ãããåæãããåŒã®å¯èœãªäžèŽã®ããã€ãã誀ã£ãŠãã§ãã¯ããããšãå¿ããããšã¯ãããŸããã
7.æ§ææ¡åŒµãšã«ã¹ã¿ã DSL
äž»ã«èšèªã§äœ¿çšãããåã·ã¹ãã ã®è€éãã®ããã«ãéã®æ§æã¯å¶éãããŠããŸãã ããšãã°ãRustã«ã¯ååä»ãé¢æ°ã®åŒæ°ããå¯å€æ°ã®åŒæ°ãæã€é¢æ°ã¯ãããŸããã ãããããã¯ãã䜿çšããŠãããã®å¶éããã®ä»ã®å¶éãåé¿ã§ããŸãã Rustã«ã¯ã宣èšåãšæç¶ãåã®2çš®é¡ã®ãã¯ãããããŸãã 宣èšåãã¯ãã䜿çšãããšãCã®ãã¯ããšåãåé¡ãçºçããããšã¯ãããŸããããã¯ãã¯è¡ççã§ãããã¹ã眮æã®ã¬ãã«ã§ã¯æ©èœãããæœè±¡çãªæ§æããªãŒã®çœ®æã®ã¬ãã«ã§æ©èœããããã§ãã ãã¯ãã䜿çšãããšãèšèªæ§æã¬ãã«ã§æœè±¡åãäœæã§ããŸãã äŸïŒ
println!("Hello, {name}! Do you know about {}?", 42, name = "User");
ãã®ãã¯ãã¯ãæžåŒèšå®ãããæååãå°å·ãããé¢æ°ããåŒã³åºãæ§ææ©èœãæ¡åŒµãããšããäºå®ã«å ããŠããã®å®è£
ã§ã¯ãå®è¡æã§ã¯ãªãã³ã³ãã€ã«æã«å
¥ååŒæ°ãæå®ãããæžåŒæååãšäžèŽãããã©ããã確èªããŸãã ãã¯ãã䜿çšãããšãç¬èªã®èšèšããŒãºã«åãããŠç°¡æœãªæ§æãå
¥åããDSLãäœæããŠäœ¿çšã§ããŸãã Wasmã§ã³ã³ãã€ã«ããRustããã°ã©ã å
ã§JavaScriptã³ãŒãã䜿çšããäŸã次ã«ç€ºããŸãã
let name = "Bob"; let result = js! { var msg = "Hello from JS, " + @{name} + "!"; console.log(msg); alert(msg); return 2 + 2; }; println!("2 + 2 = {:?}", result);
ãã¯ãjs!
stdweb
ããã±ãŒãžã§å®çŸ©ãããŠãããããããã°ã©ã ã«æ¬æ ŒçãªJavaScriptã³ãŒããåã蟌ã¿ïŒåäžåŒçšç¬Šã§å²ãŸããæååãšã»ãã³ãã³ã§å®äºããŠããªãæŒç®åãé€ãïŒãæ§æ@{expr}
ã䜿çšããŠRustã³ãŒãã®ãªããžã§ã¯ãã䜿çšã§ããŸãã
ãã¯ãã¯ãRustããã°ã©ã ã®æ§æãç¹å®ã®ãµããžã§ã¯ãé åã®ç¹å®ã®ã¿ã¹ã¯ã«é©å¿ããã絶奜ã®æ©äŒãæäŸããŸãã è€éãªã¢ããªã±ãŒã·ã§ã³ãéçºããéã«æéãšæ³šæãç¯çŽã§ããŸãã ã©ã³ã¿ã€ã ã®ãªãŒããŒããããå¢ããã®ã§ã¯ãªããã³ã³ãã€ã«æéãå¢ãããŸãã :)
8.äŸåã³ãŒãã®èªåçæ
Rustã®æç¶ãå掟çãã¯ãã¯ãç¹æ§ããã®ä»ã®ã³ãŒãçæãèªåçã«å®è£
ããããã«åºã䜿çšãããŠããŸãã 以äžã«äŸã瀺ããŸãã
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq)] struct Point { x: i32, y: i32, }
æšæºã©ã€ãã©ãªã®ããããã¹ãŠã®ç¹æ§ïŒ Copy
ã Clone
ã Debug
ã Default
ã PartialEq
ããã³Eq
ïŒã¯i32
æ§é äœã®ãã£ãŒã«ãã¿ã€ãã«å¯ŸããŠå®è£
ãããŠããããããããã®å®è£
ã¯æ§é äœå
šäœã«å¯ŸããŠèªåçã«è¡šç€ºã§ããŸãã å¥ã®äŸïŒ
extern crate serde_derive; extern crate serde_json; use serde_derive::{Serialize, Deserialize}; #[derive(Serialize, Deserialize)] struct Point { x: i32, y: i32, } let point = Point { x: 1, y: 2 };
èµ°ã
ããã§ã¯ã Point
æ§é ã®serde
ã©ã€ãã©ãªã®serde
Deserialize
ãšDeserialize
ããŠããã®ã·ãªã¢ã«åãšéã·ãªã¢ã«åã®ã¡ãœãããèªåçã«çæãããŸãã 次ã«ããã®æ§é ã®ã€ã³ã¹ã¿ã³ã¹ãããŸããŸãªã·ãªã¢ã«åé¢æ°ã«æž¡ããŸããããšãã°ãJSONæååã«å€æããŸãã
å¿
èŠãªã³ãŒããçæããç¬èªã®æç¶ããã¯ããäœæã§ããŸãã ãŸãã¯ãä»ã®éçºè
ãäœæããå€ãã®ãã¯ãã䜿çšããŸãã ãã¯ãã«ã¯ãããã°ã©ããŒãå®åçãªã³ãŒããèšè¿°ããªãããã«ããã ãã§ãªããã³ãŒãã®ç°ãªãã»ã¯ã·ã§ã³ãäžè²«ããç¶æ
ã«ç¶æããå¿
èŠããªããšããå©ç¹ããããŸãã ããšãã°ã3çªç®ã®ãã£ãŒã«ãz
ãPoint
æ§é ã«è¿œå ãããå Žåããã®æ£ããã·ãªã¢ã«åãè¡ãããã«æŽŸçã䜿çšããå Žåãä»ã«äœãããå¿
èŠã¯ãããŸããã Point
ã®ã·ãªã¢ã«åã«å¿
èŠãªç¹æ§ãå®è£
ããå Žåããã®å®è£
ãPoint
ã®æ§é ã®ææ°ã®å€æŽãšåžžã«äžè²«ããŠããããšã確èªããå¿
èŠããããŸãã
9.代æ°ããŒã¿å
ç°¡åã«èšãã°ã代æ°ããŒã¿åã¯è€åããŒã¿åã§ãããæ§é äœã®çµåã§ãã ããæ£åŒã«ã¯ã補åã¿ã€ãã®ã¿ã€ããµã ã§ãã Rustã§ã¯ããã®ã¿ã€ãã¯enum
ããŒã¯ãŒãã䜿çšããŠå®çŸ©ãããŸãïŒ
enum Message { Quit, ChangeColor(i32, i32, i32), Move { x: i32, y: i32 }, Write(String), }
ã¿ã€ãMessage
å€æ°ã®ç¹å®ã®å€ã®ã¿ã€ãã¯ã Message
ãªã¹ããããŠããæ§é ã¿ã€ãã®ãã¡ã®1ã€ã®ã¿ã§ãã ããã¯ããŠãããã®ãããªãã£ãŒã«ãã¬ã¹Quit
æ§é ã ChangeColor
ãŸãã¯Writelessã¿ãã«æ§é ã®ãããããååã®ãªããã£ãŒã«ãããŸãã¯éåžžã®Move
æ§é ã®ããããã§ãã åŸæ¥ã®åæåã¯ã代æ°ããŒã¿åã®ç¹æ®ãªã±ãŒã¹ãšããŠè¡šãããšãã§ããŸãã
enum Color { Red, Green, Blue, White, Black, Unknown, }
ãã¿ãŒã³ãããã³ã°ã䜿çšããŠãç¹å®ã®ã±ãŒã¹ã§å®éã«ã©ã®ã¿ã€ããå€ãååŸãããã調ã¹ãããšãã§ããŸãã
let color: Color = get_color(); let text = match color { Color::Red => "Red", Color::Green => "Green", Color::Blue => "Blue", _ => "Other color", }; println!("{}", text); ... fn process_message(msg: Message) { match msg { Message::Quit => quit(), Message::ChangeColor(r, g, b) => change_color(r, g, b), Message::Move { x, y } => move_cursor(x, y), Message::Write(s) => println!("{}", s), }; }
èµ°ã
代æ°çãªããŒã¿åã®åœ¢åŒã§ãRustã¯Option
ãResult
ãªã©ã®éèŠãªåãå®è£
ããŸãããããã¯ããããæ¬ æå€ãšæ£ãã/誀ã£ãçµæãè¡šãããã«äœ¿çšãããŸãã æšæºã©ã€ãã©ãªã§Option
ãå®çŸ©ããæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
pub enum Option<T> { None, Some(T), }
Rustã«ã¯ãäºæããªãåŒã³åºãã«ããè¿·æãªãšã©ãŒã®ããã«ãnullå€ããããŸããã 代ããã«ãæ¬ æå€ã®å¯èœæ§ã瀺ãããšãæ¬åœã«å¿
èŠãªå Žåã Option
䜿çšãããŸãã
fn divide(numerator: f64, denominator: f64) -> Option<f64> { if denominator == 0.0 { None } else { Some(numerator / denominator) } } let result = divide(2.0, 3.0); match result { Some(x) => println!("Result: {}", x), None => println!("Cannot divide by 0"), }
èµ°ã
代æ°ããŒã¿åã¯ãåé§åéçºãžã®æãéã匷åã§è¡šçŸåè±ããªããŒã«ã§ãã ãã®ãã©ãã€ã ã§æèœã«æžãããããã°ã©ã ã¯ããã®äœæ¥ã®æ£ç¢ºæ§ã®ãã§ãã¯ã®ã»ãšãã©ãåã·ã¹ãã ã«å²ãåœãŠãŸãã ãããã£ãŠãæ¥åžžã®ç£æ¥çšããã°ã©ãã³ã°ã§Haskellãå°ãäžè¶³ããŠããå Žåã¯ãRustã䜿çšã§ããŸãã :)
10.ç°¡åãªãªãã¡ã¯ã¿ãªã³ã°
Rustã§éçºãããå³å¯ãªéçåã·ã¹ãã ãšãã³ã³ãã€ã«äžã«ã§ããã ãå€ãã®ãã§ãã¯ãå®è¡ããããšãããšãã³ãŒãã®å€æŽãšãªãã¡ã¯ã¿ãªã³ã°ãéåžžã«ç°¡åã§å®å
šã«ãªããŸãã å€æŽåŸã«ããã°ã©ã ãã³ã³ãã€ã«ãããå Žåãããã¯ãæ€èšŒãã³ã³ãã€ã©ã«å²ãåœãŠãããæ©èœã«é¢é£ããªãè«çãšã©ãŒã®ã¿ãå«ãŸããŠããããšãæå³ããŸãã åäœãã¹ãããã¹ãããžãã¯ã«ç°¡åã«è¿œå ã§ãããããããã°ã©ã ã®ä¿¡é Œæ§ã倧å¹
ã«ä¿èšŒãããå€æŽåŸã®ã³ãŒãã®æ£ããåäœã«å¯Ÿããããã°ã©ãã®ä¿¡é Œæ§ãåäžããŸãã
ããããããã®èšäºã§èª¬æãããã£ãã®ã¯ããã ãã§ãã ãã¡ãããRustã«ã¯ä»ã®å€ãã®å©ç¹ãšãããã€ãã®æ¬ ç¹ïŒèšèªã®å€å°ã®æ¹¿æ°ã䜿ãæ
£ããããã°ã©ãã³ã°ã€ãã£ãªã ã®æ¬ åŠãããã³ãéæåŠçãªãæ§æïŒããããŸãã ãããã«ã€ããŠäœãäŒãããããšãããã°ãã³ã¡ã³ãã«æžããŠãã ããã äžè¬çã«ãRustãå®éã«è©ŠããŠãã ããã ãããŠãç§ã®å Žåã«èµ·ãã£ãããã«ãããªãã«ãšã£ãŠã®åœŒã®å©ç¹ã¯åœŒã®ãã¹ãŠã®æ¬ ç¹ãäžåããããããŸããã ãããŠæåŸã«ãé·ãéå¿
èŠãªäžé£ã®ããŒã«ãæ£ç¢ºã«å
¥æã§ããŸãã