æ°åœãŠã²ãŒã
Rustãããžã§ã¯ãå ¬åŒã®å ¥éæžãThe Rust Programming Language - The Rust Programming Languageãã§ã¯ããŸããæ°åœãŠã²ãŒã ãã®ãµã³ãã«ãœãŒã¹ã³ãŒãã説æãã圢ã§ããã°ã©ãã³ã°èšèªãRustãã®èª¬æãè¡ã£ãŠãããæ°åœãŠã²ãŒã ã¯ããã°ã©ãã³ã°ã®å°å ¥ã§ãã䜿ãããããã°ã©ã ã®1ã€ã ã
æ°åœãŠã²ãŒã ã§ã¯ãããã°ã©ã ã¯ã©ã³ãã ã«ããæ°åãçæããããŠãŒã¶ãŒããã®æ°åãåœãŠããšããã²ãŒã ã ããŠãŒã¶ãŒã¯ãŸãåœãŠãã£ãœãã«æ°ãæå®ãããããã°ã©ã ã¯ãã®æ°ããçæããæ°ãšåããããã®æ°ããã倧ãããããã®æ°ãããå°ããããåºåããããŠãŒã¶ãŒã¯ãã®çµæãèŠãŠãæ¬¡ã®æ°ãé©åœã«å ¥åãããç¹°ãè¿ããŠããã°ã©ãã©ãç¯å²ãçããŠãã£ãŠãããã°ã©ã ãçæããæ°ãç¹å®ããããšãã§ãããšããä»çµã¿ã«ãªã£ãŠããã
ãã®ããã°ã©ã ã¯çããå ããŠæ¬¡ã®ãããªèŠçŽ ãå«ãã§ããã
- åå²åŠç
- ç¹°ãè¿ãåŠç
- ãŠãŒã¶ãŒããå ¥åãåãä»ããåŠç
- ãŠãŒã¶ãŒã«ã¡ãã»ãŒãžãåºåããåŠç
çããµã³ãã«ã³ãŒãã§ããäžãããã°ã©ãã³ã°ããäžã§åºæ¬ãšãªãããŸããŸãªèŠçŽ ãå«ãã§ãããããã°ã©ãã³ã°å ¥éæã®ææãšããŠã¯éœåãããã®ã ãã¶ã»ããã¯ãæ°åœãŠã²ãŒã ããµã³ãã«ã«åãäžããŠãããããã§ããã®æµãã§RustãåŠç¿ããŠããããšæãã
ä»åã¯ãã¶ã»ããã¯ã«æ²èŒãããŠãããµã³ãã«ã³ãŒãããæåã«çè§£ããŠããããéšåãããã€ãŸãã§èª¬æãããã¶ã»ããã¯ã§ã¯ãã©ã€ãã©ãªãæšæºã©ã€ãã©ãªã倿°ãåã颿°ãã³ã¡ã³ãããããŒå¶åŸ¡ããªãŒããŒã·ãããåç §ãšåçšãªã©ãRustã®ç¹åŸŽçãªæ©èœã¯æ°åœãŠã²ãŒã ã®ããšã«è©³ãã説æããŠããã®ã§ãä»åã¯æŠèŠçšåºŠã«ãšã©ããŠããã
ãµã³ãã«ã³ãŒããšãã«ãïŒå®è¡
ãŸããµã³ãã«ã³ãŒããçšæããŠå®è¡ããŠã¿ããããŸããæ¬¡ã®ããã«ããŠæ°åœãŠã²ãŒã ïŒguessing_gameïŒã®ãœãŒã¹ã³ãŒããçšæããã
æ°åœãŠã²ãŒã ã®ã»ããã¢ãã
cargo new guessing_game
main.rsã®äžèº«ã次ã®ãããªãœãŒã¹ã³ãŒãã«ãããã¶ã»ããã¯ã«æ²èŒãããŠãããœãŒã¹ã³ãŒãã®ã¡ãã»ãŒãžã ããæ¥æ¬èªã«çœ®ãæãããã®ã ã
main.rs
use std::io;
fn main() {
println!("æ°åœãŠã²ãŒã ");
println!("ã©ã®æ°ã ãšãããïŒ = ");
let mut guess = String::new();
io::stdin()
.read_line(&mut guess)
.expect("èªã¿èŸŒã¿å€±æ");
println!("å
¥åå€: {}", guess);
}
次ã®ããã«ãã«ãããã
ãã«ã
cargo build
å®è¡ãããšæ¬¡ã®ããã«ãªããããã§ã¯ãŠãŒã¶ã¯50ãšããæ°åãå ¥åããŠããã
å®è¡
% cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.00s
Running `target/debug/guessing_game`
æ°åœãŠã²ãŒã
ã©ã®æ°ã ãšãããïŒ =
50
å
¥åå€: 50
%
ã¶ã»ããã¯ã«æåã«æ²èŒãããŠãããµã³ãã«ã³ãŒãã¯æ°åœãŠã²ãŒã ã®éäžãŸã§ããå®è£ ããŠããªããããããããã ãã§ãRustã®å€ãã®ããšãèªã£ãŠãããRustã¯æãããããããã°ã©ãã³ã°èšèªã ããæ±ºããŠç°¡åãªããã°ã©ãã³ã°èšèªã§ã¯ãªãã®ã ããã®ãµã³ãã«ã ãã§å€ãã®æŠå¿µãçè§£ããå¿ èŠãããã
æšæºã©ã€ãã©ãª
ãœãŒã¹ã³ãŒãã®èªã¿åºããšããŠã¯ããŸãRustã®æšæºã©ã€ãã©ãªãšãã®äœ¿ãæ¹ãçè§£ããå¿ èŠããããšæããæšæºã©ã€ãã©ãªã¯ããã°ã©ãã³ã°èšèªãšããŠåºæ¬çãªå®è£ ããŸãšãããã®ã該åœããããšãå€ããRustã§ã¯æãåºæ¬ãšãªãåããã®ãæšæºã©ã€ãã©ãªãã«ãŸãšããããŠããããªãããã®æšæºã©ã€ãã©ãªãšãããã®ã¯ããã©ã«ãã§äœ¿ããã®ããšããã°ãããã©ã«ãã§ã¯ãã®äžéšãã䜿ããªãïŒäœ¿ããªããšãããã¹ã³ãŒãã«å ¥ã£ãŠããªããšãããïŒã
Rustã§æšæºã©ã€ãã©ãªã¯stdãšããŠè¡šçŸããããæšæºã©ã€ãã©ãªã¯å¿ èŠæ§ã®é«ãåããŸãšãŸã£ãŠãããããã®ãã¹ãŠãå¿ èŠãšããããšã¯ãªããRustã¯ããã©ã«ãã§äœ¿çšããåã¯å¿ èŠæå°éã§ããã¹ããšèããŠãããå¯èœãªéãå°ããããŠããããã®å¿ èŠæå°éãªåã¯æšæºã©ã€ãã©ãªã«å«ããããŠããpreludeãšåŒã°ããã©ã€ãã©ãªã«ãŸãšããããŠãããæ¬çš¿å·çæç¹ã§ã¯ãstd::prelude::v1::*ããããã«è©²åœããã
Rustã§ã¯useã¹ããŒãã¡ãŒã³ãšã§ã©ã€ãã©ãªãã¹ã³ãŒãã«è¿œå ããïŒå¿ é ã§ã¯ãªãã®ã ããã©ã€ãã©ãªã䜿ãæã¯useã§äœ¿ãã©ã€ãã©ãªãæå®ãããšèããŠããã°ãããšæããããã䜿ããªããšã³ãŒããåé·ã«ãªããããŠèŠã«ãããªãïŒãã€ãŸããæ¬¡ã®useã¹ããŒãã¡ã³ããRustã«ãã£ãŠèªåçã«æ¿å ¥ãããŠãããšèããŠããã°ããã
useã¹ããŒãã¡ã³ãããã䜿ã£ãŠããã®ãšåã
use std::prelude::v1::*;
std::prelude::v1::*ã«ã¯æ¬¡ã®ãããªåãå«ããããŠãããããã«èšèŒãããŠããåã¯ããã©ã«ãã§äœ¿çšã§ãããšããããšã ã
std::prelude::v1ã§ãšã¯ã¹ããŒããããŠããå
pub use crate::marker::Send;
pub use crate::marker::Sized;
pub use crate::marker::Sync;
pub use crate::marker::Unpin;
pub use crate::ops::Drop;
pub use crate::ops::Fn;
pub use crate::ops::FnMut;
pub use crate::ops::FnOnce;
pub use crate::mem::drop;
pub use crate::convert::AsMut;
pub use crate::convert::AsRef;
pub use crate::convert::From;
pub use crate::convert::Into;
pub use crate::iter::DoubleEndedIterator;
pub use crate::iter::ExactSizeIterator;
pub use crate::iter::Extend;
pub use crate::iter::IntoIterator;
pub use crate::iter::Iterator;
pub use crate::option::Option;
pub use crate::option::Option::None;
pub use crate::option::Option::Some;
pub use crate::result::Result;
pub use crate::result::Result::Err;
pub use crate::result::Result::Ok;
pub use core::prelude::v1::asm;
pub use core::prelude::v1::assert;
pub use core::prelude::v1::cfg;
pub use core::prelude::v1::column;
pub use core::prelude::v1::compile_error;
pub use core::prelude::v1::concat;
pub use core::prelude::v1::concat_idents;
pub use core::prelude::v1::env;
pub use core::prelude::v1::file;
pub use core::prelude::v1::format_args;
pub use core::prelude::v1::format_args_nl;
pub use core::prelude::v1::global_asm;
pub use core::prelude::v1::include;
pub use core::prelude::v1::include_bytes;
pub use core::prelude::v1::include_str;
pub use core::prelude::v1::line;
pub use core::prelude::v1::llvm_asm;
pub use core::prelude::v1::log_syntax;
pub use core::prelude::v1::module_path;
pub use core::prelude::v1::option_env;
pub use core::prelude::v1::stringify;
pub use core::prelude::v1::trace_macros;
pub use crate::borrow::ToOwned;
pub use crate::boxed::Box;
pub use crate::string::String;
pub use crate::string::ToString;
pub use crate::vec::Vec;
æ°åœãŠã²ãŒã ã¯ãŠãŒã¶ãŒããæ°ã®å ¥åãããŠããããã®å€ãåŸãå¿ èŠããããããã«ãŠãŒã¶ãŒã«ã¡ãã»ãŒãžãèªãã§ãããå¿ èŠãããããã®ãããªæ©èœã¯å ¥åºåã©ã€ãã©ãªïŒioã©ã€ãã©ãªïŒã«ãŸãšããããŠãããæå®æ¹æ³ã¯æ¬¡ã®ããã«ãªãïŒå ¥åºåã©ã€ãã©ãªã¯æšæºã©ã€ãã©ãªã«å«ããããŠããã®ã§std::ioã§ã¢ã¯ã»ã¹ããïŒã
å ¥åºåã©ã€ãã©ãªãã¹ã³ãŒãã«è¿œå
use std::io;
useã¹ããŒãã¡ã³ãã¯ãæå®ãããã¹ãããŒã«ã«ã®ååãšããŠäœ¿ããããã«ããæ©èœãæ ã£ãŠãããéåžžãå©çšããã©ã€ãã©ãªã¯useã§å®£èšããŠäœ¿ããuseã§ã©ã€ãã©ãªã宣èšããªããŠã䜿ããã®ã ããã³ãŒããé·ããªã£ãŠèŠã«ããã®ã§éåžžã¯useã䜿ãã
Rustã§äœ¿ãããŠããuseãšããã¹ããŒãã¡ã³ãã¯ãPerlãPHPãFortranãªããã§ãåãååã§äŒŒããããªçšéã§äœ¿ãããŠããããããèšèªã«æ £ããŠããæ¹ã¯useã®æå³ãäœæãšããŠããããããããªããã»ãã®ããã°ã©ãã³ã°èšèªã§ã䌌ããããªæ©èœããããã䜿ãããŠããèšèãimportãusingãincludeã ã£ããããããŸããäžèŠäŒŒãŠãããæŠå¿µãåäœãçµæ§éã£ãŠããçšèªãããã®ã§ããŸã£ããåããã®ãšèããŠãããšæ··ä¹±ãããããããªããä»ã¯ã䌌ããããªæ©èœãããããããã«èããŠããã°ãããšæãã
倿°
Rustã§ã¯æ¬¡ã®ããã«letã¹ããŒãã¡ã³ãã§å€æ°ã宣èšããã
letã¹ããŒãã¡ã³ãã§å€æ°ã宣èš
let 倿°å = å€;
Rustã®å€æ°ã¯ç¹åŸŽçã ãæåãã¡ã¢ãªã»ãŒãã«æ¯ããšããRustã®èšèšææ³ãããçŸããŠãããRustã§ã¯å€æ°ã¯äžå€ãªã®ã§ãããäžèšã®ããã«å®£èšãã倿°ã¯åŸãã倿Žããããšãã§ããªããã»ãã®ããã°ã©ãã³ã°èšèªã§ã¯ã倿°ã¯åºæ¬çã«ã¯å¯å€ã§ããããšãå€ããããšãã倿Žå¯èœã ã倿ŽãããŠã¯å°ããã®ã¯å®£èšæã«ãããŠãäžå€ãã ãšæå®ããããããRustã®å Žåã¯ããã©ã«ããšäžå€ã«ãªã£ãŠããã
Rustã§ã¯æ¬¡ã®ããã«let mutã§å€æ°ã宣èšãããšãå¯å€ã«ãªããmutãšããã®ã¯mutable(å¯å€)ãšããåèªã®é 3æåã ã倿Žå¯èœãªå€æ°ãäœãããšæã£ããããã®ããã«mutãã€ããªããšãããªãã
let mutã§å¯å€ãªå€æ°ã宣èš
let mut 倿°å = å€;
Rustã¯äžäºãäžäºãã®èšèšææ³ã«ãªã£ãŠãããšããããåé¡ãšãªããããæåã¯ããã©ã«ãã§æé€ãããŠãããèšèšææ³ã®æ ¹åºã«ãããã®ããªãããç¥ã£ãŠãããªããšãã³ãŒãã£ã³ã°ããŠããŠããªãã€ã©ã€ããšæãããããªç°¡åãªããšãããã®ã«ãªããããããããªé¢åãããæžãæ¹ãããªããã°ãããªãã®ãããšãããããçµå±ããã«èº«ãæãããããšã«ãªãã®ã§ãæåŸã«ã¯Rustã奜ãã«ãªã£ãŠããŸãã
åã«é¢é£ä»ãããã颿°
æ°åœãŠã²ãŒã ã§ã¯ã次ã®ããã«guessãšãã倿°ãäœæãããŠããã
æ°åœãŠã²ãŒã ã®å€æ°
let mut guess = String::new();
å çšã®èª¬æãããããããã«ãguessã¯å¯å€ãªå€æ°ã ããããŠãStringãšããåã®å€æ°ã§ããããšãããããstd::prelude::v1::*ã«ã¯æ¬¡ã®ããã«Stringãå«ãŸããŠããããã®åã䜿ã£ãŠããããšã«ãªãã
Stringã¯std::prelude::v1::*ã«å«ãŸããŠããããã©ã«ãã§äœ¿çšå¯èœ
pub use crate::string::String;
ããã§ã¯æ¬¡ã®èšè¿°ã«ã泚ç®ããå¿ èŠãããã
åã«é¢é£ä»ãããã颿°new()ãåŒãã§ãã
String::new()
ãã®èšè¿°ã¯Stringã«é¢é£ä»ããããŠããnew()ãšãã颿°ãåŒã¶ãšããåŠçã«ãªã£ãŠãããStringã¯åŸããæåãå¢ããããšãã§ããUTF-8ãšã³ã³ãŒãã®æååã衚ããŠãããnew()ãåŒã³åºããšç©ºã®æååãçæããŠè¿ããŠããããnew()ãšãã颿°ã¯ã»ãã®åã§ãåããããªçšéã§å®è£ ãããŠããããšãå€ãã
ãã®String::new()ã¯ãªããžã§ã¯ãæåã®ããã°ã©ãã³ã°èšèªã§ã¯ã¹ã¿ãã£ãã¯ã¡ãœãããšåŒã°ãããã®ã«è¿ããããã°ã©ãã³ã°èšèªã«ãã£ãŠã¯ã¯ã©ã¹ã¡ãœãããšåŒã°ãããã®ãè¿ãã
ã¶ã»ããã¯ã®èª¬æã ãã§ã¯å®æ ãæ³åã§ããªãããšãå€ããšæãã®ã ãããããªæã¯ãœãŒã¹ã³ãŒããçŽæ¥èªãã§ããŸããšãããäŸãã°ãStringã®å®è£ ã¯rust/src/liballoc/string.rsã ããã®ãã¡ã€ã«ã®äžèº«ããStringãšnew()ã«é¢é£ãããšããã ããã£ããæãåºããšã次ã®ããã«ãªãã
use core::char::{decode_utf16, REPLACEMENT_CHARACTER};
use core::fmt;
use core::hash;
use core::iter::{FromIterator, FusedIterator};
use core::ops::Bound::{Excluded, Included, Unbounded};
use core::ops::{self, Add, AddAssign, Index, IndexMut, RangeBounds};
use core::ptr;
use core::str::{lossy, pattern::Pattern};
use crate::borrow::{Cow, ToOwned};
use crate::boxed::Box;
use crate::collections::TryReserveError;
use crate::str::{self, from_boxed_utf8_unchecked, Chars, FromStr, Utf8Error};
use crate::vec::Vec;
pub struct String {
vec: Vec<u8>,
}
impl String {
pub const fn new() -> String {
String { vec: Vec::new() }
}
pub fn with_capacity(capacity: usize) -> String
pub fn from_str(_: &str) -> String
pub fn from_utf8(vec: Vec<u8>) -> Result<String, FromUtf8Error>
pub fn from_utf8_lossy(v: &[u8]) -> Cow<'_, str>
pub fn from_utf16(v: &[u16]) -> Result<String, FromUtf16Error>
pub fn from_utf16_lossy(v: &[u16]) -> String
pub fn into_raw_parts(self) -> (*mut u8, usize, usize)
pub fn into_bytes(self) -> Vec<u8>
pub fn as_str(&self) -> &str
pub fn as_mut_str(&mut self) -> &mut str
pub fn push_str(&mut self, string: &str)
pub fn capacity(&self) -> usize
pub fn reserve(&mut self, additional: usize)
pub fn reserve_exact(&mut self, additional: usize)
pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError>
pub fn try_reserve_exact(&mut self, additional: usize) -> Result<(), TryReserveError>
pub fn shrink_to_fit(&mut self)
pub fn shrink_to(&mut self, min_capacity: usize)
pub fn push(&mut self, ch: char)
pub fn as_bytes(&self) -> &[u8]
pub fn truncate(&mut self, new_len: usize)
pub fn pop(&mut self) -> Option<char>
pub fn remove(&mut self, idx: usize) -> char
pub fn retain<F>(&mut self, mut f: F)
pub fn insert(&mut self, idx: usize, ch: char)
pub fn insert_str(&mut self, idx: usize, string: &str)
pub fn len(&self) -> usize
pub fn is_empty(&self) -> bool
pub fn split_off(&mut self, at: usize) -> String
pub fn clear(&mut self)
pub fn drain<R>(&mut self, range: R) -> Drain<'_>
pub fn replace_range<R>(&mut self, range: R, replace_with: &str)
pub fn into_boxed_str(self) -> Box<str>
}
Stringã¯ãpub strust StringããšããŠå®£èšãããå®éã«ã¯ãvec: Vec<u8>ãã§ããããšãnew()ã¯Stringã®å®è£ ã§ãpub const fn new() -> Stringããšå®£èšãããå®éã«ã¯ãvec: Vec::new()ããåŒã°ããŠããããšãªã©ããããã
ãããã£ãŠæ§é ãšå®è£ ã調ã¹ãŠã¿ããšãã¶ã»ããã¯ã§åïŒtypeïŒãšåŒã°ããŠãããã®ããStringåã«é¢é£ä»ãããã颿°ïŒan associated function of the String typeïŒããšãã説æãã©ããã£ããã®ã§ããããããããã
äžæ©äžæ©èªã¿è§£ããŠãã
æ°åœãŠã²ãŒã ã®æåã®æ°è¡ã ããèŠãã ãã ãããã§ã«ã¹ã³ãŒããåå空éãã©ã€ãã©ãªã颿°ã倿°ïŒå¯å€ãäžå€ïŒãåãåã«çµã³ä»ãããã颿°ããšãã£ãæŠå¿µã䜿ãããŠããããªããžã§ã¯ãæåããã°ã©ãã³ã°èšèªã®çµéšãããæ¹ãªãããã»ã©é£ãã話ã§ã¯ãªãããã¹ã¯ãªããç³»ã®èšèªãç°¡åãªçšéã§ãã䜿ã£ãŠããªããšããªããã®çšåºŠã®ããšã§ãããªã«ããããæŠå¿µãåºãŠããã®ããäžæè°ã«æããããããªãã
Pythonãªã©äººæ°ã®é«ãã¹ã¯ãªããèšèªã¯ããŸãæŠå¿µãçè§£ããªããŠãããçšåºŠäœ¿ããä»çµã¿ã«ãªã£ãŠãããã®ã®ãã¡ãããšåäœãçè§£ããããšæã£ãããæ°è¡çšåºŠã§ãããªãå€ãã®æŠå¿µãçè§£ããŠããå¿ èŠãããããã®ç¹ã§èšãã°ãRustããã以å€ã®èšèªãããã»ã©é£ããã¯å€ãããªããããããªãã
ãã ãRustã®å Žåãã¡ãããšçè§£ããŠããªããšãŸãã³ã³ãã€ã«ãéãã³ãŒããæžãããšãã§ããªãç¹ã§ãã¹ã¯ãªããç³»ã®ããã°ã©ãã³ã°èšèªãšã¯å€§ããç°ãªã£ãŠãããããããRustã§åŸãæŠå¿µã¯ã»ãã®ããã°ã©ãã³ã°èšèªã䜿ãæã®æèæŽçãã³ãŒãã£ã³ã°æŽçã«ãå¿çšã§ããã®ã§ããã£ãŠãããŠæã¯ãªããšæãããã°ããã¯æ°ããæŠå¿µã®è©±ãç¶ããããããªãããäžæ©äžæ©èªã¿è§£ããŠãããã
