ðŠ Google Rust ã¹ã¿ã€ã«ã¬ã€ã: éèŠãªãã€ã³ã
Tip: TL;DR: å¯èªæ§ > æžããããã
rustfmt+ ãããªã㯠Rust èŠçŽã«åŸããéæ³ïŒãã¯ããã°ãããRcãunsafeãunwrapïŒãé¿ãããæææš©ããšã©ãŒãåã«ã€ããŠæç€ºçã«ã
ð§ Step 0: åºæ¬ã«ãŒã«ãçè§£ããâ
ãã¹ãŠã®ã«ãŒã«ã®èæ¯ã«ããç®æš
| ç®æš | æå³ |
| ð å¯èªæ§ãåªå | ã³ãŒãã¯é·ãååšãããæžãéã«ããå°ãåªåãããã |
| ð€ èªååã«å¯Ÿå¿ | äžè²«ããã³ãŒãã¯å€§èŠæš¡ãªãã¡ã¯ã¿ãªã³ã°ïŒLSCsïŒã容æã«ãã |
| ð ãšã³ã·ã¹ãã ã«åããã | å ¬åŒ Rust ã¹ã¿ã€ã«ã¬ã€ã + Rust API ã¬ã€ãã©ã€ã³ã«åŸãïŒãã®ã¬ã€ããšççŸããªãéãïŒ |
| âïž ã«ãŒã«ã¯éã¿ãæã€å¿ èŠããã | å®éã®å¹æãããã«ãŒã«ã®ã¿ |
| ð èªè»¢è»çœ®ãå Žåé¡ãçµãããã | ããããæèŠã®çžéãäžåºŠè§£æ±ºãã |
ã©ã€ãã©ãªã³ãŒã vs ã¢ããªã±ãŒã·ã§ã³ã³ãŒã
| ã©ã€ãã©ãªã³ãŒã | ã¢ããªã±ãŒã·ã§ã³ã³ãŒã | |
| 䜿çšè | ä»ã®ãããžã§ã¯ã | 1ã€ã®ã¢ã㪠|
| API èšèšã«ãŒã« | ææåããã | åŒ·ãæšå¥š |
| èãæ¹ | æè»ãæ±çšãåå©çšå¯èœ | ã·ã³ãã«ãçŽæ¥çãéåºŠãªæœè±¡åãªã |
ð Step 1: ã³ãŒããæŽçããâ
-
å°ããªã¯ã¬ãŒããåªå ïŒChromiumïŒ: çæ³çã«ã¯ 1 ã€ã®ãã¡ã€ã«ã1 ã€ã®æœè±¡ããµãã¢ãžã¥ãŒã«ã远å ããåã«åå²ããã
-
ãã©ãããªãã¡ã€ã«ã¬ã€ã¢ãŠãïŒChromiumïŒ: 1 ã€ã®ã¯ã¬ãŒãã®
.rsãã¡ã€ã«ã¯ 1 ã€ã®ãã£ã¬ã¯ããªã«ååšããããµããã£ã¬ã¯ããªãå¿ èŠ = ã¯ã¬ãŒãã倧ããããã -
ãã¡ã€ã«åãäž»èŠé ç®ã®åŸã«ä»ãã:
struct Fooâfoo.rs/mod fooã -
ãªãŒãã§ãªãã¢ãžã¥ãŒã«ã¯
mod宣èšãšåãšã¯ã¹ããŒãã®ã¿ãä¿æããå®è£ ã¯å«ãŸãªãïŒå°ãã®ã°ã«ãŒã³ãŒã㯠OKïŒããªãŒãã¢ãžã¥ãŒã«ã¯mod testãšãã€ã³ãã£ã³ã°ã¢ãžã¥ãŒã«ïŒäŸ:#[cxx::bridge]ïŒãå«ãããšãã§ããã -
ã«ãŒãã¢ãžã¥ãŒã«ã¯ãªãŒããµãã¢ãžã¥ãŒã«ãããããªã㯠API ãåãšã¯ã¹ããŒãã§ããããããµãã¢ãžã¥ãŒã«ã¯å®è£ 詳现ã®ãŸãŸã«ãªãã
-
API ãåãã¯ã¬ãŒãã«å±ãããã©ãããæåã«æ±ºå®ãããã®åŸã§ãµãã¢ãžã¥ãŒã«ãæ€èšããã
-
ãã¬ã€ãå®è£ ã®äžè²«æ§ã«ãŒã«ãåãšãã¬ã€ããäžç·ã«åŒ·å¶ããå ŽåããŸãã¯å€§èŠæš¡ãªåºç€ã©ã€ãã©ãªã®å Žåã倧ããªã¯ã¬ãŒãã¯åé¡ãªãã
-
äŸå€: Cargo ã§ãæ§ç¯ããã
//third_partyã³ãŒãã¯éåžžã® Cargo ãã£ã¬ã¯ããªã¬ã€ã¢ãŠããä¿ã€ã
ðŠ Step 2: ã€ã³ããŒããæ£ããæžãâ
â ã°ããã€ã³ããŒããªãâ
èš±å¯ãããäŸå€ã®ã¿:
-
use super::*ã€ã³ã©ã€ã³ã¢ãžã¥ãŒã«å ïŒäŸ:mod testïŒ -
use MyEnum::*ãã®ãšãã ãäž»ã«æ±ã颿°å -
pub use submodule::*ãªãŒãã§ãªãã¢ãžã¥ãŒã«å -
C++ åå空éã 1 ã€ã®ã¢ãžã¥ãŒã«ã«ããŒãžïŒããŒãžãããã¢ãžã¥ãŒã«ã¯å ¬éãããŠããªãå¿ èŠãããïŒ
-
ãµãŒãããŒãã£ããªã«ãŒãïŒã¬ãã¥ã¢ãŒã®å€æïŒãç¬èªã®ããªã«ãŒããå®çŸ©ããªãã§ãã ããã
â
use ã¹ããŒãã¡ã³ãããšã« 1 ã€ã®ã¢ãžã¥ãŒã«â
rustfmt èšå® imports_granularity = Module ã«åèŽïŒ{} å
ã« ::ãªãïŒ:
// â
Good
use foo::Foo;
use foo::bar::{Bar, Baz};
// â Bad
use foo::{Foo, bar::Bar};
â ãã¬ã€ããããŒã«ã«ã§ã€ã³ããŒãâ
ãã¬ã€ãã®ã¡ãœããã ãã¡ã€ã«å šäœã§åºã䜿çšãããŠããå Žåãé€ãã
fn foo(s: &str) -> Result<u8, std::num::ParseIntError> {
use std::str::FromStr; // 䜿çšãããŠããå Žæã«ã¹ã³ãŒããããŠãã
u8::from_str(s)
}
â 颿°: ã¢ãžã¥ãŒã«åã§ä¿®é£Ÿâ
// â
Good
use std::mem;
let x = mem::transmute(y);
// â Bad
use std::mem::transmute;
let x = transmute(y);
äŸå€: æç¢ºã«åºå¥ãããååïŒäŸ: C++ ããªãŒé¢æ°ïŒãå°ããªåäžç®çã®ãã¡ãŒã¹ãããŒãã£ã¯ã¬ãŒãïŒChromiumïŒãè¡çªããããã¢ãžã¥ãŒã«åïŒäŸ: C++ åå空éåïŒã
â å: ã€ã³ããŒãããŠé修食ã§äœ¿çšâ
regex::Regex ã§ã¯ãªã Regex ãšæžããäŸå€: ãããŸããªååïŒio::Error ãŸã㯠use std::io::Error as IoErrorïŒãå€§èŠæš¡ãªåã°ã«ãŒãïŒäŸ: rustc ã® hirïŒããã¯ã/çæã³ãŒããå€ãã®äŸåé¢ä¿ããããã import ãããã¯ã巚倧ã«ãªãã³ãŒãã
Chromium ã®ã¿â
chromium::import!() ãã€ã³ããŒãæ©æ§ãšããŠäœ¿çšããŠãã ããã
ðš Step 3: ãã©ãŒãããâ
-
ãã©ãŒããã¿ãŒãå®è¡ïŒ
rustfmt/git cl formatïŒããã©ãŒãããã«ã€ããŠæåã§è°è«ããªãã§ãã ããã -
æšå¥šããã
rustfmtãªãã·ã§ã³ïŒã³ãŒãããŒã¹ã¯å®å®ç Rust ã§å©çšã§ããªããã®ãã¹ãããã§ããŸãïŒ:
max_width = 100
hex_literal_case = "Lower" # 0xab12, not 0xAB12
format_macro_matchers = true
imports_granularity = "Module"
-
ãªãã©ã«å ã®ç®ã«èŠããªãæåããšã¹ã±ãŒã:
\u{200D}ã -
#[rustfmt::skip]ã®ã¿ æå³çãªæåé 眮ïŒäŸ: è¡åïŒãŸãã¯çæãããã³ãŒãçšãå人çãªå¥œã¿ã«ã¯æ±ºããŠäœ¿ããªãã§ãã ããã
ð Step 4: æææš©ãšåçšâ
| ã«ãŒã« | 詳现 |
Rc / Arc ãé¿ãã | åäžæææš© + åçšãåªå ãä»£æ¿æ¡ãéåžžã«è€éãªå Žåã®ã¿äœ¿çšã |
.clone() ããåçšãåªå
| æ·±ãã³ããŒãæ¬åœã«å¿
èŠãªå Žåã®ã¿ã¯ããŒã³ãããRc/Arc ã®ã¯ããŒã³ã¯åé¡ãªãïŒå®äŸ¡ãªãã€ã³ã¿ã³ããŒïŒã |
ð Step 5: 颿°å ¥åãšåºåâ
æãæè»ãªåç §ãåãå ¥ããâ
| â äœ¿çš | â 代ããã« |
&T | &Box<T> |
&[T] | &Vec<T> |
&str | &String |
Option<&T> | &Option<T> |
äŸå€: Rope/Cord ã®ãããªéç·åœ¢æåããŒã¿ãé¢é£ãã Clippy ãªã³ã: borrowed_boxãptr_argã
ã€ãã¬ãŒã¿ vs ã³ã¬ã¯ã·ã§ã³â
| ç¶æ³ | ã©ã€ãã©ãª | ã¢ããªã±ãŒã·ã§ã³ |
| æ»ãå€ | impl Iterator ãåªå
| ããåçŽãªå Žå㯠Vec<T> ã§åé¡ãªã |
| ãã©ã¡ãŒã¿ | impl IntoIterator ãåãå
¥ãã | ããåçŽãªå Žå㯠&[T] ã§åé¡ãªã |
次ã®å Žå㯠Vec ãè¿ã: ã»ãšãã©ã®åŒã³åºãå
ã Vec ãå¿
èŠãšãããå®è£
ãèªç¶ã« 1 ã€ãæ§ç¯ãããçµæãã©ã³ãã ã¢ã¯ã»ã¹ãå¿
èŠãšãããfor ã«ãŒããããé©åã§å²ãåœãŠãåé¡ã§ãªãã颿°ã®ç®çãã³ã¬ã¯ã·ã§ã³ãäœæããããšã§ããããŸãã¯æ¢åã®ãã¯ãã«ãè¿ãã
ãã®ä»ã®å ¥åã«ãŒã«â
-
impl Into<T>ãã©ã¡ãŒã¿: ã©ã€ãã©ãªã®ã¿ãåŒã³åºããµã€ãã®äœ¿ãããããæ¬åœã«éèŠãªå Žåãã³ãŒããããŒããè€éãªçœ²åãæšè«ã®åé¡ã«å¯ŸããŠãã©ã³ã¹ãåããã¢ããªã±ãŒã·ã§ã³ã³ãŒã: ã»ãŒæ±ºããŠãªãã -
æå³ãæç¢ºã§ãªãå Žåã
boolããenumãåªå ãããboolãä¿æããå ŽåãåŒã³åºããµã€ãã§ã³ã¡ã³ã:
connect(addr, /* retry= */ true);
ðš Step 6: ãšã©ãŒãæ£ããå ±åããâ
| ã¡ã«ããºã | ææ | äŸ |
Option | æçœã§äºæããã倱æã詳现ã¯äžèŠ | checked_add() -> Option<u32> |
Result | å埩å¯èœãªå€éšãšã©ãŒãåŒã³åºãå 㯠çç± ãç¥ãå¿ èŠããã | open_file() -> Result<File, io::Error> |
panic! | ãã° / éåããäžå€æ¡ä»¶: ã³ãŒããä¿®æ£ããå®è¡æã«åŠçããªã | ã€ã³ããã¯ã¹ç¯å²å€ |
ãããã¯ããã®ç²ç²åºŠã®å埩㯠catch_unwind ã§å¯èœïŒStep 14 ã®å¶éãåç
§ïŒãäŸå€: éçºçšãã€ããªãšãã¹ãã¯ãããã¯ã§ãããäžéšã®ã³ãŒãããŒã¹ã¯ãããã¯ãå®å
šã«çŠæ¢ããç Žæããäžå€æ¡ä»¶ã§ã Result ã䜿çšã
ð§± Step 7: åâ
Newtype vs åãšã€ãªã¢ã¹ã 次ã®å Žåã« newtype ã䜿çš:
-
ã»ãã³ãã£ã¯ã¹ãåºç€ãšãªãåãšç°ãªã
-
åãç¬èªã® API ãå¿ èŠãšãã
-
åŸã§åºç€ãšãªãåã倿Žããå¯èœæ§ããã
-
åãæ··åããããïŒäŸ:
DayãMonthãYearïŒ
ã¿ãã«ããååä»ããã£ãŒã«ã:
// â
Good
struct Point { x: f64, y: f64 }
// â Avoid (except one-field newtypes or very local use)
let p = (1.0, 2.0); p.0; p.1;
ð§© Step 8: ãã¬ã€ãâ
ãã¬ã€ããå®çŸ©ããææâ
ã®ã¿:
-
ãžã§ããªãã¯å¢çïŒ
T: TraitïŒ -
impl Trait/dyn Trait -
æ¡åŒµãã¬ã€ã ããä»¥å€ â åºæã®
implãã³ãŒãã®æŽçã«ãã¬ã€ãã䜿çšããªãã§ãã ããã
äžè¬çãªãã¬ã€ãã«ãŒã«â
-
ã©ã€ãã©ãªã³ãŒã: impl ãããã¢ã¯ãã£ãã«è¿œå ãã¢ããªã±ãŒã·ã§ã³ã³ãŒã: å¿ èŠãªå Žåã«è¿œå ã
-
ã«ã¹ã¿ã ã¡ãœããã®ä»£ããã« std ãã¬ã€ããå®è£ ïŒ
fn from_strã§ã¯ãªãimpl FromStrïŒãã¡ãœãããšãã¬ã€ã impl ã®äž¡æ¹ãä¿æããããšã¯èŠã€ããããã®ããåé¡ãªãïŒClippy:should_implement_traitïŒã -
å¯èœãªéã
#[derive(...)]ã䜿çšã -
ã©ã€ãã©ãª:
dyn Traitãã ãžã§ããªã¯ã¹ãåªå ïŒãã¡ãããã€ã³ã¿ãvtableæ€çŽ¢ãªããã€ã³ã©ã€ã³å¯èœïŒãã³ãŒããµã€ãºãåé¡ã§ãªãéããæ³šæ: äžéšã®ãã¬ã€ãã¯dynäºæã§ã¯ãªãïŒãžã§ããªãã¯ã¡ãœãããselfã®ãªãé¢é£é¢æ°ãSelfãè¿ãã¡ãœããïŒã
æ¡åŒµãã¬ã€ãâ
-
ãµãã£ãã¯ã¹
ExtâForeignTypeExt -
åãææããããŒã ãæ¡åŒµãææããïŒã¡ãœããåã®è¡çªãåé¿ïŒã
-
äŸå€: åºç€ã©ã€ãã©ãª/ãã¬ãŒã ã¯ãŒã¯ã§åºãæçšãªæ¡åŒµã
-
å ¥åãã¬ã€ãïŒäŸ: å€ãã®å€éšåã§å®è£ ããã
DateLikeïŒãšæ··åãããªãããšãå ¥åãã¬ã€ãã¯åé¡ãªãã -
ãã©ã³ã±ããå®è£ ãå¯èœ:
impl<T: ForeignTrait> ForeignTraitExt for Tã
ãã¬ã€ãããŒãã·ãŒãâ
| ãã¬ã€ã | ã¬ã€ãã³ã¹ |
Copy | Copy ã®ãŸãŸã§ããããšãæç¢ºãªå Žåã«å®è£
ããšã©ãŒå: å¯èœãªéã Copyã |
Clone | ã»ãšãã©ã®åïŒå€éšãªãœãŒã¹ã衚ãåã¯é€ãïŒ |
Default | new() ãããããŸãã¯ããã©ã«ãç¶æ
ãããå Žå |
PartialEq / PartialOrd | == / < ã«ã¯ ããããåªå
ãEq / Ord ã¯åå°æ§/å
šé åºãä¿èšŒããå Žåã®ã¿è¿œå ã |
Hash + Eq | ãããããŒããã£ãã·ã¥ããŒãšããŠäœ¿çšãããå¯èœæ§ãããå Žåãæç¢ºãªå
šé åºãããå Žå㯠Ord ã远å ã |
| ãããªãã¯ãã£ãŒã«ãã®ããå | ãã¹ãŠã®ãµããã£ãŒã«ããå®è£ ãããã¬ã€ãã®å®è£ ãæ€èš |
From | äž»ãªã³ã³ã¹ãã©ã¯ã¿ã®å Žåãnew() / from_foo() ã远å |
| ãªãã·ã§ã³æ§é äœ | Default ãå®è£
â ..Default::default() ãæå¹ã«ãã |
ð§µ Step 9: äžŠè¡æ§â
-
決ããŠãã€ãºã³ããããã¥ãŒããã¯ã¹ã«æãåºããªãã
-
Chromium:
async/.awaitãªããstd::threadãªãïŒã·ãŒã±ã³ã¹ã䜿çšïŒã -
Fuchsia:
fuchsia_sync::Mutexã䜿çšã
ðª Step 10: ãã¯ãïŒæåŸã®ææ®µïŒâ
åªå é äœ:
-
ãã¬ãŒã³é¢æ°ãåããã¬ã€ããã¢ãžã¥ãŒã« â
-
macro_rules! -
ãã®ä»ã®ã³ãŒãçæïŒäŸ: genruleïŒ
-
proc_macroâ ïž çç±: ãã¯ã㯠IDE ãµããŒããæãªãããããèšèªãäœæããLSCs ãé£ãããããã³ãŒãçæãå¿ èŠãªå Žåãmacro_rules!㯠AST ã§åäœãããããããã¹ãçæããè匱æ§ãäœãã
ð·ïž Step 11: åœåâ
| é ç® | èŠçŽ |
| 倿 | as_..() ïŒå®äŸ¡ãªåçšïŒãto_..() ïŒé«äŸ¡ïŒãinto_..() ïŒself ãæ¶è²»ïŒ |
| ã³ã³ã¹ãã©ã¯ã¿ | new()ãnew_with_foo()ãResult ãè¿ãå Žå㯠try_new() |
| å€ã®å€æ | from_foo() + ãããã³ã° From impl |
| æ¡åŒµãã¬ã€ã | FooExt |
| ã©ã€ãã¿ã€ã | 説æçãªååã'a ã¯åçŽãªå
¥åâåºåãªã³ã¯ãŸãã¯ããŒã«ã« for<'a> å¢çã§ OKïŒæå€§ 2ïŒã'_ ã¯åé¡ãªããCow ã®ãããªãžã§ããªãã¯æœè±¡åã¯å
é€ã |
| ãžã§ããªã¯ã¹ | çããæå³ã®ããïŒäž»ãªãã¬ã€ãå¢çããïŒãT/U ã¯éå¢çãžã§ããªã¯ã¹çšã |
| çç¥åœ¢ | äžè¬çãªå ŽåïŒWikipedia äžïŒãŸã㯠ãããžã§ã¯ãå€ã§æç¢ºãªå Žåãé€ãé¿ããïŒäŸ: IpAddrïŒãåèªå
ã®æåãåé€ããªãã |
ã²ãã¿ãŒ & ã»ãã¿ãŒâ
| ã¡ãœãã | ç®ç |
foo() | &T ãè¿ãïŒãŸã㯠Copy ã®å Žå㯠TïŒãget_ ãã¬ãã£ãã¯ã¹ãªãã |
foo_mut() | &mut T ãè¿ã |
set_foo(v) | å€ãèšå® |
take_foo() | ããã©ã«ã/None ãã¯ãªã¢ãå€ãå€ãè¿ã |
replace_foo(v) | å€ãèšå®ãå€ãå€ãè¿ã |
with_foo(|f| ..) / with_mut_foo(|f| ..) | ã¯ããŒãžã£ã¢ã¯ã»ã¹ãMutex/RefCellïŒã¬ãŒãããªãŒã¯ãããªãïŒãã¬ãŒãã倿ŽåŸã®æ€èšŒãå¿
èŠãšããå Žåã«æé©ãã¯ããŒãžã£ã®æ»ãå€ã¯è¿ããããã¢ã¯ã»ãµã 1 ã€ã ãã®å Žåãwith_foo ã倿Žã§ããã |
ð Step 12: ããã¥ã¡ã³ãâ
-
ãã¹ãŠã®ãããªã㯠API ãããã¥ã¡ã³ãåïŒ
missing_docsãªã³ãã䜿çšïŒã -
///ã¯é ç®ã//!ã¯ã¢ãžã¥ãŒã«/ã¯ã¬ãŒãïŒãã¡ã€ã«ã®å é ïŒã//ã¯å®è£ ããŒããš TODOãæ··ããããšãæšå¥šã -
Markdownã倧æååãå¥èªç¹ã䜿çšã
-
åžžã«ãããã¯ã±ãŒã¹ãããã¥ã¡ã³ãåããåã³
unsafeäžå€æ¡ä»¶ã -
ã©ããã®ã¯ã¬ãŒãã«äŸãå«ããïŒãã¹ãŠã®é¢æ°ã«å¿ èŠãªããã§ã¯ãªãïŒã
-
èšèªã®åºæ¬ã説æããªãïŒäŸ: ãã¹ãçšã¢ãã¯å®è£ ã«é¢ããããã¬ã€ãã®ã¢ãã¯å®è£ ãïŒã
-
èªæãªãšãã å€çš®ã®ããã¥ã¡ã³ãã¯çç¥å¯èœã
-
ãã¯ãããçæãããã®ã§ã¯ãªãã
//////!ã§çŽæ¥ããã¥ã¡ã³ãåã -
æçœãªããšãèšãçŽããªã:
// â ç¡æå³ïŒçç¥ã㊠lint ãèš±å¯ããæ¹ãè¯ãïŒ
/// èŠçŽ ãåé€ããŸãã
pub fn remove_element() -> Element {}
// â
æçš: ãããªã㯠doc + ãã©ã€ããŒãããŒã
/// äžãããã `name` ãæã€æåã® `FooItem` ãèŠã€ããããååšããªãå Žå㯠`None`ã
// TODO: crbug.com/12345 - `name` 㯠String ã§ã¯ãªã &str ã«ãã¹ãã
pub fn get_named(items: &[FooItem], name: String) -> Option<&FooItem> { .. }
âïž Step 13: ãã®ä»ã®èšèªæ©èœâ
| ããã㯠| ã«ãŒã« |
unsafe | å®å
šãªä»£æ¿æ¡ããªãå Žåã®ã¿ãå®å
šãªæœè±¡ã«åé¢ãã// SAFETY: ã³ã¡ã³ãã远å ããæ£åœåããïŒããã©ãŒãã³ã¹ã®å Žåã¯ãã³ãããŒã¯ã§ïŒã |
| äžå®å®ãªæ©èœ | 䜿çšããªãããšãäŸå€: Android çµã¿èŸŒã¿ããŒãºïŒã¬ãã¥ãŒæžã¿ïŒãChrome æ¿èªãªã¹ããFuchsia ã®ç¬èªã¬ã€ãã³ã¹ |
len() | is_empty() ãå®è£
|
#[doc(hidden)] | ææããŠããªãå Žåã¯ãã©ã€ããŒããšããŠæ±ã |
const fn | const ã®ãŸãŸã«ãããå Žåã®ã¿ïŒåé€ããã°ç Žå£ç倿ŽïŒ |
| ãªãã¬ãŒã¿ãªãŒããŒããŒã | å®éã®æ°åŠ/è«ççæå³ãããå Žåã®ã¿ãæ§æã·ã¥ã¬ãŒã§ã¯ãªãã |
| ãããªãã¯ãšãã ïŒä»ã®ããŒã ã䜿çšïŒ | #[non_exhaustive] ã»ãããåºå®ïŒäŸ: Colorãäºç¶æ
ãšãã ïŒãŸãã¯LSC ã«ããç Žå£ä¿®æ£ãã³ããããçšã«äœ¿çšããããšãã ã¯ã¹ãããå¯èœã |
| ãããªãã¯æ§é äœïŒpub ãã£ãŒã«ãä»ãïŒ | #[non_exhaustive] ãã£ãŒã«ãã倿ŽãããªããLSC ä¿®æ£ãã³ãããããŸã㯠..Default::default() ãå¿
èŠãªå Žåãé€ã |
#[must_use] | çŽç²é¢æ°ïŒäŸ: HashMap::getïŒãéèŠãªæ
å ±ãè¿ã颿°ããšã©ãŒ / é
å»¶åãæ»ãåãæ¢ã« #[must_use]ïŒäŸ: ResultïŒã®å Žåã¯äžèŠã |
main() åã®ã³ãŒã | 決ããŠãªãïŒäŸ: ctor ã¯ã¬ãŒãïŒ |
ð ïž Step 14: å®è£ ç¿æ £â
æšè«ãé ããšããã«æç€ºçãªåã远å â
ç¹ã« .into() ã®åŸã.parse() ãšè€éãªã€ãã¬ãŒã¿ãã§ãŒã³ãã¿ãŒããã£ãã·ã¥ãã倿°ã®æ³šéãåªå
:
let port: u16 = s.parse()?;
ã³ã³ãã€ã©ãã¿ãŒããã£ãã·ã¥ã匷å¶ããå Žåã_ ããŒã«ãŒã¯åé¡ãªã: collect::<Vec<_>>()ã
ãã§ãã¯âã¢ã³ã©ããã®ä»£ããã«ãã¿ãŒã³ãããâ
// â
Good
if let Some(value) = option {
use_value(value);
}
// â Bad
if option.is_some() {
use_value(option.unwrap());
}
unwrap ãã expectâ
äžå€æ¡ä»¶ããªãæç«ãããããã¥ã¡ã³ã: .expect("config loaded at startup")ã
#[non_exhaustive] ãšãã ã®ãããã³ã°â
æ¢ç¥ã®å€çš®ãæç€ºçã«åæãããã®åŸ _:
match shape {
Shape::Circle => println!("circle"),
Shape::Square => println!("square"),
Shape::Triangle | _ => {}
}
// â
1 ã€ã®å€çš®ã®ã¿æ°ã«ãã â if let
if let Shape::Circle = shape { println!("circle"); }
// â å€çš®ã _ ã®åŸãã«é ã
match shape {
Shape::Circle => println!("circle"),
_ => {}
}
äŸå€: äžéšã®å€çš®ã®ã¿æ°ã«ããif let ãã match ãããèªã¿ãããå Žåã¯åé¡ãªãã
ã¢ãµãŒã·ã§ã³ã«ã³ã³ããã¹ããäžããâ
// â
ãªããã説æ
assert!(values.is_sorted(), "`values` 㯠PriorityQueue ããæ¥ãŠããããããœãŒãæžã¿ã§ããã¹ã");
assert!(refund > 0, "æãæ»ãã¯æ£æ°ã§ããå¿
èŠãããã{refund:?} ãåŸã");
assert!(self.stream.is_some(), "ã¯ãšãªãå®è¡ããåã« connect() ãåŒã³åºã");
// â æ¡ä»¶ãç¹°ãè¿ãã ã
assert!(values.is_sorted(), "values ã¯åžžã«ãœãŒãæžã¿ã§ããã¹ã");
ã€ãã¬ãŒã¿ãã§ãŒã³ vs for ã«ãŒãâ
-
â çããããžãã¯éèŠã®çµã¿åãã:
values.iter().any(|&v| v > threshold) -
â æ¡ä»¶ãå€éšå€æŽã䌎ãé·ããã§ãŒã³ â
forã«ãŒããäœ¿çš -
â
forããããŒå ã®ãã§ãŒã³ â æåã«ååä»ã倿°ã«å²ãåœãŠã -
â
for_eachâ éåžžã¯forã«ãŒãã®æ¹ãèªã¿ããã
let urgent_bugs = bug_descriptions
.iter()
.filter_map(|d| parse_bug_description(d).ok())
.filter(|bug| bug.priority <= Priority::P1);
for bug in urgent_bugs {
assign_bug(bug);
}
ãã®ä»ã®ç¿æ £â
-
panic::catch_unwindãªããé²å®çãªæ·±ããšããŠã®ã¿èš±å¯ãããã³ãŒãã¯äœã«ãäŸåããªãããã€ã³ãŒããpanic=unwindã§å®è¡ãããå Žæã§ã®ã¿ïŒChromeãAndroidãFuchsia ã¯panic=abortã䜿çšïŒã -
æåå:
a + b + cã®ä»£ããã«format!("{a}{b}{c}")ïŒå²ãåœãŠãå°ãªãïŒãŸãã¯str::replaceãã³ãã¬ãŒããç¬èªã®ãã³ãã¬ãŒãæ§æãçºæããªãããšã -
ãã¹ã: ã³ãŒãããŒã¹ã®ãã¬ãŒã ã¯ãŒã¯ã䜿çšïŒChrome:
rust_gtest_interopãFuchsia:#[fuchsia::test]ïŒã
â ã¯ã€ãã¯ã¬ãã¥ãŒãã§ãã¯ãªã¹ãâ
-
rustfmtå®è¡æžã¿ãã°ããã€ã³ããŒããªããuseããšã« 1 ã€ã®ã¢ãžã¥ãŒã« -
颿°ã¯
module::func()ãšããŠåŒã³åºããåã¯é修食ã§äœ¿çš -
äžèŠãª
Rc/Arc/.clone()ãªã -
ãã©ã¡ãŒã¿ã¯
&strã&[T]ã&TãOption<&T>ãäœ¿çš -
äžæç¢ºãª
boolãã©ã¡ãŒã¿ã®ä»£ããã«enumãäœ¿çš -
æ£ãããšã©ãŒå:
Option/Result/panic! -
ã¿ãã«ããååä»ããã£ãŒã«ããæå³ãç°ãªãå Žå㯠newtype
-
ãã¬ã€ãã¯ãžã§ããªã¯ã¹ / dyn / æ¡åŒµã®ã¿;
#[derive]ãäœ¿çš -
ã²ãã¿ãŒã¯
get_ãªããã³ã³ã¹ãã©ã¯ã¿ã¯new/try_new -
ãããªã㯠API ãããã¥ã¡ã³ãåããããã¯ãš
unsafeã説æ -
unwrapã®ä»£ããã«if let/match; çç±ä»ãã§expectãäœ¿çš -
ã¢ãµãŒã·ã§ã³ã¯ã³ã³ããã¹ãã¡ãã»ãŒãžãå«ã
-
èªã¿ãããã€ãã¬ãŒã¿ãã§ãŒã³ãæååæ§ç¯ã¯
format!ãäœ¿çš -
unsafeãäžå®å®ãªæ©èœããŸãã¯ãã¯ãã¯åŒ·åãªæ£åœåãªããªã