Rustã®ã¢ã¸ã¥ã¼ã«ã詳細ã«çè§£ãã(7) åå解決ã¨ãã¯ã
æ¦è¦: Rust2018以éãRustã®ã¢ã¸ã¥ã¼ã«ã·ã¹ãã ã¯å ¥éããããããã¤ãã¹ã¿ã¼ãã«ãããªãã¾ãããããã§æ¬è¨äºã§ã¯ããã®ä¸¡æ¹ãéæãããã¨ãç®æãã¾ããã
- ã¢ã¸ã¥ã¼ã«å ¥é
- åå解決ã®å½¹å²ã¨ç¨èª
- ã¢ã¸ã¥ã¼ã«ã°ã©ãã®æ§é
- ã¤ã³ãã¼ã解決
- å¯è¦æ§
- ãã¹è§£æ±º
- åå解決ã¨ãã¯ã
æ¬è¨äºã¯2017å¹´ã«æ¸ããè¨äº (https://qnighy.hatenablog.com/entry/2017/03/27/070000, https://qnighy.hatenablog.com/entry/2017/04/24/070000 ) ã¨åããã¼ãã§ãRust2018ãèæ ®ãã¦æ¹ãã¦ã¾ã¨ãç´ãããã®ã§ãã
注æ: æ¬è¨äºä¸ã®ãµã³ãã«ã³ã¼ãã®å¤ãã¯ãRustã®ç´°ãã仿§ãå®è£ ã調ã¹ãããã®ãã®ã§ãããå®éã«æç¨ãªããã°ã©ãã³ã°ãã¿ã¼ã³ã§ããã¨ã¯éãã¾ãããã¾ããå®è³ªçã«ãã°ã«è¿ãæåã説æãã¦ãããã®ããããããå°æ¥ã«ããã£ã¦åãåä½ã§ãããã¨ã¯ãã¾ãä¿è¨¼ã§ãã¾ããã
è¡çæ§ã¨ã¯
è¡çæ§ (hygiene) ã¨ã¯ããã¯ãå å¤ã®å¤æ°ããã¯ãå±éåã®æ§é ã«ãã¨ã¥ãã¦ã¬ãã·ã«ã«ã¹ã³ã¼ãã§è§£æ±ºã§ããããã«ããä»çµã¿ã§ãã
macro_rules! foo { ($e:expr) => { let mut x = 42; $e; eprintln!("x in foo = {}", x); // 42 } } fn main() { let mut x = 53; foo!(x = 64); eprintln!("x in main = {}", x); // 64 }
ä¸ã®ã³ã¼ãã§ã¯ã main ãå°å
¥ããæç¸ x 㨠foo ãå°å
¥ããæç¸ x ã¯åºå¥ããã¾ãã
ãã¯ãå±éã追跡ããããã«ãã³ã³ãã¤ã©ã¯ãã¯ãå±éã²ã¨ã¤ã²ã¨ã¤ã« Mark ã¨ããçªå·ãå²ãæ¯ãã¾ãããã¨ãã°ä¸ã®ä¾ã§ã¯ foo! ã1åã eprintln! ã2åå±éããã¦ããã®ã§å°ãªãã¨ã3ã¤ã® Mark ãå²ãæ¯ããããã¨ã«ãªãã¾ããããã¦ãè¡çæ§ã追跡ããããã«ããã¯ãå±éå¢çãã¾ããã èå¥åã«ã¯ SyntaxContext ã¨ããæ
å ±ãå²ãå½ã¦ããã¾ããããã¯å®è³ªçã«ã¯ Mark ã®å (ããæ£ç¢ºã«ã¯ Mark ã¨éæåº¦ã®å¯¾ã®å) ã§ãä»ããä½ç½®ã«è³ãã¾ã§ã«ã¾ããã ãã¯ãå±éå¢çã®ä¸è¦§ã表ç¾ããã¾ããRustã®ASTã®èå¥åããã¼ã¯ã¼ãã«ã¯ããã® SyntaxContext ãä»éãã¦ãã¾ãã
ä¸ã®ä¾ã§ã¯ã foo!(x = 64) ãå±éããã¨ãã« foo å
ã®èå¥åã«ã ããã¼ã¯ãä»ä¸ããã¦ä»¥ä¸ã®ããã«ãªãã¾ãã
macro_rules! foo { ($e:expr) => { let mut x = 42; $e; eprintln!("x in foo = {}", x); // 42 } } fn main() { let mut x = 53; // macro[1] { // of foo!() let mut x /* [1] */ = 42; x = 64; eprintln!("x in foo = {}", x /* [1] */); // 42 // } eprintln!("x in main = {}", x); // 64 }
æ£ç¢ºã«ã¯ let ãªã©ã®ãã¼ã¯ã¼ãã«ããã¼ã¯ãä»ä¸ããã¦ãã¾ãããããã¯ãã¼ã¹ã®éã«ç¡è¦ããã¾ãã
ã¬ã¬ã·ã¼ãã¯ãã¨ã¢ãã³ãã¯ã
macro_rules! ã«ãããã¯ãã¯ã°ãã¼ãã«å®ç¾©ã«å¯¾ããè¡çæ§ãæã¡ã¾ããã
mod m1 { const X: i32 = 42; #[macro_export] macro_rules! foo { () => { X } } } const X: i32 = 53; fn main() { dbg!(foo!()); // 53 }
䏿¹ãRFC1584ã®å®ãã宣è¨ãã¯ã2.0ã§ã¯ã°ãã¼ãã«å®ç¾©ã«å¯¾ããè¡çæ§ãå°å ¥ããã¾ãã
#![feature(decl_macro)] mod m1 { const X: i32 = 42; pub macro foo() { X } } const X: i32 = 53; fn main() { dbg!(m1::foo!()); // 42 }
ããããåºå¥ããããã«ãRustã®ãã¯ãè¡çæ§ã«ã¯éæåº¦ã¨ããæ¦å¿µãããã¾ãã
Transparent(éæ): ãã®ãã¼ã¯ãè¡çæ§ã®ããã«ä½¿ããªãã#[rustc_transparent_macro]ã®ã¤ãã宣è¨ãã¯ã2.0ããæç¶ããã¯ãã®è¡çæ§ãªããã¢ã¦ãã§ä½¿ãããã
SemiTransparent(åéæ): ãã¼ã«ã«æç¸ãæ¢ãã¨ãã¯èæ ®ããããã°ãã¼ãã«å®ç¾©ãæ¢ãã¨ãã¯èæ ®ããªããmacro_rules!ã§ä½¿ãããã
Opaque(ä¸éæ): ãã®ãã¼ã¯ãè¡çæ§ã®ããã«ä½¿ãã- 宣è¨ãã¯ã2.0ãæç¶ããã¯ãã®ããã©ã«ãæåã
å°ãåã®æ®µè½ã§ SyntaxContext 㯠Mark ã®åã ã¨æ¸ãã¾ãããã (Mark, Transparency) ã®åã§ããã¨ã¿ãªãã»ããæ£ç¢ºã§ãããã㦠SyntaxContext ã«ã¯ä»¥ä¸ã®2ã¤ã®ã¡ã½ãããåãã£ã¦ãã¾ãã
modern: Opaqueãªãã¼ã¯ã ããåãåºããSyntaxContextãè¿ããmodern_and_legacy: Opaqueã¾ãã¯SemiTransparentãªãã¼ã¯ã ããåãåºããSyntaxContextãè¿ãã
åå解決æã¯ãèå¥åãæ¯è¼ããåã« modern/modern_and_legacy ã®ãããããå¼ãã§æ£è¦åããã¦ãã¾ããåºæ¬çã«ã¯ modern ã使ããã¾ããmodern_and_legacyãå¼ã°ããå ´é¢ã¨ãã¦éè¦ãªã®ããå¤åå空éã§ã¬ãã·ã«ã«ã¹ã³ã¼ã解決ãããã¨ããã§ããããã¯ã¾ãã«ãæ§æ¥ã® macro_rules! ã§è¡çæ§ãæå¹ã ã£ãå ´é¢ã«ä»ãªãã¾ããã
ãã¦ãmodernå½¢å¼ã®ãã¯ã(æç¶ããã¯ãã宣è¨ãã¯ã2.0)ã§ã¯ããã¯ãå ã®èå¥åããã¯ãå¼ã³åºãã®å¤å´ (caller-site) ã®ã¹ã³ã¼ãã§è§£æ±ºããããã¨ã¯ããã¾ããã (Markãããããã)
ãããã«ãé常ã®ã¹ã³ã¼ãå æ¢ç´¢ãçµãã£ããã¨ããã¯ãå®ç¾©ã®å¤å´ (def-site) ã®ã¹ã³ã¼ãã§æ¢ç´¢ãåéããä»çµã¿ã«ãªã£ã¦ãã¾ãã(åã®è¨äºã§ãå°ãè¨åãã¦ãã¾ãã) ããã«ãããããã¯ãå±éåã®æ§é ã«åºã¥ãã¦ã¬ãã·ã«ã«ã¹ã³ã¼ãã§è§£æ±ºãããã¨ããè¡çæ§ã®ç®æ¨ãããåºãéæã§ããããã«ãªã£ã¦ãã¾ãã
ã¤ã³ãã¼ã解決ã¨ãã¯ã
Rustã®ãã¯ãã¯å
ã
ãæ§æè§£æã®å¾ã»åå解決ã®åã«å±éããã¦ãã¾ããããã®åæ®ãããã£ã¦ã #[macro_export] ã®ãªã macro_rules! ã¯ä»ã§ã徿¹å®ç¾©ã許容ãã¾ããã
foo!(); //~ERROR cannot find macro macro_rules! foo { () => { fn f() {} } }
ç¾å¨ã¯ããã¯ã解決ã¯é¨åçã«åå解決ã«çµ±åããã¦ãã¾ãããã®ãããã§å¤é¨ãã¯ãã use ãããã:: ã§åç
§ãããã§ãã¦ãã¾ãã
use log::debug; fn main() { debug!("foo"); log::info!("bar"); }
ããã¯ã¤ã¾ããã¤ã³ãã¼ã解決ãããªããã°ãã¯ããå±éã§ããªãå ´åãããã¨ãããã¨ã§ãã䏿¹ã§ããã¯ãã¯ä»»æã®ã¢ã¤ãã ã«å±éã§ããã®ã§ããã¯ãã®å±éã«ããæ°ããªã¤ã³ãã¼ã解決ãå¿ è¦ã«ãªãå¯è½æ§ãããã¾ãã
ã¤ã³ãã¼ã解決ã¨ãã¯ã: ã³ã³ãã¤ã©ã¢ã¼ããã¯ãã£
Rustã³ã³ãã¤ã©ã¯ syntax 㨠rustc ã¨ãã2大ã¯ã¬ã¼ãã¨ããã®å¨è¾ºã¯ã¬ã¼ãããæãç«ã£ã¦ãã¾ãã rustc 㯠syntax ã«ä¾åãã rustc_* 㯠rustc ã«ä¾åãã rustc_driver ã rustc_* ã«ä¾åããã¨ããå½¢ã§ã³ã¼ããã¼ã¹ãåå²ããã¦ãã¾ãã
ããã§ããã¯ãã®å±é㯠syntax ã®è²¬åã§ããã®ã«å¯¾ããã¤ã³ãã¼ã解決㯠rustc ã®è²¬åã§ãããã®é¨åãç¹ãããã«ã syntax å´ã«DIã®ãããªã¤ã³ã¿ã¼ãã§ã¼ã¹ãç¨æããã¦ãã¾ãã
pub trait Resolver { fn next_node_id(&mut self) -> ast::NodeId; fn get_module_scope(&mut self, id: ast::NodeId) -> Mark; fn resolve_dollar_crates(&mut self, fragment: &AstFragment); fn visit_ast_fragment_with_placeholders(&mut self, mark: Mark, fragment: &AstFragment, derives: &[Mark]); fn add_builtin(&mut self, ident: ast::Ident, ext: Lrc<SyntaxExtension>); fn resolve_imports(&mut self); fn resolve_macro_invocation(&mut self, invoc: &Invocation, invoc_id: Mark, force: bool) -> Result<Option<Lrc<SyntaxExtension>>, Determinacy>; fn resolve_macro_path(&mut self, path: &ast::Path, kind: MacroKind, invoc_id: Mark, derives_in_scope: Vec<ast::Path>, force: bool) -> Result<Lrc<SyntaxExtension>, Determinacy>; fn check_unused_macros(&self); }
syntax ã¯ãã®ãããªããã¹ã渡ãã¨ãã¯ãå®ç¾©ã¸ã®è§£æ±ºã試ã¿ã¦ããããªã©ã¯ã«ããåãåããããã使ããªãããã¯ããå±éãã¦ããã¾ãã
ä¾åæ§ã®å®éã®æ³¨å
¥ã¯ rustc_driver ã§è¡ããã¦ãã¾ããåå解決å¨ããããããçæããä¸ã§ã
- åå解決å¨ã«ãã«ãã¤ã³ãã¯ããç»é²ããã
- åå解決å¨ã使ã£ã¦ããã¯ããå±éããã
- åå解決å¨å´ã ãã§ã§ããå¦ç (ã¤ã³ãã¼ã解決ã®ãã¡ã¤ãã©ã¤ãº + ãã¹è§£æ±º) ãããã
ã¨ãã3段éã®å¦çããã¦ãã¾ãã
ã¤ã³ãã¼ã解決ã¨ãã¯ã: ã·ã£ãã¦ã¤ã³ã°ã®å¦ç
æªå±éã®ãã¯ãã¯åå解決ã«ã¨ã£ã¦ã¯ããã¤ãå°ã£ãåé¡ãããã¾ãã
- æªå±éãã¯ãã¯ä»»æã®ååã追å ã§å®ç¾©ãããã
- æªå±éãã¯ãã¯
extern crateãçæãããã - æªå±éãã¯ãã¯
#[macro_export] macro_rules!{}ãçæãããã
æªå±éãã¯ãã¯ä»»æã®ååã追å ã§å®ç¾©ããã
ãã®ãããæªå±éãã¯ãã®æ®ã£ã¦ããã¢ã¸ã¥ã¼ã«ã§ã¯ãããèå¥åãåå¨ããªããã¨ãçµè«ã¥ãããã¨ã¯ã§ããªãã¨ãã追å è¦åãå¿ è¦ã§ãã
ãã ããã·ã£ãã¦ã¤ã³ã°ã«é¢ãã¦ã¯RFC1560ã«è¿½å ã®è¦åãå®ç¾©ããã¦ãã¾ãã
Caveat: an explicit name which is defined by the expansion of a macro does not shadow implicit names.
ããã«ãããglobã¤ã³ãã¼ãã®ã·ã£ãã¦ã¤ã³ã°ãæ¤è¨ããã¨ãã«ãã¯ããæ°ã«ããå¿ è¦ã¯ãªããªã£ã¦ãã¾ãã
æªå±éãã¯ã㯠extern crate ãçæããã
extern crate ã¯åå解決ã«å¯¾ããã°ãã¼ãã«ãªå½±é¿ãããã¾ããã¯ã¬ã¼ãã«ã¼ãã§ extern crate serde as serde2; ã¨ãããã¨ã«ãã serde2::Serialize ã¨ãããã¹ã解決å¯è½ã«ãªã£ã¦ãã¾ãããã§ãã
ãã®ãããExternPreludeã®è§£æ±ºæã¯ã¯ã¬ã¼ãã«ã¼ãã«æªè§£æ±ºã®ãã¯ããããå ´åãExternPreludeã®éåå¨ãçµè«ã¥ããªãã¨ãã追å è¦åãå¿ è¦ã§ãã
æªå±éãã¯ã㯠#[macro_export] macro_rules!{} ãçæããã
#[macro_export] macro_rules!{} ã使ãã¨ãä»»æã®ä½ç½®ããã¯ã¬ã¼ãã«ã¼ãã«ååãæ¿å
¥ã§ãã¦ãã¾ãã¾ãã
ãã®ããã§åå解決ãé²ã¾ãªãã®ã¯æ¬æã§ã¯ãªãã®ã§ããã¯ãå å®ç¾©ãã¯ãã®ãã¹ã«ããåç §ãç¦æ¢ããã¨ããæ¹åã§å¯¾çããã¦ãã¾ããããã«ããããã¯ã解決æã«æªå±éãã¯ããæ°ã«ããå¿ è¦ã¯ã»ã¼ãªããªã£ã¦ãã¾ãã
ã¾ã¨ã
Rustã¯ãã¯ãã«è¡çæ§ãå°å ¥ãã¦ããããã®ããã§èå¥åã«å¯¾ããå¦çãè¤éã«ãªã£ã¦ãã¾ããããã«æ´å²çãªäºæ ããã£ã¦è¡çæ§ã«ã¯3段éã®ã¬ãã«ãããã®ã§ããã®ãã¨ããã¡ãã¨çè§£ãã¤ã¤ååè§£æ±ºã®æåã追ãã®ã¯å¤§å¤ã§ããã¾ããã¤ã³ãã¼ã解決ã¨ãã¯ãå±éãç¸äºä½ç¨ããã®ãããã®é¨åãè¤éã«ãã¦ããä¸å ã¨ãªã£ã¦ãã¾ãã
ã¨ã¯ããããããã£ãç´°ããé æ ®ã«ãã£ã¦å ¨ä½ã¨ãã¦ã¯ãããªãã«ä¸è²«ãã使ã®ã¢ã¸ã¥ã¼ã«ã·ã¹ãã ãæä¾ããã¦ãããä¸è¬çãªRustããã°ã©ãã¼ã¯ããã¾ã§è¤éãªåé¡ãæ°ã«ããå¿ è¦ããªãããã«ãªã£ã¦ããã¨æãã¾ãã
ããã¾ã§7æ¥éããã¦åå解決ã«ã¤ãã¦ã¾ã¨ãã¾ãããã2å¹´åã«åãé¨åã調ã¹ãã¨ãã«æ¯ã¹ã¦å ¨å®¹ãããè¤éã«ãªã£ã¦ããã¨æãã¾ãããã®ä¸æ¹ã§ã彿ãããã£ãç´°ãã仿§ãå®è£ ã«ã¤ãã¦ãããæ·±ãçè§£ã§ããããã«ãªã£ãã®ã§ããã®è¨äºãã¾ã¨ããç²æãããã¨æãã¾ãã
ãã®è¨äºãéãã§èªã人ãã©ãããããããã¯ãããã¾ãããããã¡ãã¨èªãã°(ããã«ã¯å½¹ç«ããªãã¦ã)Rustã§ã®ããã°ã©ãã³ã°ãåºããæ¯ããåã«ãªãã¨æãã¾ããã¾ããä½ãç´°ãã仿§ã§å°ã£ã人ã«ã¨ã£ã¦ã®è¾æ¸ã¨ãã¦ã使ããè¨äºã«ä»ä¸ãã£ãã¨æãã¾ãã
é¢é£RFC
Rust2018以åã®ä»æ§ã«é¢é£ããRFC
- RFC0063 enforce module directory structure more strictly ...
foo.rsããfoo/bar.rsã¸ã®åç §ãç¦æ¢ (Rust2018ã§ãªãã¼ã) - RFC0116 No Module Shadowing ... åä¸ã¢ã¸ã¥ã¼ã«å ã§useãä»ã®ã¢ã¤ãã ãã·ã£ãã¦ã§ããè¦åã®å»æ¢
- RFC0136 Ban private items in public APIs ... éå ¬éãªåããã¤å ¬éAPIã®ç¦æ¢
- RFC0169 Replace
use id = path;withuse path as id;... å¥åã¤ã³ãã¼ãã®æ§æãç¾å¨ã®ãã®ã«ãªã£ã - RFC0234 Add enum variants to the type namespace ... æ§é ä½ã¨ç°ãªããåæåã®ããªã¢ã³ãã¯å ¨ã¦ã®ç¨®é¡ã§åã»å¤ã®ä¸¡æ¹ã®åå空éãå°æãã
- RFC0385 Module system cleanup ... 2014å¹´ã®ã¢ã¸ã¥ã¼ã«æ¹é©ã
extern crateã®åä½ãuseã¨ä¸æ§ã«ããã - RFC0390 Enum namespacing ... åæåã®ããªã¢ã³ãã
variantã§ã¯ãªãEnum::Variantã§åç §ããããã«ããã - RFC0453 Macro reform ... 宣è¨ãã¯ãã®æ´çã
#[macro_use],#[macro_export],#[macro_reexport]ã¨$crateãå°å ¥ãããã - RFC0459 Disallow type/lifetime parameter shadowing ... åãã©ã¡ã¼ã¿ã¼ã¨ã©ã¤ãã¿ã¤ã ãã©ã¡ã¼ã¿ã¼ã®ã·ã£ãã¼ã¤ã³ã°ã®ç¦æ¢
- RFC0501 Consistent no-prelude attribute ...
#[no_prelude]ã¯å½è©²modèªèº«ã«ããå½±é¿ããªã - RFC0532 Self in use ... RFC0168ã®æ¹è¨ã
{}ã«ããã¤ã³ãã¼ãã§selfã許å¯ããã - RFC0572 Feature gate unused attributes ... æªç¥ã®å±æ§ã®ç¦æ¢
- RFC0735 Allow inherent impls anywhere ... RFC0155ã®ãªãã¼ããåºæimplãå½è©²ã®åã¨åãã¢ã¸ã¥ã¼ã«ã«ç½®ãå¿ è¦ããªããªã£ã
- RFC0736 Privacy-respecting Functional Record Update ... æ§é ä½ã¢ãããã¼ãæ§æã§å¼ãç¶ããããã£ã¼ã«ãã®å¯è¦æ§ããã§ãã¯ããã
- RFC0940 Disallow hyphens in Rust crate names ...
extern crate "tokio-threadpool";ã®ãããªè¨æ³ã廿¢ããèªåçã«ã¢ã³ãã¼ã¹ã³ã¢ã«å¤æãããããã«ãã - RFC1184 Stabilize the
#![no_std]attribute ...#![no_std]ã®å®å®å - RFC1191 Add a HIR to the compiler ... ASTã®æ¬¡æ®µéã¨ãã¦ã®HIR(é«ã¬ãã«ä¸é表ç¾)ã®å°å ¥ãASTâHIRã®éä¸ã§åå解決ãè¡ãã¨è¨åããã¦ãã
- RFC1219 use_group_as ...
use {}ã¨use asã®ä½µç¨ãå¯è½ã«ãã - RFC1260 Allow a re-export for
main...use foo::main;ã®ãããªå½¢ã§main颿°ãå®ç¾©ãã¦ããã - RFC1422 pub(restricted) ... å
¬éã¨éå
¬éã®2æã§ã¯ãªãã
pub(in)æ§æã§ä¸éã®å¯è¦æ§(ç¹å®ã®ã¢ã¸ã¥ã¼ã«ã«ã®ã¿å ¬é)ã鏿ã§ããããã«ãã - RFC1560 Changes to name resolution ... 2016å¹´ã®ã¢ã¸ã¥ã¼ã«æ¹é©ãåå解決ã«é¢ããç´°ãã仿§ãæ¹ãããã¨ã§ãå°æ¥ã®æ©è½è¿½å (RFC1422ãRFC1561) ã«èããããããã«ãã
- RFC1566 proc macros ... æç¶ããã¯ãã®æ¡å
ãæç¶ããã¯ãã
extern crateããã¨ãã®(彿ã®)æåãæå®ããã¦ãããRFC1681ã®ã»ããåã«ãã¼ã¸ããã¦ãããã¨ã«æ³¨æã - RFC1681 Procedural macros 1.1 ... æç¶ããã¯ãã®æ¡å ãRFC1566ã®ã»ããå¾ã«ãã¼ã¸ããã¦ãããã¨ã«æ³¨æã
Rust2018ã«é¢é£ãã(ã¾ãã¯2018å¹´é ã«å®è£ ããã)RFC
- RFC1561 Macro naming and modularization ... RFC1584ã®ä¸é¨ã§ããã¯ããåå解決ã«çµ±åãããã¨ãææ¡ãã¦ãã
- RFC2103 tool attributes ... ãã¼ã«ã®ããã®ã¢ã¸ã¥ã¼ã«åããã屿§ãããã«ãã
rustfmtãclippyãªã©ã®extern preludeã¢ã¸ã¥ã¼ã«ãå°å ¥ããããã¨ã«ãªã£ãã - RFC2126 Path Clarity ... Rust2018ã®ã¢ã¸ã¥ã¼ã«æ¹é©ãææ¡ããRFC
- RFC2128 Nested groups in imports ...
use {}ã®ãã¹ããå¯è½ã«ãã - RFC2166 impl-only-use ...
use FooExt as _;ã®ãããªç¡åã¤ã³ãã¼ããå¯è½ã«ããã
å®è£ éä¸ã®RFC
- RFC1584 Macros 2.0 ... 宣è¨ãã¯ãã®å·æ°ãææ¡ããRFCãRFC1561ã®è¦ªRFC
- RFC1977 public/private dependencies ... ä¾åé¢ä¿ã«private/publicã®å¥ãã¤ãã
- RFC2145 Type privacy and private-in-public lints ... RFC0136 (public-in-private) ã®è¦åãæ´çããlintã¸éæ ¼ãã
- RFC2338 type alias enum variants ... åæåã®åã¨ã¤ãªã¢ã¹ãããããªã¢ã³ãåãåç §ã§ããããã«ãã
- RFC2526 Support underscores as constant names ...
const _: i32 = 42;ã®ãããªç¡å宿°ã®å®ç¾©ãå¯è½ã«ãã
Rustã®ã¢ã¸ã¥ã¼ã«ã詳細ã«çè§£ãã(6) ãã¹è§£æ±º
æ¦è¦: Rust2018以éãRustã®ã¢ã¸ã¥ã¼ã«ã·ã¹ãã ã¯å ¥éããããããã¤ãã¹ã¿ã¼ãã«ãããªãã¾ãããããã§æ¬è¨äºã§ã¯ããã®ä¸¡æ¹ãéæãããã¨ãç®æãã¾ããã
- ã¢ã¸ã¥ã¼ã«å ¥é
- åå解決ã®å½¹å²ã¨ç¨èª
- ã¢ã¸ã¥ã¼ã«ã°ã©ãã®æ§é
- ã¤ã³ãã¼ã解決
- å¯è¦æ§
- ãã¹è§£æ±º
- åå解決ã¨ãã¯ã
æ¬è¨äºã¯2017å¹´ã«æ¸ããè¨äº (https://qnighy.hatenablog.com/entry/2017/03/27/070000, https://qnighy.hatenablog.com/entry/2017/04/24/070000 ) ã¨åããã¼ãã§ãRust2018ãèæ ®ãã¦æ¹ãã¦ã¾ã¨ãç´ãããã®ã§ãã
注æ: æ¬è¨äºä¸ã®ãµã³ãã«ã³ã¼ãã®å¤ãã¯ãRustã®ç´°ãã仿§ãå®è£ ã調ã¹ãããã®ãã®ã§ãããå®éã«æç¨ãªããã°ã©ãã³ã°ãã¿ã¼ã³ã§ããã¨ã¯éãã¾ãããã¾ããå®è³ªçã«ãã°ã«è¿ãæåã説æãã¦ãããã®ããããããå°æ¥ã«ããã£ã¦åãåä½ã§ãããã¨ã¯ãã¾ãä¿è¨¼ã§ãã¾ããã
ä»®æ³ã¢ã¸ã¥ã¼ã«
globã§ã¯ãªã use ã¯å¿
ããã©ã®ã¢ã¸ã¥ã¼ã«ããããä½ãããä½ã¨ããååã§ãã¤ã³ãã¼ããããã¨ããå½¢ã§è¡¨ç¾ããã¾ããããã use crate as foo; ã use foo as bar; ãªã©åä¸ã»ã°ã¡ã³ããããªããã¹ã®ã¤ã³ãã¼ãã®å ´åã¯ãã©ã®ã¢ã¸ã¥ã¼ã«ãããã«ç¸å½ããé©åãªã¢ã¸ã¥ã¼ã«ããªãå ´åãããã¾ããããã§åå解決æã¯3ã¤ã®ä»®æ³ã¢ã¸ã¥ã¼ã«ãç¨æããã¦ãã¾ãã
CrateRootAndExternPrelude... ãä»®æ³Rust2015ã¢ã¼ããã«ããã::éå§ãã¹ã§ä½¿ããããã«ã¼ãã¢ã¸ã¥ã¼ã«ã¨ãã¦æ¯ãèãããã«ã¼ãã«ãªããã®ã«é¢ãã¦ã¯ExternPreludeã«ãã©ã¼ã«ããã¯ãããExternPrelude... Rust2018ã«ããã::éå§ãã¹ã§ä½¿ããããå¤é¨ã¯ã¬ã¼ãåã解決ãããCurrentScope...::éå§ãã¹ä»¥å¤ã®å§ç¹ã
ExternPreludeä»®æ³ã¢ã¸ã¥ã¼ã«ã®è§£æ±º
::foo::bar ã¯Rust2015ã¨Rust2018ã§æ¯ãèããç°ãªãã¾ãã
- Rust2015ã§ã¯
crate::foo::barã¨åãã - Rust2018ã§ã¯
fooã¯ã¬ã¼ã以ä¸ã®barã¨åãã (=ExternPreludeã使ããã)
ã§ã¯ExternPreludeä»®æ³ã¢ã¸ã¥ã¼ã«ã解決ãããã¯ã¬ã¼ãåãã¨ã¯ä½ã§ãããããå ·ä½çã«ã¯ä»¥ä¸ã使ããã¾ãã
- rustcã«
--externã¨ãã¦æ¸¡ããããã® (=Cargo.tomlã®ä¾åé¢ä¿) #![no_core]ããªãå ´åãcore#![no_core],#![no_std]ããªãå ´åãstd#![no_core],#![no_std]ããªãRust2018ã¢ã¼ãã§ã³ã³ãã¤ã«ããã¦ããå ´åãmeta- ã¯ã¬ã¼ãã«ã¼ãã«
extern crate foo as bar;ãããå ´åããããå°å ¥ããå¥å (i.e.bar)
æå¾ã®è¦åã®ãããã§ã以ä¸ã®ãããªã³ã¼ããRust2015/2018ãã¤ã°ã¬ã¼ã·ã§ã³ã³ã¼ãã¨ãã¦è¨±ããããã¨ã«ãªãã¾ãã
extern crate serde_json as json; mod m1 { pub fn foo() { let ((),) = ::json::from_str("[null]").unwrap(); } }
ããã«é¢é£ãã¦ã extern crate self as foo; ã¨ããæ§æãå°å
¥ããã¦ãã¾ãããã㯠use crate as foo; ã¨ä¼¼ã¦ãã¾ãããä¸è¨ã®ããã«ExternPreludeã«å¥åãå°å
¥ãã追å 广ãããã¾ãã
ãã¨ãã°ã serde_derive ã serde:: ã§å§ã¾ããã¹ãå
é¨çã«çæããã¨ãã¾ããããã serde èªèº«ãã使ãã«ã¯ extern crate self as serde; ã¨ãã¦ããã°ããããã§ãã
CrateRootAndExternPreludeä»®æ³ã¢ã¸ã¥ã¼ã«ã®è§£æ±º
:: ã§ã¯ãã¾ããã¹ã¯ä»¥ä¸ã®æ¡ä»¶ã§ç¹æ®ãªåä½ããã¾ãã
- ã°ãã¼ãã«Rust2018ã¢ã¼ãã§ãã (=ä»ã³ã³ãã¤ã«ãããã¨ãã¦ããã¯ã¬ã¼ããRust2018)
- å½è©²ãã¹ãRust2015ã¯ã¬ã¼ãã«ç±æ¥ãã¦ãã
ãã®å ´åã¯ä»®æ³Rust2015ã¢ã¼ãã¨å¼ã°ãã絶対ãã¹(Rust2015)ã¨ExternPreludeãã¹(Rust2018)ã®ä¸¡æ¹ã«è§£æ±ºããã¾ãããã®ããã®ä»®æ³ã¢ã¸ã¥ã¼ã«ãCrateRootAndExternPreludeã§ãã
CurrentScopeä»®æ³ã¢ã¸ã¥ã¼ã«
CurrentScopeã¯éå¸¸ã®æ¹æ³ã§ãã¹ã解決ãã¾ãã use ãåä¸ã»ã°ã¡ã³ããããªãåç¬ã¤ã³ãã¼ãã ã£ãå ´åã«ä½¿ããã¾ãããã¨ãã°ã use foo as bar; ã§ããã°ã CurrentScopeãã foo ã bar ã¨ãã¦ã¤ã³ãã¼ãããã¨ããå½¢ã§è¡¨ç¾ãã¾ãã
è¤æ°ã»ã°ã¡ã³ããããªãå ´åããã¨ãã° use foo::bar as baz; ã§ããã° foo ãã bar ã baz ã¨ãã¦ã¤ã³ãã¼ãããã¨è¡¨è¨ã§ãããã使ããã¾ããã
ãã¹å ¨ä½ã®è§£æ±º
ããã¾ã§ä½åº¦ãè¿°ã¹ãããã«ããã¹ã®ä¸ã§ã pub(in) 㨠use ã¯ç¹æ®ã§ããã pub(in) ã¯å
¨ãå¥ã®ã¡ã½ããã§ãã¹è§£æ±ºããã¾ããã use ã¯ä»®æ³ã¢ã¸ã¥ã¼ã«ããããã®ã§ããç¹æ®ã§ãããã以å¤ã®ãã¹ã¯ã主㫠resolve_path ã§è§£æ±ºããã¾ãã
ãã¹è§£æ±ºã®å
¨ä½ã®æµãã¯ã·ã³ãã«ã§ãã foo::bar::baz ãå¤ã¨ãã¦è§£æ±ºãããå ´åãã¾ã foo ãååå空éã§è§£æ±ºãã¾ããæ¬¡ã« foo ã®ç´ä¸ã§ååå空éã® bar ã解決ãã¾ããæå¾ã« foo::bar ã®ç´ä¸ã§å¤åå空éã® baz ã解決ãã¾ãããã¤ã³ãã¯3ã¤ã§ãã
- æå¾ã®ã»ã°ã¡ã³ãã¯ææã®åå空éã§è§£æ±ºãã¾ããããã以å¤ã®ã»ã°ã¡ã³ãã¯ååå空éã§è§£æ±ºãã¾ãã (ã¢ã¸ã¥ã¼ã«ã»åã»ãã¬ã¤ãã§ãããã¨ãæå¾ ããããã)
- æåã®ã»ã°ã¡ã³ãã®è§£æ±ºã¯è¤éã§ãã
- å é ã«ç¹æ®ãªæ¥é è¾ãã¤ãã¦ããå ´åãããã¾ãã
æ¥é è¾ã¤ãã®ãã¹ã®è§£æ±º
:: æ¥é è¾
:: ã«ã¤ãã¦ã¯ãã§ã«èª¬æããéããRust2015ã§ã¯çµ¶å¯¾ãã¹ãRust2018ã§ã¯extern preludeãã¹ã¨ãã¦è§£éããã¾ãã
絶対ãã¹æ¥é è¾
crate:: ã¾ã㯠$crate:: ã§å§ã¾ããã¹ã¯çµ¶å¯¾ãã¹ã§ãããã®ã¨ãã crate/$crate ã¨ãããã¼ã¯ã¼ããç±æ¥ããã¯ã¬ã¼ãã®çµ¶å¯¾ãã¹ã¨ãã¦è§£æ±ºããã¾ãããã¨ãã°ãfutures-0.1ã® try_ready! ãã¯ãã¯ä»¥ä¸ã®ããã«æ¸ããã¦ãã¾ãã
#[macro_export] macro_rules! try_ready { ($e:expr) => (match $e { Ok($crate::Async::Ready(t)) => t, Ok($crate::Async::NotReady) => return Ok($crate::Async::NotReady), Err(e) => return Err(From::from(e)), }) }
ãã® $crate ã¯å¿
ããã®futuresã¯ã¬ã¼ãã®ã«ã¼ãã«å±éããã¾ãããã®ãããä»ã®ã¯ã¬ã¼ãã§ try_ready! ãå¼ã³åºãã¦ãæ£ããåä½ãã¾ãã
$crate ã¯RFC0453ã§å°å
¥ããããã¯ãå°ç¨ã®ãã¼ã¯ã¼ãã§ããã crate:: (RFC2126) ãåä½ã¯ã»ã¼åãã§ãããã¡ãã¯ãã¯ã以å¤ã§ã使ãã¾ãã
ç¸å¯¾ãã¹æ¥é è¾
self:: ã¾ã㯠super:: ã§å§ã¾ããã¹ã¯ç¸å¯¾ãã¹ã§ãã self/super ããã®æå³ã§è§£éããã®ã«ã¯ä»¥ä¸ã®æ¡ä»¶ãå¿
è¦ã§ãã
- ãã®
self/superããã¹ã®æ«å°¾ã§ãã£ã¦ã¯ãããªããuseã«é¢ãã¦ã¯ãã®éãã§ã¯ãªãããç¾å¨ã¯å®è£ ããã¦ããªãã
selfã¯ãã¹ã®å é ã«ç½®ãå¿ è¦ããããsuperã¯ãã¹ã®å é ãself/superã®ç´å¾ã«ç½®ãå¿ è¦ãããã
let x = self::foo; let x = self::super::foo; let x = super::foo; let x = super::super::foo;
self/super ãè¨ç®ããã¨ãã¯ãããªããæ£è¦ã¢ã¸ã¥ã¼ã«ãçµæã«ãªãããã«èª¿æ´ããããã¨ã«æ³¨æãã¦ãã ãããæ£è¦ã¢ã¸ã¥ã¼ã«ã¨ã¯ãã¯ã¬ã¼ãã«ã¼ãã¾ã㯠mod ã§å®ç¾©ãããã¢ã¸ã¥ã¼ã«ã®ãã¨ã§ããæ£è¦ã§ã¯ãªãã¢ã¸ã¥ã¼ã«ã¨ã¯ã enum, trait ã¾ãã¯ãããã¯ã®ãã¨ã§ããæ£è¦ã¢ã¸ã¥ã¼ã«ã«èª¿æ´ããã«ããã£ã¦ã¯æ£è¦ç¥å
(èªåèªèº«ãå«ããç¥å
ã®ä¸ã§æãè¿ãæ£è¦ã¢ã¸ã¥ã¼ã«) ã使ããã¾ãã
const X: i32 = 42; fn main() { const X: i32 = 53; dbg!(self::X); // 42 }
super:: 㯠self::super:: ã®çç¥å½¢ã ã¨èãã¦ã
self::= ç¾å¨ã®ã¢ã¸ã¥ã¼ã«ã®æ£è¦ç¥å ::super= ãã®è¦ªã¢ã¸ã¥ã¼ã«ã®æ£è¦ç¥å
ã¨ãã風ã«å®ç¾©ã§ãã¾ããã¯ã¬ã¼ãã«ã¼ãã® super ãã¨ããã¨ããã¨ã¨ã©ã¼ã«ãªãã¾ãã
æ¥é è¾ã®ãªããã¹ã®è§£æ±º
æ¥é è¾ã®ãªããã¹ã¯ã°ãã¼ãã«ããã¼ã«ã«ã®ããããã«è§£æ±ºããã¾ããããã¾ã§ã®è°è«ã§ã¯å®å ¨ã«ç¡è¦ãã¦ãã¾ããããã¨ãã¨ããã¼ã«ã«æç¸ã®ãã¨ãèãã¦ãããå¿ è¦ãåºã¦ãã¾ãã(ãªãããå¿åã¢ã¸ã¥ã¼ã«(ãããã¯)å ã§å®ç¾©ãããã¢ã¤ãã ãã¯ãã®æå³ã§ã¯ã°ãã¼ãã«ã§ã)
æ¥é è¾ã®ãªããã¹ã®1ã»ã°ã¡ã³ãç®ã¯ä»¥ä¸ã®åªå 度ã§è§£æ±ºããã¾ãã
- é常ã®ã¬ãã·ã«ã«ã¹ã³ã¼ãã®ãã¼ã«ã«å®ç¾©ã¾ãã¯ã°ãã¼ãã«å®ç¾© (åãé層ã§ã¯ãã¼ã«ã«å®ç¾©åªå )
- è¡ççã¬ãã·ã«ã«ã¹ã³ã¼ãã®ã°ãã¼ãã«å®ç¾©
- extern prelude
- ãã¼ã«å±æ§ã®ããã®ã¢ã¸ã¥ã¼ã«
- é常ã®ãã¬ãªã¥ã¼ã
é常ã®ã¬ãã·ã«ã«ã¹ã³ã¼ãã®è§£æ±º
æ¥é è¾ã®ãªããã¹ã¯resolve_ident_in_lexical_scopeã§è§£æ±ºããã¾ããã¬ãã·ã«ã«ã¹ã³ã¼ãã¯ã¢ã¸ã¥ã¼ã«ãããç´°ãããªã (rib) ã¨ããé層ã§å¦çããã¾ãã
ãªãã¯åå空éå¥ã«å¥ã ã«ç®¡çããã¦ãããå¤åå空éã»ååå空éã«å¯¾ãã¦ç»é²ããã¾ãã (â»ãã¯ãç¨ã®ãªãã¯ãªã) ã¾ãããã¨ã¯å¥ã«ã©ãã«ã管çãããªããããã¾ãã
ãã¨ãã°ã fn ãã¯ãã¼ã¸ã£ã¯å¼æ°æç¸ãããã®ã§å¤åå空éã«ãªããä½ãã¾ãã let ã¯letæç¸ãããã®ã§å¤åå空éã«ãªããä½ãã¾ããã¸ã§ããªã¯ã¹ã¯ååå空éã«ãªããä½ãã¾ãã
ã¾ããã¢ã¸ã¥ã¼ã«èªèº«ããªãã§ãã
//^ã¯ã¬ã¼ãã«ã¼ãã®rib (ValueNS, TypeNS) fn id<T>(x: T) { //^ã¸ã§ããªã¯ã¹å¼æ°ã®rib (TypeNS) //^弿°ã®rib (ValueNS) //^å¿åã¢ã¸ã¥ã¼ã«ã®rib (ValueNS, TypeNS) let y = x; //^letæç¸ã®rib (ValueNS) y }
ã¬ãã·ã«ã«ã¹ã³ã¼ãã§ååã解決ããã¨ãã¯ãä»ããä½ç½®ã§æå¹ãªãªããä¸ããä¸ã«é¡ã£ã¦æ¢ç´¢ãã¦ããã¾ããã¢ã¸ã¥ã¼ã«ãªããªããããã«ã°ãã¼ãã«ãªååã®è§£æ±ºã試ã¿ã¾ããããã¦ãæ£è¦ã¢ã¸ã¥ã¼ã«ã®ãªãã«å°éããããããã§æ¢ç´¢ãçµäºãã¾ãã
ãã®ãããåºæ¬çã«ã¯ mod å
ã»ãã®å ´æã§æå¹ãªå®ç¾©ã®ãã¡ãæãè¿ããã®ã«è§£æ±ºããããã¨ã«ãªãã¾ãã (ã·ã£ãã¦ã¤ã³ã°ã®ä¸è¬çãªè¦å)
fn f(x: i32) { // (1) // (1) ã«è§£æ±ºããã (1ã®ribã®ã¿ãæå¹) let x: i32 = 42; // (2) // (2) ã«è§£æ±ºããã (1, 2ã®ribãæå¹) let x: i32 = 53; // (3) // (3) ã«è§£æ±ºããã (1, 2, 3ã®ribãæå¹) { // (3) ã«è§£æ±ºããã (1, 2, 3ã®ribãæå¹) let x: i32 = 64; // (4) // (4) ã«è§£æ±ºããã (1, 2, 3, 4ã®ribãæå¹) } // (3) ã«è§£æ±ºããã (1, 2, 3ã®ribãæå¹) }
ãã ããããã§ãããæå¹ãªå®ç¾©ãã¯åå¥çãªç¯å² (let ã®å ´åã¯ãã® let ã®çµããã¾ã§) ã§å¤å®ããããã£ããã£ã¼å¯è½æ§ãªã©æå³çãªæ¡ä»¶ã¯ä½¿ããã¾ããããã®ããã
fn x() {} fn f(x: i32) { fn g() { // 颿°xã§ã¯ãªãã颿°fã®å¼æ°xã«è§£æ±ºãããã // ãããã颿°ã¯ç°å¢ããã£ããã£ã¼ã§ããªãã®ã§ã¨ã©ã¼ã«ãªãã x; //~ERROR can't capture dynamic environment in a fn item } } type T = i32; fn g<T>() { // åã¨ã¤ãªã¢ã¹Tã§ã¯ãªãã颿°gã®åãã©ã¡ã¼ã¿ã¼Tã«è§£æ±ºãããã // ããããã¢ã¤ãã ã¯å¤å´ã®ã¸ã§ããªã¯ã¹ã«é¢ä¿ãªãã®ã§ã¨ã©ã¼ã«ãªã const X: Option<T> = None; //~ERROR can't use generic parameters from outer function }
ã¾ããã·ã£ãã¦ã¤ã³ã°ãå¥éç¦æ¢ããã¦ããå ´åãããã¾ãããã¨ãã° let å
ã§ const ã¨ååã®æç¸ãå°å
¥ããã¨å®æ°ãã¿ã¼ã³ã«ãªãã static ã¨ååã®æç¸ãå°å
¥ããã¨ã¨ã©ã¼ã«ãªãã¾ãã
const X: i32 = 42; static Y: i32 = 42; fn main() { let X = 42; //~ERROR refutable pattern in local binding let Y = 42; //~ERROR let bindings cannot shadow statics }
ãã¼ã«ã«å®ç¾©ã¨ã°ãã¼ãã«å®ç¾©ã®éã«ããåºæ¬çã«ã¯æè¿åªå ã®ã«ã¼ã«ãé©ç¨ã§ãã¾ãã
fn foo() { let x = 42; { fn x() -> i32 { 42 } // ããå å´ã§å®ç¾©ããã¦ãã颿°xã«è§£æ±ºããã dbg!(x() + 11); } } fn bar() { fn x() {} { let x = 42; // ããå å´ã§å®ç¾©ããã¦ãã夿°xã«è§£æ±ºããã dbg!(x + 11); } }
ãã ããã°ãã¼ãã«å®ç¾©ã®ã¿ã¤ã ãã©ãã«ã«æ³¨æãå¿ è¦ã§ãã
fn main() { // å¿åã¢ã¸ã¥ã¼ã«ã®ãªãã¯ããããéå§ãã(âãããã¯ã®çµããã¾ã§)ã // ãã®ããã颿°fã¯ãã®ä½ç½®ããæå¹ // ãã®æç¹ã§ã¯å¤æ°fã¯åå¨ããªãã®ã§é¢æ°fã«è§£æ±ºããã assert_eq!(f(), 42); let f = || 53; // letã«å¯¾å¿ãããªãã¯ããããéå§ãã(âãããã¯ã®çµããã¾ã§)ã // ããã§ã¯é¢æ°fã¨å¤æ°fã®ä¸¡æ¹ãæå¹ã ãã // 夿°fã®ã»ããè¿ã (ããå å´ã§å®ç¾©ããã¦ãã) // ã®ã§ãã¡ããæ¡ç¨ããã assert_eq!(f(), 53); fn f() -> i32 { 42 } }
ãã®ãããã¬ãã·ã«ã«ã¹ã³ã¼ãã®ã·ã£ãã¦ã¤ã³ã°ã®åªå
度ãèããã¨ãã¯ãã¢ã¤ãã (fn ã staticãªã©ã°ãã¼ãã«ã«ç½®ãããã®)ã¯ã¢ã¸ã¥ã¼ã«(å¿åã¢ã¸ã¥ã¼ã«ã®å ´åã¯ãããã¯)ã®å
é ã«ç§»åããã¨æã£ã¦èããã¨ããããããã§ãã
è¡ççã¬ãã·ã«ã«ã¹ã³ã¼ã
RFC1584ã®å®ãã宣è¨ãã¯ã2.0ã§ã¯ãç¾å¨ã® macro_rules! ãããåºç¯å²ã®ãã¯ãè¡çæ§ããµãã¼ããã¦ãã¾ãã
#![feature(decl_macro)] mod m1 { const X: i32 = 42; pub macro f() { dbg!(X); } } fn main() { m1::f!(); }
ãã®å ´åããã¯ããå±éããã¨ä»¥ä¸ã®ããã«ãªãã¾ãã
mod m1 { const X: i32 = 42; pub macro f() { dbg!(X); } } fn main() { // mark[1] { // of m1::f!() dbg /* [1] */ ! ( X /* [1] */ ); // } }
è¡çæ§æãã§ã¯ããã® X ã¯è§£æ±ºã§ãã¾ããããããããã®èå¥å X ã¯ãã¯ãå±é [1] ã«ç±æ¥ãã¦ããã®ã§ããããªãæ¢ç´¢ãè¡ããã¾ãããã¯ãå±é [1] ã§ä½¿ããããã¯ã㯠m1::f ãªã®ã§ã f ãå®ç¾©ãããæã®ã¹ã³ã¼ã m1 ã§ã X ã®è§£æ±ºã試ã¿ã¾ãã
extern prelude ãã©ã¼ã«ããã¯
ç¥å
ã¢ã¸ã¥ã¼ã«ã§ #![no_implicit_prelude] ãå®ç¾©ããã¦ããªããã°extern preludeã¸ã®ãã©ã¼ã«ããã¯ã調ã¹ããã¾ãã
Rust2018ã§åã« std::iter::once ã®ããã«æ¸ããã¨ãã«æ¨æºã©ã¤ãã©ãªãåç
§ãããã®ã¯ãã®ä»çµã¿ã«ãããã®ã§ãã (ããããããã¾ã§æ¥ãâ¦â¦)
ãã¼ã«å±æ§ã®ããã®ã¢ã¸ã¥ã¼ã«
ç¥å
ã¢ã¸ã¥ã¼ã«ã§ #![no_implicit_prelude] ãå®ç¾©ããã¦ããªããã°ãæ¢ç¥ã®ãã¼ã«å±æ§ã¢ã¸ã¥ã¼ã«ã¸ã®ãã©ã¼ã«ããã¯ã調ã¹ããã¾ãã
ãã¼ã«å±æ§ã¨ã¯RFC2103ã§è¦å®ããã¦ããããã³ã³ãã¤ã©ã¯ç¥ããªããå¨è¾ºãã¼ã«ãç¥ã£ã¦ãã屿§åããå®å ¨ã«å°å ¥ããä»çµã¿ã§ãã
ãã¨ãã°rustfmtã§ç¹å®ã®ã¢ã¤ãã ã®ãã©ã¼ããããææ¢ããã«ã¯ä»¥ä¸ã®ããã«ãã¦ãã¾ããã
#[cfg_attr(rustfmt, rustfmt_skip)] fn foo() {}
åã« #[rustfmt_skip] ã¨æ¸ãã°ããããã«è¦ãã¾ãããRFC0572ã§è¦å®ããã¦ããéãã³ã³ãã¤ã©ã¯åæ¹äºææ§ã®ããã«æªç¥ã®å±æ§ãã¨ã©ã¼ã«ãããã¨ã«ãªã£ã¦ãã¾ãããã®ãã rustfmt ã¨ããrustfmtå¦çæããæå¹ã«ãªããªãcfgã§æ¡ä»¶ãã¤ãã¦ããå¿
è¦ãããã¾ããã
RFC2103ã¯ããã解決ããããã«å±æ§ã®ã¢ã¸ã¥ã¼ã«åããããã®ã§ãããã«ããæ¬¡ã®ããã«æ¸ããããã«ãªãã¾ããã
#[rustfmt::skip] fn foo() {}
ããã¯é常ã®åå解決ã®ä»çµã¿ã«ããç¨åº¦ä¹ã£ãã£ã¦ãã¾ãããã®å ´åã¯ãã¯ãåå空éã§ rustfmt::skip ã解決ããã¦ãããã¨ã«ãªãã¾ãã
ããã¦ãåããRFC0572ã«è¨åããã¦ããããã«ãå½é¢ã®å®è£
ã§ã¯ãã¼ã«åã¯åºå®ã§ããç¾æç¹ã§ã¯ rustfmt 㨠clippy ãæ¢ç¥ã®ãã¼ã«åã¨ãã¦æ±ããã¦ãã¾ãã
ãã®ãã以ä¸ã®ãããªå¥å¦ãªã³ã¼ãã®ã³ã³ãã¤ã«ãéãã¾ãã
use {clippy, rustfmt};
é常ã®ãã¬ãªã¥ã¼ã
ç¥å
ã¢ã¸ã¥ã¼ã«ã§ #![no_implicit_prelude] ãå®ç¾©ããã¦ããªããã°ãé常ã®ãã¬ãªã¥ã¼ãã¸ã®ãã©ã¼ã«ããã¯ã調ã¹ããã¾ãã
ããç¥ããã¦ããããã«Rustã®æ¨æºã©ã¤ãã©ãªã«ã¯preludeã¢ã¸ã¥ã¼ã«ãããããã®ä¸ã«ããã¢ã¤ãã ã¯æç¤ºçãªã¤ã³ãã¼ããªãã§ä½¿ç¨ã§ããããã«ãªã£ã¦ãã¾ãã
ãããå®ç¾ããããã«ã¾ããæ§æè§£æã®ã¿ã¤ãã³ã°ã§ä»¥ä¸ã®ãããªç¹æ®ãª use ãåãè¾¼ã¾ãã¾ãã
#[prelude_import] use ::std::prelude::v1::*;
åãè¾¼ã¾ããã¢ã¸ã¥ã¼ã«ã¯å®éã«ã¯æ¡ä»¶ã«ãã£ã¦ç°ãªãã¾ãã
#![no_core]ãæå®ãããã¨ãã¯ãä½ãåãè¾¼ã¾ãã¾ããã#![no_core]ã§ã¯ãªãã#![no_std]ãæå®ãããã¨ãã¯ã以ä¸ã®2éãã®ã©ã¡ããã«ãªãã¾ãã#![compiler_builtins]ãæå®ãããã¨ãã¯ãextern crate core; #[prelude_import] use ::core::prelude::v1::*;ãåãè¾¼ã¾ãã¾ãã#![compiler_builtins]ãæå®ãããªãã£ãã¨ãã¯ãextern crate core; extern crate compiler_builtins; #[prelude_import] use ::core::prelude::v1::*;ãåãè¾¼ã¾ãã¾ãã
#![no_core]ã#![no_std]ãæå®ãããªãã£ãã¨ãã¯ãextern crate std; #[prelude_import] use ::std::prelude::v1::*;ãåãè¾¼ã¾ãã¾ãã
åç¸å¯¾ãã¹ãèæ ®ãããã¹è§£æ±º
ããã¾ã§ã§èª¬æããã®ã¯åç¸å¯¾ã§ã¯ãªãå ´åã®ãã¹ã®è§£æ±ºã§ããã resolve_qpath ã¯ãããã«å ãã¦åç¸å¯¾ãã¹ãèæ
®ãã解決ãè¡ãã¾ãã
<T>::A::Bã®å ´åã¯ä½ãããããã¹å ¨ä½ (A::B) ãæªè§£æ±ºã¨ãã¦è¿ãã¾ãã<T as A::B>::C::Dã®å ´åã¯<>::ã®ç´å¾ã¾ã§ (ãã®å ´åã¯<T as A::B>::C) ã®è§£æ±ºã試ã¿ã解決ã§ããã¨ããã¾ã§ãè¿ãã¾ããA::B::Cã®å ´åã¯åã«è§£æ±ºã§ããã¨ããã¾ã§ãè¿ãã¾ãã
ãã ãã A::B::C å½¢å¼ã®ãã¹ã®è§£æ±ºã«å¤±æããå ´åãããªããã£ãåã¸ã®ãã©ã¼ã«ããã¯ãæ¤è¨ããã¾ãã
use std::i32; fn main() { let x: i32 = 42; // i32 (as a type) dbg!(i32::MAX); // std::i32::MAX dbg!(i32::max_value()); // <i32>::max_value }
ããªããã£ãåã¸ã®ãã©ã¼ã«ããã¯ã¯ã以ä¸ã®æ¡ä»¶ã§çºçãã¾ãã
- å é ã»ã°ã¡ã³ããããªããã£ãååã¨ä¸è´ãã
- å é ã»ã°ã¡ã³ããååå空éã§è§£æ±ºãããã¨ãã¦ãã (=å ¨ä½ãååå空éã§è§£æ±ºãããã¨ãã¦ãã or é·ã2以ä¸ã®ãã¹ã解決ãããã¨ãã¦ãã)
- ãã¹ã®å ¨ä½ã¾ãã¯éä¸ã¾ã§ãæ£è¦ã¢ã¸ã¥ã¼ã«ã«è§£æ±ºããã
ãã®å ´åãéå¸¸ã®æ¹æ³ã§è§£éãã¦ãæã¿ããªããã¨ã¯æãã(ã¢ã¸ã¥ã¼ã«ã® :: ã¯ååè§£æ±ºã®æç¹ã§è§£æ±ºã§ããã¯ã)ãªã®ã§ãå
é ã»ã°ã¡ã³ããããªããã£ãååã¨ãã¦èªã¿æ¿ããåç¸å¯¾ãã¹ã¨ãã¦è§£éãã¾ãã
ã¹ã³ã¼ãå ãã¬ã¤ãã®åæ
ã¤ã³ãã¼ã解決ã§å¾ãããçµæã¯ããã¹è§£æ±ºã®ã»ãã«ãã¹ã³ã¼ãå ãã¬ã¤ãã®åæã®ããã«ã使ããã¾ããããã¯Rustã®ä»¥ä¸ã®è¦åã®ããã«å¿ è¦ã§ãã
<T>::Aã¯ãåTèªèº«ã®åºæå®è£ ã®ã»ããã¹ã³ã¼ãå ã«ãããã¬ã¤ãã®å®è£ ããæ¢ç´¢ããããx.method()ã¯ãxã®(èªååç §ã»èªååç §å¤ãã®é©ç¨å¾ãå«ã)åã®åºæå®è£ ã¾ãã¯ã¹ã³ã¼ãå ã«ãããã¬ã¤ãã®å®è£ ããæ¢ç´¢ãããã
é¢é£ã¢ã¤ãã ãã¡ã½ããã®è§£æ±ºãã¹ã³ã¼ãå ãã¬ã¤ãã«éå®ãããã¨ã§ããä¾åã©ã¤ãã©ãªãå¢ãããã ãã§åæã«ã¡ã½ããåã®è§£æ±ºé ãå¤ãããã¨ãããããªä¸å®å®ãªæåãæ¥µåæããæå³ããããã®ã¨æããã¾ãã
ãã¹ã³ã¼ãå ãã¨è¨ã£ã¦ããã ããã£ã¦ãããã¯é常ã®ãã¹ã®æåã®ã»ã°ã¡ã³ãã®è§£æ±ºã¨ã»ã¼åãæåããã¾ããå ·ä½çã«ã¯ä»¥ä¸ã®åªå é ä½ã§æ¢ç´¢ãè¡ããã¾ãã
- ç¾å¨å®è£ ä¸ã®ãã¬ã¤ã
- ã¬ãã·ã«ã«ã¹ã³ã¼ãå ã®ãã¬ã¤ã
- è¡ççã¬ãã·ã«ã«ã¹ã³ã¼ãå ã®ãã¬ã¤ã
- é常ã®ãã¬ãªã¥ã¼ãå ã®ãã¬ã¤ã
2ãã4ã¯ã»ã¼åããªã®ã§çãã¾ãããç¾å¨å®è£ ä¸ã®ãã¬ã¤ãããæ¢ç´¢ããããã¨ã§ä»¥ä¸ã®ãããªã³ã¼ãã許容ããã¦ãã¾ãã
use std::fmt; use std::num::NonZeroU32; // +1ããç¶æ ã§ä¿åãããæ´æ°ã // Optionã¨çµã¿åãããã¨ãã®ç©ºéå¹çãè¯ãã #[allow(non_camel_case_types)] pub struct u32m1(NonZeroU32); impl fmt::Debug for u32m1 { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { (self.0.get() - 1).fmt(f) } }
ä¸ã®ã³ã¼ãã§ã¯u32m1 ã® Debug::fmt ã®å®è£
ã u32 ã® Debug::fmt ã«ç§»è²ãã¦ãã¾ããããã§ .fmt() ã¨æ¸ããã®ã¯ãå®è£
ä¸ã®ãã¬ã¤ãã使ããã¦ãããããã§ãã
ã¡ãªã¿ã«ãã¬ã¤ãèªèº«ã®ããã©ã«ãå®è£ ã§ã¯ããããããã¬ã¤ããã¹ã³ã¼ãå ã«ãããã¨ãæ®éãªã®ã§ãã®ãããªç¹å¥å¯¾å¿ã¯å¿ è¦ããã¾ããããã ããããã«ãã£ã¦ä»¥ä¸ã®ãããªã³ã¼ãã¼ã±ã¼ã¹ã¯çºçãã¦ããããã§ãã
trait Foo { fn foo(&self) { mod m1 { fn f() { // ().foo(); // error } } } } impl Foo for () { fn foo(&self) { mod m1 { fn f() { ().foo(); // OK } } } }
ã¾ã¨ã
(5)ã§ã¢ã¸ã¥ã¼ã«ã°ã©ããä½ããã(6)ã§ãã¹ã®è§£æ±ºãã§ããã®ã§ãããã§ååè§£æ±ºã®æ å½ç¯å²ã¯ããããçè§£ã§ãããã¨ã«ãªãã¾ãã
ãã ããåå解決ã¨ãã¯ãã®ç¸äºä½ç¨ã«ã¤ãã¦ã¯ãã¡ãã¨æ±ã£ã¦ããªãã£ãã®ã§ã次åã¯æå¾ã«ãã®è©±ããã¦çµããã«ãããã¨æãã¾ãã
Rustã®ã¢ã¸ã¥ã¼ã«ã詳細ã«çè§£ãã(5) å¯è¦æ§
æ¦è¦: Rust2018以éãRustã®ã¢ã¸ã¥ã¼ã«ã·ã¹ãã ã¯å ¥éããããããã¤ãã¹ã¿ã¼ãã«ãããªãã¾ãããããã§æ¬è¨äºã§ã¯ããã®ä¸¡æ¹ãéæãããã¨ãç®æãã¾ããã
- ã¢ã¸ã¥ã¼ã«å ¥é
- åå解決ã®å½¹å²ã¨ç¨èª
- ã¢ã¸ã¥ã¼ã«ã°ã©ãã®æ§é
- ã¤ã³ãã¼ã解決
- å¯è¦æ§
- ãã¹è§£æ±º
- åå解決ã¨ãã¯ã
æ¬è¨äºã¯2017å¹´ã«æ¸ããè¨äº (https://qnighy.hatenablog.com/entry/2017/03/27/070000, https://qnighy.hatenablog.com/entry/2017/04/24/070000 ) ã¨åããã¼ãã§ãRust2018ãèæ ®ãã¦æ¹ãã¦ã¾ã¨ãç´ãããã®ã§ãã
注æ: æ¬è¨äºä¸ã®ãµã³ãã«ã³ã¼ãã®å¤ãã¯ãRustã®ç´°ãã仿§ãå®è£ ã調ã¹ãããã®ãã®ã§ãããå®éã«æç¨ãªããã°ã©ãã³ã°ãã¿ã¼ã³ã§ããã¨ã¯éãã¾ãããã¾ããå®è³ªçã«ãã°ã«è¿ãæåã説æãã¦ãããã®ããããããå°æ¥ã«ããã£ã¦åãåä½ã§ãããã¨ã¯ãã¾ãä¿è¨¼ã§ãã¾ããã
å¯è¦æ§ã¨ã¯
å¯è¦æ§ (visibility) ã¯ããã®ã¢ã¤ãã ãåæããã¦ãããã©ããã®ã¢ã¯ã»ã¹å¶å¾¡ãããä»çµã¿ã§ãRustã«ãããå®è£
ã®ã«ãã»ã«åã®ããã«ä½¿ããã¾ãããã¤ã¦ã¯ pub ã¨æªæå® (module private) ã®2種é¡ã§ãããã RFC1422ã«ã¦ã¢ã¸ã¥ã¼ã«åºæã®å¯è¦æ§ãå®è£
ããã¾ãããã¾ãã RFC1560ãå®è³ªçã«RFC1422ã®äºåæºåã¨ãã¦ã®å½¹å²ãæããã¦ããããããã¡ããè¦ãã§ãã¯ã§ãã
å¯è¦æ§ã¯åæãã§ããã¢ã¤ãã ã«ã¯åºæ¬çã«ä»ä¸ããã¾ããä»ä¸ãããªããã®ã¨ãã¦ä»¥ä¸ãããã¾ãã
- å®è£
- å®è£ ã¯åã§ç´¢å¼ããããããå¯è¦æ§ã§ç®¡çãããã®ã§ã¯ãªãã¨ããèãã ã¨æãããã
- ãã¬ã¤ãã¢ã¤ãã ã«å¯è¦æ§ããªãã®ãåæ§ï¼
macro_rules!ã«ãããã¯ã- ä¼çµ±çã«
#[macro_export]ã®æç¡ã§å¶å¾¡ããã¦ããããï¼ - RFC1561ã§ã¯å®£è¨ãã¯ã2.0ã®ä¸é¨ã¨ãã¦å¯è¦æ§ã®çµ±ä¸ãç®æãæ¡ãè¨è¼ããã¦ãã
- ä¼çµ±çã«
éã«ãã¢ã¤ãã 以å¤ã«ä»ä¸ããããã®ã¨ãã¦ä»¥ä¸ãããã¾ãã
- åºæå®è£ ã®ä¸èº« (ã¡ã½ããã»é¢é£é¢æ°ã»é¢é£å®æ°)
- æ§é ä½ã»åæåã»å ±ç¨ä½ã®ãã£ã¼ã«ã
å¯è¦æ§ã®ç¨®é¡ã¨æ§æ
å¯è¦æ§ã®æå®ã¯æå³çã«ã¯2種é¡(+α)ã«åãããã¾ãã
- å ¬éãã©ãããã§ãåç §ã§ããã
- ã¢ã¸ã¥ã¼ã«éå®ãç¹å®ã¢ã¸ã¥ã¼ã«ä»¥ä¸ããåç §ã§ããã
- å®å ¨ã«ä¸å¯è¦ãã¢ã¤ãã èªèº«ãããè¦ããªãã¨ããã®ã¯ããããã®ã§ãã¦ã¼ã¶ã¼ã«è¦ããã¨ããã§ã¯åºã¦ããªããå é¨çã«ä½¿ãããã (ãã¨ãã°ãå¯è¦æ§ã®join operationã®åä½å ã«ãªã£ã¦ãã)
åã« pub ã¨æ¸ãã¨å
¬éã«ãªãã¾ããããã¦ãã¢ã¸ã¥ã¼ã«éå®ãæå®ããããã®è¨æ³ãããããããã¾ãã
pub(in foo::bar::baz)ã¨æ¸ããå ´åããã®å ´åfoo::bar::baz以ä¸ãå¯è¦ç¯å²ã¨ãªãã- æªæå®ã®å ´å (
fn f() {}) âpub(in self)ã¨åãã pub(self)ã®å ´å âpub(in self)ã¨åããpub(super)ã®å ´å âpub(in super)ã¨åããpub(crate)ã®å ´å âpub(in crate)ã¨åããcrateã®å ´å âpub(in crate)ã¨åããRFC2126ã®ä¸é¨ã ããRust2018ã¾ã§ã«å®å®åããå¿ è¦ã¯ãªãã¨å¤æããä»ã«è³ãã
Q&A
pub(in)ã®inã¯ãªãã§å¿ è¦ãªã®ï¼ â å ã ã®ææ¡ã»å®è£ ã§ã¯ãªãã£ãã®ã§ãããã¿ãã«æ§é ä½ã®ã¡ã³ãã¼ã«å¯¾ãã¦ä½¿ã£ãã¨ãã®æ§æçãªææ§æ§ãåãé¤ãããã«è¿½å ããã¾ãããpub(self)ã£ã¦è¦ãã®ï¼âãã¯ããªã©ã§æ©æ¢°çã«å¦çããã¨ãã«selfãæ¾ãè¾¼ãã¦ä¾¿å©ã ããã ã¨è¨ããã¦ãã¾ãã
ãªãã crate ã«ããå¯è¦æ§æå®ãã¿ãã«æ§é ä½ã®ã¡ã³ãã¼ã«ä½¿ã£ãã¨ãã®æ§æçãªææ§æ§ãææããã¦ãã¾ãã
å¯è¦æ§ãã§ãã¯
ããã¢ã¯ã»ã¹ãå¯è¦æ§ãæºããã¦ãããã©ããã¯ãã©ã®Def(æãã¯resolution)ãããã©ã®ã¢ã¸ã¥ã¼ã«ããè¦ãããã«ãã£ã¦æ±ºå®ããã¾ãã
ã©ã®Defãâ¦â¦ã«ã¤ãã¦ã¯ããã¨ãã° foo::bar::baz ãåç
§ãããã¨ãã¦ãããªãã°ã foo, foo::bar, foo::bar::baz ã«ããããã¢ã¯ã»ã¹æ¨©ããããã©ãããã§ãã¯ããã¾ãããã®ã¨ããã¨ãã° foo::bar ã use ã«ç±æ¥ãã¦ããã¨ãã¯ããã® use èªèº«ã®å¯è¦æ§ã«åºã¥ãã¦ãã§ãã¯ããã¾ãããã®ããã baz èªä½ã pub æå®ã§ããããã«ã©ããããã¹ã§ã¢ã¯ã»ã¹ããããã bar å
ã§ baz ãã©ã use ããã¦ãããã«ãã£ã¦ã¯ã¢ã¯ã»ã¹ã§ããªãå ´åãããã¾ãã
ãã®ãã¨èªä½ã¯å²ã¨å½ããåã®æåã§ãã use ã¯åã«å¤é¨ã®ååãã¹ã³ã¼ãã«ç½®ãããã®ä¾¿å®çãªç¨éã§ã使ãã¾ããããããå¤ããè¦ãã¦ãã¾ã£ã¦ã¯å°ãããã§ãã
ã¾ããå¯è¦æ§ãå¤å®ããã¨ã㯠use ã¯ç¡è¦ãã¦ãå
ã
ãã£ãã¢ã¸ã¥ã¼ã«ã®è¦ªåé¢ä¿(=ã¢ã¸ã¥ã¼ã«æ¨)ã«åºã¥ãã¦å¤å®ãã¾ãããã®ããããã®å¤å®ã¯ã¢ã¸ã¥ã¼ã«ã®è¦ªãªã³ã¯ã辿ãã ãã§å¯è½ã§ãã
å¯è¦æ§ã¨ use
å¯è¦æ§ã¯ use ã®æåã«ãå½±é¿ãä¸ãã¾ãããã®ãããã¤ã³ãã¼ãã解決ãã¦ããå
¨ã¦ã®å¯è¦æ§ããã§ãã¯ããããã§ã¯ãªããã¤ã³ãã¼ã解決ã¨use ã®å¯è¦æ§å¤å®ã¯åæé²è¡ãã¾ãã
use ã¯è¤æ°ã®åå空éã«ã¾ããã£ã¦å¦çãããã®ã§ãåã
ã®åå空éã§ã¯ã¤ã³ãã¼ãã®å¤±æã許容ããã¦ãã¾ãã
ãã¨ãã°ã pub use foo::bar; ã®å ´åãååå空éãã¨ã®å¦çã§ã¯ä»¥ä¸ã®ãããªæ±ãã«ãªãã¾ãã (ãã§ã« foo ã¾ã§ã¯è§£æ±ºã§ãã¦ããåæ)
foo::barã«ã¢ã¯ã»ã¹ã§ããªãå ´åã¯ããã®åå空éã§ã¯ã¤ã³ãã¼ãããªããfoo::barãåå¨ããªãå ´åã¨åãæ±ã
foo::barã«ã¢ã¯ã»ã¹ã§ãããããã®å¯è¦æ§ãpubãããå¼±ã (e.g.crate) å ´åã¯ãå¼±ãã»ãã®å¯è¦æ§ã§ã¤ã³ãã¼ããããfoo::barã«ã¢ã¯ã»ã¹å¯è½ã§ããã®å¯è¦æ§ãååãªå ´åã¯ãpubã§ã¤ã³ãã¼ã (åã¨ã¯ã¹ãã¼ã) ããã
ãã®ä¸ã§ãå
¨ä½ã¨ãã¦ã¯æå®ããå¯è¦æ§ (ãã®å ´å㯠pub) ã§ã¤ã³ãã¼ãã§ãããã®ã1ã¤ä»¥ä¸ãªãã¨ã¨ã©ã¼ã«ãªãã¾ãããã ããglobã¤ã³ãã¼ãã®å ´åã¯ããã¤ãä¾å¤ãããããã¨ãã°ä½ãã¤ã³ãã¼ãããªãã£ãå ´åã¯ã¨ã©ã¼ã«ã¯ãªãã¾ããã
mod m0 { pub fn f() {} mod f {} } mod m1 { fn f() {} pub mod f {} } use m0::f; // å¤åå空éã§ããã¤ã³ãã¼ãããªã use m1::f; // ååå空éã§ããã¤ã³ãã¼ãããªã mod m2 { pub(crate) mod m3 { pub(super) fn f() {} pub mod f { pub const X: i32 = 42; } } pub use m3::f; // 颿°fãpub(self)ã§ãã¢ã¸ã¥ã¼ã«fãpubã§ã¤ã³ãã¼ããã fn g() { f(); } } fn g() { m2::f::X; } mod m4 { // ããã«ä¾ãã° fn foo() {} ã¨æ¸ãã¨ä¸ã®ã¤ã³ãã¼ããã¨ã©ã¼ã«ãªã } pub use m4::*; // ä½ãã¤ã³ãã¼ãããªãã®ã§ã¨ã©ã¼ã«ãªããªã
å¯è¦æ§èªèº«ã®ãã¹è§£æ±º
pub(in) æ§æããããããå¯è¦æ§ã®ä¸ã§ããã¹è§£æ±ºãããå¿
è¦ãããã¾ãããã®å¯è¦æ§ã®ãã¹è§£æ±ºã¯resolve_visibilityã¨ããå°ç¨ã®ã¡ã½ããã§è¡ããã¦ãã¾ãã
pub(in) ã®ãã¹ã¯åºæ¬çã«ã¯ use ã¨åãæåããã¾ããã¤ã¾ããRust2015ã¢ã¼ãã§ã¯ããã©ã«ã絶対ãã¹ã§ãããã®ä»ã«ä»¥ä¸ã®ãããªç¹å¾´ãããã¾ãã
- 絶対ãã¹ã»ç¸å¯¾ãã¹ä»¥å¤ã¯æªå¯¾å¿ãã¤ã¾ãã
pub(in self::foo::bar)ã¯å¯è½ã ããpub(in foo::bar)ãRust2018ã¢ã¼ãã§è¡ãã¨ã¨ã©ã¼ã«ãªãã useã¨ç°ãªããå½è©²ãã¹ã®ã¤ã³ãã¼ãã解決ãããã¾ã§å¾ ã¤ä»çµã¿ã¯å®è£ ããã¦ããªãããã (issueã«ãã)
use 以å¤ã®å¯è¦æ§æ¤æ»
use ã¯ä¸è¨ã®ããã«åå解決ã¨å¯æ¥ã«é¢ãã£ã¦ãã¾ããããã以å¤ã®å¯è¦æ§ã¯ä»¥ä¸ã®ã¿ã¤ãã³ã°ã§æ¤æ»ããã¾ãã
- ã¤ã³ãã¼ã解決ã«ä½¿ããªããã¹ã¯ããã¹è§£æ±ºã®æ®µéã§ã¨ã©ã¼ã«ãªãã¾ãã
- åã«é¢é£ããå¯è¦æ§ã¯ãåè§£æ±ºã®æ®µéã§æ¤æ»ããã¾ãã (e.g. é¢é£åã®å ´åãã¡ã½ããã®å ´åããã£ã¼ã«ãã®å ´å)
private-in-public
private-in-publicã¯RFC0136ã®éç§°ã§ãã (use ã®å¯è¦æ§ã«é¢ããè¦å®ãããã«å«ã¾ãã¦ãã¾ãããããã¯ä»ã¨ãªã£ã¦ã¯æ±ããããªãéãã®ã§æ¬ç¯ã®å¯¾è±¡å¤ã¨ãã¾ã)
RFC0136ã¯ãå ¬éAPIã®åãå ¬éããã¦ããå¿ è¦ãããã¨ããè¦å®ã§ãããã¨ãã°ã
- 颿°ã
pubãªãããã®å¼æ°ãæ»ãå¤åãpubã§ããå¿ è¦ããã - æ§é ä½ãã£ã¼ã«ãã
pubãªãããã®åãpubã§ããå¿ è¦ããã - ãã¬ã¤ãå®è£
ã®å
¨ã¦ã®å
¥ååã
pubãªãããã®é¢é£åãpubã§ããå¿ è¦ããã
ãªã©ã®è¦å®ãããã¾ãã
struct A; pub fn f(_: A) {} // error
pub trait Foo { type X; } struct A; type Unit = (); impl Foo for Unit { type X = A; // error }
éã«OKãªãã®ã¨ãã¦ã¯ã
- æ§é ä½ã
pubã§ãããã®ãã£ã¼ã«ããpubã§ããå¿ è¦ã¯ãªã - 颿°ã
pubã§ãããã®å®è£ ã§ä½¿ããã¦ããã¢ã¤ãã ãpubã§ããå¿ è¦ã¯ãªã
ãªã©ãããã¾ãã
ãã®ãããªå¯è¦æ§ã¯åå解決ãããå¾ã®ãã§ã¼ãºã§æ¤æ»ããã¾ãã
private-in-publicã®lintã¸ã®ç·©å
RFC2145ã«ããprivate-in-publicè¦åãæ´çããã¾ããã
- æ¢åã®è¦åãããæç¢ºã«èª¬æããã¾ããã
- å°éå¯è½æ§ã«åºã¥ãæ°ããè¦åãææ¡ããã¾ããã
- ããã«ãããã¦ãæ¢åã®private-in-publicãã§ãã¯ãlintã«ç·©åãããã¨ãææ¡ããã¾ããã
å°éå¯è½æ§ã¨ã´ã©ã«ãã¢ã¼ãå
ç¾å¨ã®private-in-publicã«ã¼ã«ã¯ã´ã©ã«ãã¢ã¼ãå (Voldemort type) ã¨å¼ã°ãã種é¡ã®ãã¿ã¼ã³ã許容ãã¦ãã¾ãã
mod m1 { pub struct Voldemort; } // å¤é¨ã¯ã¬ã¼ãã¯Voldemortã«ã¢ã¯ã»ã¹ããææ®µããªãã // ããããVoldemortèªä½ã¯pubãªã®ã§ããã®é¢æ°ã¯è¨±ããã¦ãã pub fn you_know_who() -> m1::Voldemort { m1::Voldemort }
RFC2145ã§ææ¡ããã¦ããæ°ããè¦åã§ã¯ãã´ã©ã«ãã¢ã¼ãåã«å¯¾ãã対å¿ãå«ã¾ãã¾ãã
public/private dependencies
private-in-publicã«é¢é£ãã¦ãRFC1977ã§ã¯ãããä¾åé¢ä¿ã«å¯¾ãã¦æ¡å¼µãããã¨ãææ¡ãã¦ãã¾ãããã¨ãã°ã Cargo.toml ã«ä»¥ä¸ã®ããã«æ¸ããã¨ãã¾ãã
[package]
name = "foo"
# ...
[dependencies]
# fooã¯å
é¨çãªé«éåã®ããã«rayonã使ããã
# ãã©ã¬ã«ã¤ãã¬ã¼ã¿ã¼ã®ã¤ã³ã¿ã¼ãã§ã¼ã¹ãæä¾ããããã§ã¯ãªãã®ã§private
rayon = { version = "1.0.3", public = false }
# fooã®å
¬éãã¦ããåãSerialize/Deserializeãå®è£
ãã¦ããã®ã§public
serde = { version = "1.0.90", public = true }
ãã®ã¨ãã foo ã®å
¬éAPIã« rayon ã®åãå«ã¾ãã¦ããªãã ã追å ã§æ¤æ»ããã¾ãã
ãã®å ´åã foo ã rayon ã®ã¡ã¸ã£ã¼ãã¼ã¸ã§ã³ãä¸ãã¦ãèªèº«ã®ã¡ã¸ã£ã¼ãã¼ã¸ã§ã³ãä¸ããå¿
è¦ã¯ãªã䏿¹ã serde ã®ã¡ã¸ã£ã¼ãã¼ã¸ã§ã³ãä¸ããã¨ãã¯(é常ã¯)èªèº«ã®ã¡ã¸ã£ã¼ãã¼ã¸ã§ã³ãä¸ããå¿
è¦ãããã¨è§£éããã¾ãã (ãã ããsemver compatibilityãæ©æ¢°çã«èª¿ã¹ãæ¹æ³ã¯ä»ã®ã¨ãããªãã®ã§ãããã¯ã¤ã³ãã©ã¼ãã«ã«ããå®ãããã¦ããã ãã¨ããã)
ã¾ããã®æ
å ±ããä¸è§ä¾åé¢ä¿ãåããã¼ã¸ã§ã³ã«è§£æ±ºãããã©ããã®å¤å®ã«ã使ããªããã¨èãããã¦ãã¾ãããã¨ãã°ä¸ã®ç¶æ³ã§ãããã« bar ã rayon, serde, foo ã®å
¨ã¦ã«ä¾åãã¦ããã¨ãã¾ãããã®ã¨ãã serde ã¯åä¸ãã¼ã¸ã§ã³ã«è§£æ±ºããå¿
è¦ããã䏿¹ã rayon ã¯åä¸ãã¼ã¸ã§ã³ã«è§£æ±ºããå¿
è¦ã¯ãªããã¨ã«ãªãã¾ãã
ã¾ã¨ã
å¯è¦æ§ (pub) ã¨ã¤ã³ãã¼ãè§£æ±ºã®æåã«ã¤ãã¦èª¬æãã¾ãããããã¾ã§ãçè§£ããã°ãã¢ã¸ã¥ã¼ã«æ§é ã®è¨è¨ã§(æåã®äºæ¸¬ãã§ããã«)å°ããã¨ã¯ã»ã¼ãªããªãã®ã§ã¯ãªãã§ãããããã¾ããããã«é¢é£ãã¦ãåå解決以éã®ãã§ã¼ãºã§ã®å¯è¦æ§æ¤æ»ã軽ã説æãã¾ããã
ã¤ã³ãã¼ãã®è§£æ±ºã¾ã§ããããã説æã§ããã®ã§ããããåæã«æ¬¡åã¯ãã¹è§£æ±ºã説æã説æãã¾ãã
Rustã®ã¢ã¸ã¥ã¼ã«ã詳細ã«çè§£ãã(4) ã¤ã³ãã¼ã解決
æ¦è¦: Rust2018以éãRustã®ã¢ã¸ã¥ã¼ã«ã·ã¹ãã ã¯å ¥éããããããã¤ãã¹ã¿ã¼ãã«ãããªãã¾ãããããã§æ¬è¨äºã§ã¯ããã®ä¸¡æ¹ãéæãããã¨ãç®æãã¾ããã
- ã¢ã¸ã¥ã¼ã«å ¥é
- åå解決ã®å½¹å²ã¨ç¨èª
- ã¢ã¸ã¥ã¼ã«ã°ã©ãã®æ§é
- ã¤ã³ãã¼ã解決
- å¯è¦æ§
- ãã¹è§£æ±º
- åå解決ã¨ãã¯ã
æ¬è¨äºã¯2017å¹´ã«æ¸ããè¨äº (https://qnighy.hatenablog.com/entry/2017/03/27/070000, https://qnighy.hatenablog.com/entry/2017/04/24/070000 ) ã¨åããã¼ãã§ãRust2018ãèæ ®ãã¦æ¹ãã¦ã¾ã¨ãç´ãããã®ã§ãã
注æ: æ¬è¨äºä¸ã®ãµã³ãã«ã³ã¼ãã®å¤ãã¯ãRustã®ç´°ãã仿§ãå®è£ ã調ã¹ãããã®ãã®ã§ãããå®éã«æç¨ãªããã°ã©ãã³ã°ãã¿ã¼ã³ã§ããã¨ã¯éãã¾ãããã¾ããå®è³ªçã«ãã°ã«è¿ãæåã説æãã¦ãããã®ããããããå°æ¥ã«ããã£ã¦åãåä½ã§ãããã¨ã¯ãã¾ãä¿è¨¼ã§ãã¾ããã
ã¤ã³ãã¼ã解決ã¨ãã¹è§£æ±º
åå解決ã®ç®æ¨ã¯ foo::bar::baz ã解決ãããã¨ã§ããããã®éä¸ã§ã¾ãã¤ã³ãã¼ã (use) ã解決ããå¿
è¦ãããã¾ãããããã¤ã³ãã¼ã解決ã¨ããã¾ãã
ã¤ã³ãã¼ã解決ã®ä¸ã§ããã¹ã解決ããå¿
è¦ãããã¾ããããã®æç¹ã§ã¯ use ããã³ pub(in) å
ã®ãã¹ã ã解決ããã°ãããã¨ã«æ³¨æãã¾ãããããã以å¤ã®ãã¾ãã¾ãªãã¹ã¯ã¤ã³ãã¼ãã®ãã¨ã«è§£æ±ºããã¾ãã
use tree
use ã®æ§æã¯ä½æ®µéãã«åãã¦é²åãã¦ãã¾ããããæ¬è³ªçã«ã¯æããå¤åãã¦ãããã以ä¸ã®2ã¤ããããã¾ããã
- åç¬å¥åã¤ã³ãã¼ã
use foo::bar as baz;- ãã ããããç¹æ®ãªä»æ§ã¨ãã¦
as _ããã (åè¿°) - ã¾ã
::{self}ãããå ´åã¯åå空éãå¶éããè¦åããã
- ãã ããããç¹æ®ãªä»æ§ã¨ãã¦
- globã¤ã³ãã¼ã
use foo::bar::*;
ãã¨ãã°ã以ä¸ã®useã¯
use std::{ self, fmt, io::{self, Read, Write as IoWrite}, ops::*, };
â¦â¦ä»¥ä¸ã®ããã«åè§£ãããã¨ãã§ãã¾ãã (build_reduced_graph_for_use_tree)
use std as std; // ãã ããååå空éããã¤ã³ãã¼ãããªã use std::fmt as fmt; use std::io as io; // ãã ããååå空éããã¤ã³ãã¼ãããªã use std::io::Read as Read; use std::io::Write as IoWrite; use std::ops::*;
ãã ãããã®å±éã§ã¯ä»¥ä¸ã®ãããªã±ã¼ã¹ã«æ³¨æãå¿ è¦ã§ãã
// ç´ ç´ã«å±éããã¨ç¡ãçæãããã³ã³ãã¤ã«ãéã£ã¦ãã¾ã // unstable moduleãåç §ãã¦ããã®ã§ã³ã³ãã¤ã«ãå¼¾ãã¦ã»ãã use std::intrinsics::{};
ãã®ãããªã±ã¼ã¹ã§ã¯ããã¼ã¤ã³ãã¼ããçæãããããã«ãã£ã¦å½è©²ã¢ã¸ã¥ã¼ã«ã«ã¢ã¯ã»ã¹æ¨©ããããã¨ãæ ä¿ãã¦ãã¾ãã
ç¦æ¢ãããã¤ã³ãã¼ãå½¢å¼
以ä¸ã®ãããªã¤ã³ãã¼ãã¯å½¢å¼çã«ç¦æ¢ããã¦ãã¾ãã
// 0ã»ã°ã¡ã³ãã¤ã³ãã¼ãã®ç¦æ¢ use {self}; // error use ::{self}; // error // selfã¾ãã¯superã§çµãããã¹ã®ã¤ã³ãã¼ãã®ç¦æ¢ use self; // error use self as s; // error use super; // error use super as s; // error // $crateèªä½ã®ã¤ã³ãã¼ãã¯å¯è½ã ã廿¢äºå® macro_rules! foo { () => { use $crate; // warning use $crate as s; // warning } } foo!(); // ç¹æ®ãªååã®ã¾ã¾ã®ã¤ã³ãã¼ãã®ç¦æ¢ use crate; // error // use crate as s; // ããã¯OK // 0ã»ã°ã¡ã³ãglobã¤ã³ãã¼ãã®ç¦æ¢ (prelude glob importã«ãªããã) use *; // error use ::*; // error
ã¾ããtrait itemã®ã¤ã³ãã¼ãã¨èªåèªèº«ããã®globã¤ã³ãã¼ãã¯æå³çã«å¼¾ããã¾ãã
trait Foo { fn foo(); } use Foo::foo; // error trait Bar {} use Bar::*; // error use self::*; // error
Rust2015ã¢ã¼ã
Rust2015ã® use ã§ã¯ããã©ã«ãã§çµ¶å¯¾ãã¹ãç¨ãããã¦ãã¾ããããã®äºææ§ã®ç¢ºä¿ã®ããã«ã以ä¸ã®æ¡ä»¶ã§ :: ãå
é ã«ä»ä¸ããããã®ããã«æ±ããã¾ãã
- ã°ãã¼ãã«2015ã¢ã¼ãã§ããã
- å½è©²
useãã¹ã®å é ã»ã°ã¡ã³ããRust2015ã¢ã¼ãã®ã¯ã¬ã¼ãç±æ¥ã§ããã - å½è©²
useãã¹ã®å é ã»ã°ã¡ã³ãããã¼ã¯ã¼ãã§ã¯ãªãã (ãã¨ãã°ãself::ãcrate::ã§ã¯ãªãããã§ã«::ã§å§ã¾ã£ã¦ããå ´åãé¤å¤ãã)
ã°ã«ã¼ãã¤ã³ãã¼ãã®å ´åã¯ã {} ãåå¥ã®useã«åè§£ããç¶æ
ã§ä¸ã®è¦åãé©ç¨ããã¾ãã
extern crate ã®å¦ç
extern crate ã®å¦çã¯ç°¡åã§ãæå®ããã¯ã¬ã¼ãã®ã«ã¼ããæå®ããå ´æã«ç¶ãæ¨ããã ãã§ãã
// failureã¯ã¬ã¼ãã®ã«ã¼ãã crate::f ã¨ãã¦ç¶ãæ¨ããã extern crate failure as f;
use ã®å¦çã¯æå°ä¸åç¹
extern crate ã«æ¯ã¹ã¦ã use ã®å¦çã¯ç°¡åã§ã¯ããã¾ããã use ã¯é åºãã解決ãããã¨ã¯éããªãããã§ãã
ãã®ãããæåã®å¦çã§ã¯ã©ãã«ã©ããã use æä»¤ããã£ããã ãè¦ãã¦ããã¦ãæå°ä¸åç¹ã¢ã«ã´ãªãºã ã«ããå¯è½ãªé¨åãã解決ãã¦ããã¾ãã
// (2)â(1) ã®é ã§è§£æ±ºããå¿ è¦ããã use m1::A; // (1) mod m1 { pub use crate::m2::A; // (2) } mod m2 { pub struct A; }
以ä¸ã§ã¯ããã®ãã¨ã念é ã«ç½®ãã¤ã¤è©±ãé²ãã¦ããã¾ãã
åç¬å¥åã¤ã³ãã¼ãã®è§£æ±º
åç¬å¥åã¤ã³ãã¼ãã®è¦åã¯æ¯è¼çç°¡åã§ãããåå空éã«ã¤ãã¦ã ãæ°ãã¤ãããã¨ãããã¾ãã use A as B ã¯ã
- ããããã®åå空éã§
Aãå©ç¨å¯è½ã調ã¹ãå©ç¨å¯è½ã ã£ããBã¨ãã¦ç¶ãæ¨ããã- ãã ãä¾å¤ã¨ãã¦ã
use foo::bar::{self};å½¢å¼ã®ã¤ã³ãã¼ãã®å ´åã¯foo::barã®ååå空éããã¤ã³ãã¼ãããªãã
- ãã ãä¾å¤ã¨ãã¦ã
- ã©ã®åå空éã§ãå©ç¨ä¸å¯è½ã ã£ããã¨ã©ã¼ã
ãã®ãããªä»æ§ã®ããã use ãåã«ä½¿ãã ãã§ã¯ç¹å®ã®åå空éãã¤ã³ãã¼ãããã®ã¯ä¸å¯è½ã§ã (ããªããã¼ãªæ¹æ³ã§å®ç¾å¯è½)
// åã¨ãã¦ã®Serializeã¨deriveãã¯ãã¨ãã¦ã®Serializeã両æ¹ã¤ã³ãã¼ããã use serde::Serialize; // ã¢ã¸ã¥ã¼ã«ã¨ãã¦ã®envã¨ãã¯ãã¨ãã¦ã®envã両æ¹ã¤ã³ãã¼ããã use std::env;
ã¾ãã use foo::bar as baz; ã¨ããæå®ããã£ãã¨ãã¦ããååå空éã§ self::baz ãå©ç¨å¯è½ã«ãªããã©ããã¯ãã®æç¹ã§ã¯ç¢ºå®ãã¦ããªããã¨ã«ãªãã¾ããããã¨ã§ãªãã£ããã¨ã©ã¼ã«ãããããã¨ããçç±ã§ãå
è¡ã㦠self::baz ãåå¨ãããã¨ãä»®å®ãã¦å¦çãé²ãããã¨ã¯ã§ããªãã¨ããããã§ãã
globã¤ã³ãã¼ãã®è§£æ±º
globã¤ã³ãã¼ãã¯ããè¤éãªä»æ§ãæã£ã¦ãã¾ãã(RFC1560ã«ãã®çµç·¯ãªã©ãæ¸ãã¦ããã¾ãã) use A::*; ã¯ä»¥ä¸ã®ããã«å¦çããã¾ãã
Aç´ä¸ã«ããå©ç¨å¯è½ãªå ¨ã¦ã®åå空éã»ååãã¤ã³ãã¼ãããã- ãã ããglobã¤ã³ãã¼ã以å¤ã®å®ç¾©ããã§ã«åå¨ãããããã¡ããåªå ãããã
- globã¤ã³ãã¼ãå士ã§è¡çªããå ´åã¯ãåå¥ã«ä»¥ä¸ã®ã«ã¼ã«ã§ä»²è£ãããã
- åãDefãæãã¦ãããä¸¡æ¹æå¹ (ããå¯è¦æ§ã®åºãã»ããæ¡ç¨ããã)
- éãDefãæãã¦ããå ´åã¯ãææ§ãã¨ããç¹å¥ãªç¶æ
ã«ãªã
- ææ§ç¶æ ã«ãªã£ããã¤ã³ãã£ã³ã°ã¯ãããã使ããã¨ããã¨ãã«ã¨ã©ã¼ã«ãªã
- ææ§ç¶æ ã¯ãããªãglob importã«ãã£ã¦å¼ãç¶ããã
- 該å½ããªãã£ãå ´å (e.g. 空ã¢ã¸ã¥ã¼ã«ã®ã¤ã³ãã¼ã) ã§ãã¨ã©ã¼ã«ã¯ãªããªã
fn main() { { // glob importã¯åªå 度ãä½ã use std::sync::*; use std::rc::{Rc, Weak}; let x: Weak<i32>; // OK } { // glob importå士ã¯ç«¶åãã use std::sync::*; use std::rc::*; let x: Weak<i32>; // ERROR } { // è¤æ°ã®glob importãåãDefã«è§£æ±ºãããå ´åã¯OK use core::cell::*; use std::cell::*; let x: Cell<i32>; // OK } }
æå°ä¸åç¹ã¢ã«ã´ãªãºã
ãããã®æ¡ä»¶ãè¸ã¾ãã¤ã¤ãå®éã«ã¯è§£æ±ºéä¸ã®ç¶æ ãèæ ®ã«å ¥ããªããå¦çãã¦ãã¾ãããã¨ãã°ã以ä¸ã®ãããªã³ã¼ããèãã¾ãã
use crate::m1::f::X; fn main() { dbg!(X); } pub fn f() {} mod m1 { pub use crate::m2::f; pub use crate::m3::*; } mod m2 { pub use crate::f; } mod m3 { pub mod f { pub const X: i32 = 42; } }
æåã®è¡ã® crate::m1::f::X ã解決ããããã«ã¯ãååå空éã§ crate::m1::f ã解決ããå¿
è¦ãããã¾ããããã®åè£ã¯2ã¤ããã¾ãã
m1å ã®pub use crate::m2::f;m1å ã®pub use crate::m3::*;
ãã®2ã¤ã®ãã¡ã©ã¡ãã«è§£æ±ºããããã¯ãåè
ãã©ã®åå空éã§ã¤ã³ãã¼ãããããã«ä¾åãã¾ãã m2 ã®ä¸èº«ãè¦ã¦ã pub use crate::f; ã¨ããæ¸ãã¦ããªãã®ã§ããã®ããã«ã¯ããã«é¡ã£ã¦ crate ç´ä¸ã® f ãã©ã®åå空éã«åå¨ããããç¥ãå¿
è¦ãããã¾ãã
ãã®ããã«ãã¤ã³ãã¼ãã®è§£æ±ºé åºã¯ãã¾ãèªæã§ã¯ããã¾ãããããã§ãåå解決ã®ããã¯ãç¾ç¶ã©ãã¾ã§å¤æãã¦ããã®ãããæ£ç¢ºã«è¡¨ç¾ãã¤ã¤ã次ã«ç¢ºå®ã«ããããã¨ãé çªã«æ¢ãã¦ããã¾ã (æå°ä¸åç¹)ã
ã¢ã¸ã¥ã¼ã«æ¨ã®æ§ç¯ã¨ã¤ã³ãã¼ãæã®ç®¡ç
åè¿°ã®ããã«ãååè§£æ±ºã®æåã®å¦çã¯ã¢ã¸ã¥ã¼ã«æ¨ã®æ§ç¯ã§ããããã®ã¡ã¤ã³ã®å¦ç㯠build_reduced_graph_for_item ã§ãã
ãã¨ãã°ã宿° const X: i32 = 42; ã®å¦çã¯æ¯è¼çç°¡åã§ãããã㯠define ã¡ã½ãã ãå¼ã¶ãã¨ã§ã¢ã¸ã¥ã¼ã«ã«Defãç´ä»ãããã¨ãã§ãã¾ãã
ããã«ãã£ã¦ Module ãä½ããã¾ããModuleã®ä¸»è¦ãªãã¼ã¿ã¯ä»¥ä¸ã®éãã§ãã
- 親ãªã³ã¯ (
parent), åãªã³ã¯ (resolutions), æ£è¦ç¥å ãªã³ã¯ (normal_ancestor_id)- å¿åã¢ã¸ã¥ã¼ã«ã¯è¦ªãªã³ã¯ãæã¤ãã親ããã®åãªã³ã¯ãæããªã
- ãã®ã¢ã¸ã¥ã¼ã«ãå
¥åã¨ããglobã¤ã³ãã¼ãã®ä¸è¦§ (
glob_importers) - ãã®ã¢ã¸ã¥ã¼ã«ãåºåã¨ããglobã¤ã³ãã¼ãã®ä¸è¦§ (
globs)
build_reduced_graph_for_item ã«ãã£ã¦ã
- é常ã®å®ç¾©ã¯ãã®ã¾ã¾
resolutionsã«ç´ä»ãããã¾ãã use foo::bar;ãextern crateãresolutionsã«ç´ä»ãããã¾ããuse foo::*;ã¯globsã«ç´ä»ãããã¾ãã
use foo::bar; ããã®æç¹ã§ resolutions ã«ç´ä»ãã¦ããã®ã¯ NameResolution ã«ããã表ç¾ããããã®ä»çµã¿ãããããã§ãã resolutions èªä½ã¯èå¥åã¨åå空éããNameResolutionãå¼ããããã§ããããã®NameResolutionã¯ä»¥ä¸ã®ãããªå®ç¾©ã«ãªã£ã¦ãã¾ãã
#[derive(Clone, Default, Debug)] /// Records information about the resolution of a name in a namespace of a module. pub struct NameResolution<'a> { /// Single imports that may define the name in the namespace. /// Import directives are arena-allocated, so it's ok to use pointers as keys. single_imports: FxHashSet<PtrKey<'a, ImportDirective<'a>>>, /// The least shadowable known binding for this name, or None if there are no known bindings. pub binding: Option<&'a NameBinding<'a>>, shadowed_glob: Option<&'a NameBinding<'a>>, }
ã¤ã¾ãã NameResolution ã¯åã«æçµçãªè§£æ±ºçµæã§ã¯ãªãããæ«å®2ä½ã¾ã§ã®è§£æ±ºçµæãã¨ããã®ååãå®ç¾©ãããåç¬å¥åã¤ã³ãã¼ãã®ä¸è¦§ããä¿æãã¦ãã¾ãããªã®ã§ã binding ãåå¨ãã¦ãã¦ãããããglobã¤ã³ãã¼ãç±æ¥ãã¤ä»ã«åç¬ã¤ã³ãã¼ããåå¨ãããããããªãå ´åã¯ãã®çµæã¯ç¢ºå®ã§ã¯ãªãã¨ãããã¨ã«ãªãã¾ãã
æå°ä¸åç¹ã«ã¼ã
æå°ä¸åç¹å¦çã®ã¨ã³ããªã¼ãã¤ã³ã㯠ImportResolver::resolve_imports ã«ããã¾ããããã§ã¯ä»¥ä¸ã®ãããªå¦çããã¦ããããã§ãã
- ä¸ã«æãããã¼ã¿æ§é ã¨ã¯å¥ã«ã解決æ¸ã¿ã¤ã³ãã¼ãã®ä¸è¦§ã¨æªè§£æ±ºã¤ã³ãã¼ãã®ãã¥ã¼ãã°ãã¼ãã«ã«ä¿æãã¦ãããã¯ããã¯å ¨ã¦æªè§£æ±ºæ±ãã§ããã
- ä¸åã®ã«ã¼ãã§ãæªè§£æ±ºã¤ã³ãã¼ãã®è§£æ±ºãé çªã«è©¦ã¿ãã
- æªè§£æ±ºã¤ã³ãã¼ãã®åæ°ãæ¸ã£ããã«ã¼ããç¶ç¶ããæ¸ããªãã£ããåæã¨ã¿ãªãã¦åæ¢ããã
ã§ã¯ãã¤ã³ãã¼ããæªè§£æ±ºã¨ããã®ã¯ã©ãããç¶æ ã§ããããã
ã¾ã第ä¸ã«ãã¤ã³ãã¼ãå
ã®ã¢ã¸ã¥ã¼ã«ããããã確å®ãã¦ããªãå ´åãããã¾ãããã¨ãã°ã use foo::bar::baz as hoo; ãå¦çããããã«ã¯ã¾ã foo::bar ãä½ã§ãããã確å®ãã¦ããå¿
è¦ãããã¾ããããã® foo ã bar èªä½ã use ç±æ¥ãããããããã®å ´åã¯æã®ã¤ããããããã¾ãããããã確å®ãã㨠imported_modules ã¨ãããã£ã¼ã«ã ã«ä¿åããã¾ãã
globã¤ã³ãã¼ãã®å ´åããã®æç¹ã§globã¤ã³ãã¼ãèªä½ã¯å¿ ããè§£æ±ºãæ±ãã«ãªãã¾ããã¨ããã®ããglobã¤ã³ãã¼ãèªä½ã®ã解決ãã¯åºæ¬çã«ã¯ä»¥ä¸ã®2ã¤ã®å¦çã(ãã®é çªã§)ããã ãã ããã§ãã
- ã¤ã³ãã¼ãå
ã¢ã¸ã¥ã¼ã«ã®
glob_importersã«å½è©²ã¤ã³ãã¼ãæä»¤ã追å ããã (âä»å¾åæããããã¨ãä¿è¨¼) - ã¤ã³ãã¼ãå ã¢ã¸ã¥ã¼ã«ã§ãã®æç¹ã§è§£æ±ºæ¸ã¿ã«ãªã£ã¦ããDefãåæããã¤ã³ãã¼ãå ã«ç¶ãæ¨ããã (âéå»åã®åæãå®äºããã)
ãã®å¾ã®å¦çã¯ã¤ã³ãã¼ãå
ã¢ã¸ã¥ã¼ã«ãå¤åããã¿ã¤ãã³ã°ã§ã® glob_importers ã«ããããã¯ã«ç§»è²ããã¾ãã
䏿¹ãåç¬å¥åã¤ã³ãã¼ãã®å ´åã¯ã3ã¤ã®åå空éããããã§ã¤ã³ãã¼ãã®å¯å¦ã調ã¹ã3ã¤ã®çµæããã¹ã¦ç¢ºå®ããæç¹ã§è§£æ±ºæ¸ã¿ã«ãªãã¾ããããã®åå空éã§ã¯ã¤ã³ãã¼ãã§ãããããããªãããã§ããªããããããªããã¨ãããã®ãæ®ã£ã¦ãããã¡ã¯æªè§£æ±ºã§ãã
ã¾ãããã¯ãå±éã«ç±æ¥ããæªè§£æ±ºç¶æ ãèãããã¾ãããããã¯ã¾ã話ãããããããªãã®ã§å¥é説æãã¾ãã
é常㮠use 以å¤ã®ã¤ã³ãã¼ãæä»¤
ä¸ã®ã¢ã«ã´ãªãºã ã§ãã¤ã³ãã¼ã解決ã®åä½ã¨ãªã£ã¦ããã¤ã³ãã¼ãæä»¤ã¯ ImportDirective ããã³ ImportDirectiveSubclass ã¨ãã¦å®ç¾©ããã¦ãã¾ãããããè¦ãã¨é常㮠use ãå«ãã¦ã¤ã³ãã¼ã解決ã«ãã£ã¦è§£æ±ºããããã®ã¯ä»¥ä¸ã®ãã®ããããã¨ããããã¾ãã
- é常ã®åç¬å¥åã¤ã³ãã¼ã (
use foo::bar as baz;) ::{self}å½¢å¼ã®åç¬å¥åã¤ã³ãã¼ã (use foo::bar::{self} as baz;)- ãã®å ´åã¯ãååå空éã®ã¿ãã¤ã³ãã¼ããããã
- é常ã®globã¤ã³ãã¼ã (
use foo::* as baz;) - preludeç¨ã®globã¤ã³ãã¼ã
- ã¢ã¸ã¥ã¼ã«ã«
#![no_prelude]ããªãå ´åã¯#[prelude_import] use std::prelude::v1::*;ã追å ãããã - ãã®å½¢ã®ã¤ã³ãã¼ãã¯å®éã«ã¯ã¤ã³ãã¼ã解決ãããããããã«ãã¹è§£æ±ºã§å¦çããããã«ã¢ã¸ã¥ã¼ã«ãã¡ã¢ãã¦ããã
- ã¢ã¸ã¥ã¼ã«ã«
extern crateã«ããã¤ã³ãã¼ã- ã¤ã³ãã¼ã解決ã§ã¯ä½¿ãããªãã
- rustfixç¨ï¼
#[macro_use] extern crateã«ããã¤ã³ãã¼ãã®ãã¯ãé¨å- ã¤ã³ãã¼ã解決ã§ã¯ä½¿ãããªãã
- rustfixç¨ï¼
ã¢ã¸ã¥ã¼ã«è§£æ±ºã®ãã¡ã¤ãã©ã¤ãº
æå°ä¸åç¹ã¢ã«ã´ãªãºã ã¯ã解決å¯è½ãªãã®ãå¦çããæç¹ã§åæ¢ãã¾ãããã®æç¹ã§ã¯å¿
è¦ãªãã®ããã¹ã¦è§£æ±ºããããã¯ããããªãã®ã§ãfinalize_imports ã¡ã½ãã ã§ããã確èªãã¦ãã¾ãã
ã¾ã¨ã
use èªä½ã®ä»æ§ããã°ããã®ã·ã£ãã¦ã¤ã³ã°ãåå空éã®éãã«ç±æ¥ããè¤éããæ±ãã¦ãã¾ãããã®ä¸ãã¤ã³ãã¼ã解決ã¯use ã®è§£æ±ºãé åºä¸å®ã§è¡ãå¿
è¦ãããããã®ããã«Rustã³ã³ãã¤ã©ã¯ããã©ãã¾ã§ãæ¢ã«å¤æãã¦ããã®ããã¨ããç¶æ
ãæ
éã«æ´æ°ããªããé©åã«ç¶æ
ãæ´æ°ãç¶ããã¨ããé£ããå¦çãå®è£
ãã¦ãã¾ãã
次åã¯å¯è¦æ§ã«ã¤ãã¦æ±ãã¾ããå¯è¦æ§ã¯ã¤ã³ãã¼ã解決ã®åä½ã«ãããã£ã¦ãããã®ã®ããã£ããå¯è¦æ§æãã§èª¬æã§ãããã¨ãå¤ãã£ãã®ã§åå²ãã¾ããã
Rustã®ã¢ã¸ã¥ã¼ã«ã詳細ã«çè§£ãã(3) ã¢ã¸ã¥ã¼ã«ã°ã©ãã®æ§é
æ¦è¦: Rust2018以éãRustã®ã¢ã¸ã¥ã¼ã«ã·ã¹ãã ã¯å ¥éããããããã¤ãã¹ã¿ã¼ãã«ãããªãã¾ãããããã§æ¬è¨äºã§ã¯ããã®ä¸¡æ¹ãéæãããã¨ãç®æãã¾ããã
- ã¢ã¸ã¥ã¼ã«å ¥é
- åå解決ã®å½¹å²ã¨ç¨èª
- ã¢ã¸ã¥ã¼ã«ã°ã©ãã®æ§é
- ã¤ã³ãã¼ã解決
- å¯è¦æ§
- ãã¹è§£æ±º
- åå解決ã¨ãã¯ã
æ¬è¨äºã¯2017å¹´ã«æ¸ããè¨äº (https://qnighy.hatenablog.com/entry/2017/03/27/070000, https://qnighy.hatenablog.com/entry/2017/04/24/070000 ) ã¨åããã¼ãã§ãRust2018ãèæ ®ãã¦æ¹ãã¦ã¾ã¨ãç´ãããã®ã§ãã
注æ: æ¬è¨äºä¸ã®ãµã³ãã«ã³ã¼ãã®å¤ãã¯ãRustã®ç´°ãã仿§ãå®è£ ã調ã¹ãããã®ãã®ã§ãããå®éã«æç¨ãªããã°ã©ãã³ã°ãã¿ã¼ã³ã§ããã¨ã¯éãã¾ãããã¾ããå®è³ªçã«ãã°ã«è¿ãæåã説æãã¦ãããã®ããããããå°æ¥ã«ããã£ã¦åãåä½ã§ãããã¨ã¯ãã¾ãä¿è¨¼ã§ãã¾ããã
ã¢ã¸ã¥ã¼ã«æ¨ããã¢ã¸ã¥ã¼ã«ã°ã©ãã¸
Rustã®ã¢ã¸ã¥ã¼ã«ã¯ãã¡ã¤ã«ã·ã¹ãã ã®ããã«æ¨æ§é ããã¼ã¹ã«ãªã£ã¦ãã¾ãã(åè¿°ã®ããã«ãmod m1; ã®ããã«ãªã£ã¦ãããã®ã¯æ§æè§£æã®æ®µéã§å±éããã¦ããã®ã§ãããã§ã¯çµ±ä¸ãã¦æ±ãã¾ã)
pub mod m1 { pub mod m2 { mod m3 { } mod m4 { } } }
ãããã use ã絡ãã¨è©±ãé£ãããªãã¾ããããã¯ã·ã³ããªãã¯ãªã³ã¯ã®ãããªãã®ã§ãç¸äºåç
§ãå帰çãªã¢ã¸ã¥ã¼ã«ãä½ããã¨ãã§ãã¦ãã¾ãã¾ãã
pub mod m1 { pub mod m2 { mod m3 { // m3ã¨m4ã§ç¸äºã«ã¤ã³ãã¼ããã¦ãã use super::m4; } mod m4 { use super::m3; } // m1::m2::m1::m2::... pub use crate::m1; } }
ãã®ã¢ã¸ã¥ã¼ã«ã°ã©ããæ§ç¯ããé¨åãåå解決ã®è¦ã§ãããglob importãªã©ãããããåç´ã«ã¯ããã¾ãããã¾ããæ¨æ§é ã¨ãã£ã¦ãåç´ãªæ¨æ§é ã¨ã¯è¨ããªãäºæ ãããã¤ãããã¾ãããããã®è©³ç´°ãªäºæ ãã²ã¨ã¤ãã¤è§£èª¬ãã¦ããã¾ãã
åå空é
Rustã§ã¯ã²ã¨ã¤ã®ã¢ã¸ã¥ã¼ã«ã«åãååã®Defãæå¤§3åã¾ã§ç´ä»ãããã¾ãããããåå空é (namespace)ã¨ããã以ä¸ã®3ã¤ã®åå空éãããã¾ãã
- ååå空é (åã»ãã¬ã¤ãã»ã¢ã¸ã¥ã¼ã«)
- å¤åå空é (夿°ã»å®æ°ã»é¢æ°)
- ãã¯ãåå空é (ãã¯ãã»å±æ§)
(C++ãC#ã§ã¯ãRustã®ã¢ã¸ã¥ã¼ã«ã«å¯¾å¿ãããã®ã®ãã¨ãåå空éã¨å¼ãã§ãã¾ããRustã®åå空éã¯Cè¨èªã®åå空éãªã©ã«è¿ãæ¦å¿µã ã¨ããã¾ãã)
ãã¨ãã°ã以ä¸ã®ããã«ã¿ãã«æ§é ä½ãå®ç¾©ããå ´åã¯å®éã«ã¯2ã¤ã®Defãç´ä»ãã¦ãã¾ãã (ã¦ãããæ§é ä½ã®å ´åãåæ§)
struct Color(u8, u8, u8); fn main() { let color: Color = Color(255, 255, 255); // ^^^^^ 颿°ã¨ãã¦ã®Color (å¤åå空é) // ^^^^^ åã¨ãã¦ã®Color (ååå空é) }
ã¬ã³ã¼ãæ§é ä½ã®å ´åã¯ååå空éããæ¶è²»ããªãã®ã§ã颿°ã¨ã®ãªã¼ãã¼ãã¼ããå¯è½ã§ãã(æ¨å¥¨ããããã§ã¯ããã¾ãã)
struct Color { red: u8, green: u8, blue: u8, } #[allow(non_snake_case)] fn Color(red: u8, green: u8, blue: u8) -> Color { Color { red, green, blue } }
â»RFC0234ã®è¦å®ã«ãããåæåã®ã¬ã³ã¼ãããªã¢ã³ãã¯å¤åå空éãäºç´ãããã¨ã«ãªã£ã¦ãã¾ãã
ã¾ãã serde::Serialize ã¯ãã¬ã¤ãã¨ãã¦ãderiveãã¯ãã¨ãã¦ãæ¯ãèãã¾ãã
use serde::Serialize; // ãã¬ã¤ãã¨ãã¦ã®serde::Serializeãåç §ããå ´å impl Serialize for MyStruct1 { .. } // deriveãã¯ãã¨ãã¦ã®serde::Serializeãåç §ããå ´å #[derive(Serialize)] struct MyStruct2 { .. }
use as _
Rust1.33.0ããã以ä¸ã®ãããªå¥åã¤ã³ãã¼ããå¯è½ã«ãªãã¾ããã(RFC2166)
// Read/Writeãã¹ã³ã¼ãå ãã¬ã¤ãã®è§£æ±ºã«å©ç¨ããã // ãããããã®ã¢ã¸ã¥ã¼ã«ã®Read/Writeã¨ããååãæ±æããªãã use std::io::{Read as _, Write as _};
ããã¯å¾è¿°ããã¹ã³ã¼ãå
ãã¬ã¤ãã®è§£æ±ºã®ããã«ä½¿ããã¾ãããç¹å¾´ã¨ã㦠as _ ã§ä½ãããååã¯éè¤ããªãã¨ããç¹æ®ä»æ§ãããã¾ããããã¯åå解決åã« _ ãå®éã«ã¯å¥ã
ã®symbol idã«å²ãå½ã¦ããã¨ã§å®è£
ããã¦ãã¾ããRustã³ã³ãã¤ã©ã¯èå¥åãæ´æ°ã«å¤æãã¦ä¿æãã¦ããã®ã§ã _ ã«éè¤ãã¦å¥ã
ã®æ´æ°ãå²ãå½ã¦ãã¨ããããã¯ãå¯è½ã¨ããããã§ãã
ãªããæå³ãã¦ãã¯ä¸æã§ãããas _ ã§ã¤ã³ãã¼ãããããã®ãglob importã«å«ã¾ããããã§ãã (playground)
mod m1 { pub use std::io::BufRead as _; } use m1::*; fn main() { std::io::stdin().lock().read_line(&mut String::new()).unwrap(); }
ç¡åã®const
ã³ã³ãã¤ã«æã¢ãµã¼ã·ã§ã³ã®ããã® const _ (RFC2526; ä¸å®å®æ©è½) ã§ãä¸è¨ã¨åæ§ã®ä»çµã¿ãã¨ã£ã¦ãã¾ãã (playground)
#![feature(underscore_const_names)] const _: i32 = 42; const _: i32 = 53;
ãããã¯ãã¬ã¤ãã§ã¯ãªãã®ã§ãå¤ããè¦ã¦æå³ã®ããæåã¯ãªãã¯ãã§ãã (åæãã§ããªãã®ã«ã¹ã³ã¼ãå ã«ç½®ãã¦æå³ãããã®ã¯ãã¬ã¤ãã ã)
ã¯ã¬ã¼ãã«ã¼ã
å
ã»ã©æ¸ããããã«ã¢ã¸ã¥ã¼ã«æ§é ã¯(extern crate 㨠use ãé¤ãã¦èããã¨)æ¨æ§é ã«ãªã£ã¦ãã¾ãã
mod m1 {} mod m2 {}
ãããã£ã¦ãä¸ã®ä¾ã§ã¯ã¾ãã¯ã¬ã¼ãã®ã«ã¼ã(æ ¹)ãæé»ã®æä¸ä½ã¢ã¸ã¥ã¼ã«ã¨ãã¦åå¨ãããã®ç´ä¸ã« m1 㨠m2 ãããã¨ããæ§é ã«ãªãã¾ãã
ããã¦ãä¾åãã¦ããä»ã®ã¯ã¬ã¼ãã¯ãããããå¥ã®ã¢ã¸ã¥ã¼ã«æ¨ã«ãªã£ã¦ãã¾ããã¤ã¾ãã¢ã¸ã¥ã¼ã«æ¨ã¨ããã®ã¯ä¸æ£ç¢ºã§ã¢ã¸ã¥ã¼ã«æ£®ã¨èããã»ããæ£ç¢ºã§ããä»ã®ã¯ã¬ã¼ããåç §ã§ããä»çµã¿ã«ã¤ãã¦ã¯å¾è¿°ãã¾ãã
// serdeã¯ã¬ã¼ãã®ã«ã¼ãã crate::serde ã«ãã¦ã³ããã (Rust2015æä»£ã®ã¤ãã£ãªã ) extern crate serde; // failureã¯ã¬ã¼ãã®ã«ã¼ãã crate::failure ã«ãã¦ã³ãããçµã¿è¾¼ã¿ãã¬ãªã¥ã¼ãã¨ãã¦ç´æ¥å¼ã³åºã (Rust2018æä»£ã®ã¤ãã£ãªã ) use failure::Fail;
鿣è¦ã¢ã¸ã¥ã¼ã«
ã¯ã¬ã¼ãã«ã¼ã㨠mod 以å¤ã«ãã¢ã¸ã¥ã¼ã«ã¨ãã¦æ¯ãèããã®ã3ã¤ããã¾ããenumã¨traitã¨ãããã¯ã§ãã
enum MyEnum { // MyEnumã¢ã¸ã¥ã¼ã«ã®ç´ä¸ã«Variant1, Variant2ããããã®ã¨ãã¦æ±ããã Variant1, Variant2, } trait MyTrait { // MyTraitã¢ã¸ã¥ã¼ã«ã®ç´ä¸ã«my_methodããããã®ã¨ãã¦æ±ããã fn my_method(&self); } fn my_function() { // my_functionã¢ã¸ã¥ã¼ã«ã®ç´ä¸ã«å¿åã¢ã¸ã¥ã¼ã«[0]ããããã®ã¨ãã¦æ±ããã // å¿åã¢ã¸ã¥ã¼ã«[0]ã®ç´ä¸ã«ã¯Aã¨å¿åã¢ã¸ã¥ã¼ã«[1]ããã struct A; { // å¿åã¢ã¸ã¥ã¼ã«[1]ã®ç´ä¸ã«ã¯Bããã struct B; } }
enumãã¢ã¸ã¥ã¼ã«ã¨ãã¦æ±ããã¦ããã®ã¯ãã¡ããã以ä¸ãå¯è½ã«ããããã§ãã
enum MyEnum { // ããã©ã«ãã§ã¯ MyEnum::Variant1, MyEnum::Variant2 ã¨ãã¦åç §å¯è½ Variant1, Variant2, } // ãããããã¨ã§åã« Variant1, Variant2 ã¨ãã¦åç §ã§ããããã«ãªã use self::MyEnum::*;
traitãã¢ã¸ã¥ã¼ã«ãªã®ã¯åå解決æã«ã¡ã½ããåã¾ã§è§£æ±ºãã¦ãã¾ãããããã§ãã (åç¸å¯¾ãªãã¹ã¯åæ¨è«ãããªãã¨è§£æ±ºã§ããªããããã¬ã¤ãç¸å¯¾ãªãã¹ã¯åæ¨è«ã«ããã解決ã§ãã)
let x: i32 = Default::default(); // ^^^^^^^^^^^^^^^^ ããã¾ã§è§£æ±ºãã let x = <i32 as Default>::default(); // ^^^^^^^^^^^^^^^^^ ããã¾ã§è§£æ±ºãã let x = i32::default(); // ^^^ ããã¾ã§ãã解決ããªã (Defaultãã¬ã¤ãã®defaultãã©ããã¯ã¯ã£ããããªãã®ã§)
(ãã ãããã¬ã¤ãã¢ã¤ãã ã®useã¯å¥éç¦æ¢ããã¦ãã¾ã)
ãããã¯ã²ã¨ã¤ã²ã¨ã¤ãã¢ã¸ã¥ã¼ã«ã§ãããããã§ããã¼ã«ã«ã§ãã使ããªãæ§é ä½ãå®ç¾©ãããã䏿çãªã¤ã³ãã¼ãããããã¨ãã§ãã¾ãã
fn do_something_with_io() { // ãã®é¢æ°ã®ã¿ã§æå¹ãªuse use std::fmt; { // ãã®ãããã¯å ã§ãã使ããªãå struct StructForInternalUse; impl fmt::Debug for StructForInternalUse { ... } ... } }
鿣è¦ã¢ã¸ã¥ã¼ã«ã¯ç¸å¯¾ãã¹ã®ã¨ãã«ç¡è¦ããã¾ãã (self:: ã¯æãè¿ãæ£è¦ã¢ã¸ã¥ã¼ã«ãæã)
const X: i32 = 42; fn main() { const X: i32 = 53; // ã¹ã³ã¼ãå ã«ã¯2ã¤ã®Xãããã®ã§ãããå å´ã«ãã53ãæ¡ç¨ããã assert_eq!(X, 53); // æãè¿ãæ£è¦ã¢ã¸ã¥ã¼ã«ã¯ã¯ã¬ã¼ãã«ã¼ããªã®ã§ããã®ç´ä¸ã®Xã§ãã42ãæ¡ç¨ããã assert_eq!(self::X, 42); }
mod, enum, trait ã¨ãã¦å®ç¾©ããã¦ãããã®ã¯Defã¨ãã¦è¦ªã¢ã¸ã¥ã¼ã«ããååã§åç
§ã§ãã¾ããããããã¯ã«å¯¾å¿ããå¿åã¢ã¸ã¥ã¼ã«ã¯è¦ªã¢ã¸ã¥ã¼ã«ããã®ãªã³ã¯ã¯ãªããåãã親ã¸ã®ãªã³ã¯ããããã¾ããã
åã¨ã¤ãªã¢ã¹åæåã®ããªã¢ã³ã
以ä¸ã®ã³ã¼ãã¯ç¾å¨ã®Rustã§ã¯åãã¾ããã (playground)
// #![feature(type_alias_enum_variants)] enum MyEnum { Variant1, Variant2, } // åãDef use MyEnum as MyEnum2; // ç°ãªãDef type MyEnum3 = MyEnum; fn main() { // OK let x1 = MyEnum::Variant1; // OK let x2 = MyEnum2::Variant1; // ã¨ã©ã¼ã #![feature(type_alias_enum_variants)] ãå¿ è¦ let x3 = MyEnum3::Variant1; }
åè¿°ã®ããã«ãåæåã®ããªã¢ã³ãã«åºã¦ãã :: 㯠use MyEnum::*; ãªã©ãå¯è½ã«ããããã«åå解決ã«ãã£ã¦è§£æ±ºããã¾ããã¨ããããåå解決ã®è¦³ç¹ããã¯åã¨ã¤ãªã¢ã¹ã¯åãDefã§ã¯ãªãã®ã§ãåæåã«(ã¢ã¸ã¥ã¼ã«çã«)ã¶ãä¸ãã£ã¦ããããªã¢ã³ãã¯å¼ãç¶ãã¾ããã
RFC2338 ã§ãã®ä¸ä¾¿ãè§£æ¶ãããäºå®ã§ããRFC2338ã®ç¾ç¶ã®å®è£ ã§ã¯ååè§£æ±ºã«æãå ¥ãã¦ãã¾ããããããã«ãåè§£æ±ºã®æ®µéã§é¢é£ã¢ã¤ãã ã®äºç¨®ã¨ãã¦å¦çãã¦ãã¾ããæ¬è¨äºã®æåã®ã»ãã§ããåå解決ã¯ãã¹ãéä¸ã¾ã§è§£æ±ºãããã¨æ¸ãã¾ããããããã§è¨ãã¨ä»¥ä¸ã®ããã«ãªãã¾ãã
#![feature(type_alias_enum_variants)] enum MyEnum { Variant1, Variant2, } use MyEnum as MyEnum2; type MyEnum3 = MyEnum; fn main() { let x1 = MyEnum::Variant1; // ^^^^^^^^^^^^^^^^ åå解決ã§ããã¾ã§è§£æ±ºããã let x2 = MyEnum2::Variant1; // ^^^^^^^^^^^^^^^^^ åå解決ã§ããã¾ã§è§£æ±ºããã let x3 = MyEnum3::Variant1; // ^^^^^^^ åå解決ã§ããã¾ã§è§£æ±ºããã // ^^^^^^^^ åæ¨è«æã«ããã解決ãã }
ãã®å®è£
ã§ã¯RFCæ¬æã«æ¸ããã¦ããä¾(type alias enum variant ã use ãããã¨ãã¦ãã)ãã³ã³ãã¤ã«ã§ãã¾ããããããæå³ãããã®ã§ãããã©ããã¯ãã䏿ã§ãeddybæ°ã®çºè¨ãè¦ãã«ã¯ãããããã¾ãèæ
®ãã¦ããªãããã«ãè¦ãã¾ããç®çè«çã«ãã use ãå¿
è¦ãªå ´é¢ã§ã¯ãã¨ã®åæåããå¼ã£å¼µã£ã¦ããã°ååã¨ãè¨ããã®ã§ãRFCã®æ¬æãoutdatedã§ããã¨èããä½å°ãããã¾ãã
ãã type alias enum variant ã use ã§ã使ããããã«ããã¨ãªã£ãå ´åã¯ãã¢ã¸ã¥ã¼ã«æ¨ã®æ§é èªä½ã«ä½ããã®å½±é¿ãåã¼ãã¨æããã¾ãã
ãã¬ã¤ãå¥å
RFC1733ã®ãã¬ã¤ãå¥åã¯ãã¬ã¤ãå¥åããé¢é£ã¢ã¤ãã (ã¡ã½ããã»é¢é£é¢æ°ã»é¢é£å®æ°ã»é¢é£å)ãå¼ããã¨ã«ã¤ãã¦è¨åãã¦ããªãã®ã§ãä»ã®ã¨ããåå解決ã¸ã®å½±é¿ã¯ãªãããã§ãã
ã¾ã¨ã
ã¢ã¸ã¥ã¼ã«æ¨ã¯ãã¤ã¼ãã«ã¯ã¢ã¸ã¥ã¼ã«ããã¼ãã¨ããèå¥åãã©ãã«ã¨ããã©ãã«ã¤ãæ¨ã¨ããã¾ãããå¿åã¢ã¸ã¥ã¼ã«ãåå空éãªã©ãããããæ£ç¢ºã«ã¯ããè¤éãªæ§é ãæã£ã¦ãããã¨ã説æãã¾ããã
次å㯠use ã®æåã¨ãããã解決ããããã®ã¢ã«ã´ãªãºã ã«ã¤ãã¦èª¬æãã¾ãã
Rustã®ã¢ã¸ã¥ã¼ã«ã詳細ã«çè§£ãã(2) åå解決ã®å½¹å²ã¨ç¨èª
æ¦è¦: Rust2018以éãRustã®ã¢ã¸ã¥ã¼ã«ã·ã¹ãã ã¯å ¥éããããããã¤ãã¹ã¿ã¼ãã«ãããªãã¾ãããããã§æ¬è¨äºã§ã¯ããã®ä¸¡æ¹ãéæãããã¨ãç®æãã¾ããã
- ã¢ã¸ã¥ã¼ã«å ¥é
- åå解決ã®å½¹å²ã¨ç¨èª
- ã¢ã¸ã¥ã¼ã«ã°ã©ãã®æ§é
- ã¤ã³ãã¼ã解決
- å¯è¦æ§
- ãã¹è§£æ±º
- åå解決ã¨ãã¯ã
æ¬è¨äºã¯2017å¹´ã«æ¸ããè¨äº (https://qnighy.hatenablog.com/entry/2017/03/27/070000, https://qnighy.hatenablog.com/entry/2017/04/24/070000 ) ã¨åããã¼ãã§ãRust2018ãèæ ®ãã¦æ¹ãã¦ã¾ã¨ãç´ãããã®ã§ãã
注æ: æ¬è¨äºä¸ã®ãµã³ãã«ã³ã¼ãã®å¤ãã¯ãRustã®ç´°ãã仿§ãå®è£ ã調ã¹ãããã®ãã®ã§ãããå®éã«æç¨ãªããã°ã©ãã³ã°ãã¿ã¼ã³ã§ããã¨ã¯éãã¾ãããã¾ããå®è³ªçã«ãã°ã«è¿ãæåã説æãã¦ãããã®ããããããå°æ¥ã«ããã£ã¦åãåä½ã§ãããã¨ã¯ãã¾ãä¿è¨¼ã§ãã¾ããã
Rust2015ã¾ã§ã®ã¢ã¸ã¥ã¼ã«ã¾ãã
ããã¾ã§ã¯Rust2018ã¤ãã£ãªã ãåæã«èª¬æããã¦ãã¾ãããã以éã¯è©³ç´°ãªèª¬æã«å ¥ãããã«Rust2015(ç¹ã«1.29以å)ã§ã®ç¶æ³ã軽ã説æãã¾ãã
crate::ã¯åå¨ãã¾ããã§ããã- ãããã«ã
::ã§å§ã¾ãæ§å¼ã®çµ¶å¯¾ãã¹ã使ã£ã¦ãã¾ããã - ã¾ãããã¯ãè¡çæ§ã®ããã«
$crate::ã¨ããç¹æ®ãªçµ¶å¯¾ãã¹ãããã¾ããã
- ãããã«ã
- extern prelude (å¤é¨ã¯ã¬ã¼ãåãã¹ã³ã¼ãå
ã«å
¥ãæ©è½) ã¯åå¨ãã¾ããã§ããã
- ãããã«ã
extern crateã§å¤é¨ã¯ã¬ã¼ãã®ã«ã¼ãããã¼ã«ã«ã¯ã¬ã¼ãã®ã«ã¼ãç´ä¸ã«ãã¦ã³ããã¦ãã¾ããã
- ãããã«ã
- ãã¯ãã¯åå解決ã«çµ±åããã¦ãã¾ããã§ããã
- ãã¯ããuseãããããã«ã
#[macro_use] extern crateã使ã£ã¦ãã¾ããã - ãã¯ããpubã§ã¨ã¯ã¹ãã¼ããããããã«ã
#[macro_export] macro_rules!ã使ã£ã¦ãã¾ããã - ãã¯ãå®ç¾©ã¯ãã¯ã使ç¨ãããæåã«åå¨ããå¿ è¦ãããã¾ããã
- ãã¯ããuseãããããã«ã
- 䏿§ãã¹ã§ã¯ããã¾ããã§ããã
useã¾ãã¯pub(in)ã®æå®æã®ã¿ãæé»ã®çµ¶å¯¾ãã¹ãé©ç¨ããã¦ãã¾ããã
ã¾ããåå解決èªä½ã¨ã¯ç´æ¥ã¯é¢ä¿ãªãã§ããããµãã¢ã¸ã¥ã¼ã«ãå¥ãã¡ã¤ã«ã«åé¢ããã¨ãã¯è¦ªãã¡ã¤ã«ã lib.rs/main.rs/mod.rs ã§ããå¿
è¦ãããã¾ããã (ãã¨ã°ã foo.rs ã§ mod bar; ã¨ãã£ã¦ foo/bar.rs ãåç
§ããã®ã¯ç¦æ¢ããã¦ããããã®å ´å㯠foo.rs ã foo/mod.rs ã«ãªãã¼ã ããå¿
è¦ããã£ã)
ãªãã1.30以éã§ã¯ãRust2018ã¸ã®ã¹ã ã¼ãºãªç§»è¡ã®ããã«ä¸è¨ã®æ©è½ã®ãã¡ä¸é¨ãRust2015ã«ãéæ¾ãã¦ãã¾ãã
Rust2015-2018ç§»è¡ã¤ãã£ãªã
Rustã¯2015ã®ããã¸ã§ã¯ãã2018ã«ç§»è¡ããããã®ä»çµã¿ãæä¾ãã¦ãã¾ããããã¯ä»¥ä¸ã®æé ãè¸ã¿ã¾ãã
- ãã«ãããã
cargo fix --editionãå®è¡ããã- ãã«ãããã
Cargo.tomlã«edition = "2018"ãè¨è¼ããã- ãã«ãããã
cargo fix --edition-idiomsãå®è¡ããã- ãã«ãããã
ãã®æé ãããããããã«ãRust2018ã¯ãRust2015ã§ã2018ã§ãã³ã³ãã¤ã«ãéãä¸éç¶æ ãã(åºæ¬çã«ã¯)åå¨ããããã«è¨è¨ããã¦ãã¾ããã¢ã¸ã¥ã¼ã«ã«é¢ãã¦ã¯ã以ä¸ã®ãããªç¶æ ãããã«ãããã¾ãã
extern crateã¯ç¶æãã¾ãã::ã§å§ã¾ããã¹ã¯ä»¥ä¸ã®2種é¡ã«åãã¾ãã::[å¤é¨ã¯ã¬ã¼ãå]ã¨ãªã£ã¦ãããã®ã¯ç¶æãã¾ãã::[ã¯ã¬ã¼ãå ã®åå]ã¨ãªã£ã¦ãããã®ã¯crate::ã«ç½®ãæãã¾ãã
useã§ä½¿ããã¦ãããã¹ã«ã¤ãã¦ããä¸è¨ã¨åæ§ã®è¦åãé©ç¨ãã¦ç½®ãæãã¾ãã
以ä¸ã§è¿°ã¹ã仿§ã®ä¸é¨ã¯ããã®ãããªãRust2015æç¹ã§ã®äºææ§ãããç§»è¡ç¶æ ãåå¨ãããã¨ããéæããããã«åå¨ãã¦ãã¾ãã
åå解決ã¨ã¯
ããããã¯ããããã¦ãç¨èªã®å®ç¾©ããããããã¾ããã¾ãã¯åå解決ã«ã¤ãã¦ã
ãã¨ãã°ã以ä¸ã®ã³ã¼ã (playground) ã¯42ãåºåãã¾ãã
fn main() { dbg!(Vec::new()); } #[allow(non_snake_case)] mod Vec { pub fn new() -> i32 { 42 } }
ãã®ããã«ãåã Vec::new ã§ããããä½ãæããã¯å ´åã«ãã£ã¦ç°ãªãã¾ããããã(éä¸ã¾ã§)確å®ãããã®ãåå解決ã®å½¹å²ã§ãã
ã°ãã¼ãã«ãªååã ãã§ã¯ãªããã¼ã«ã«ãªååã®è§£æ±ºãããã§è¡ããã¾ãããã¨ãã°ã
fn main() { let x = 42; let x = 53; dbg!(x); }
ã§ã dbg!(x) å
ã® x ãã©ã¡ãã® let x ã«å¯¾å¿ãã¦ããããæ±ºå®ããã®ã¯ãã®ãã§ã¼ãºã§ãã
ãã¹
ãã¹ã¯ :: ã§åºåãããååã®åã§ãããã ãã ::<> ã¨ããå½¢ã®ãã® (turbofish) ã¯ã¸ã§ããªã¯ã¹ãã©ã¡ã¼ã¿ã¼ã®ä¸é¨ãªã®ã§ããã¹ã»ã°ã¡ã³ãã«ã¯æ°ãã¾ããã
Vec... 1ã»ã°ã¡ã³ãã®ãã¹std::vec::Vec... 3ã»ã°ã¡ã³ãã®ãã¹Vec<i32>::new... 2ã»ã°ã¡ã³ãã®ãã¹Vec::<i32>::new... 2ã»ã°ã¡ã³ãã®ãã¹
ç¹æ®ãªãã®ã¨ãã¦ã¯ ::, $crate::, crate::, self::, super:: ã§å§ã¾ããã®ãããã¾ãã大éæã«ã¯ä»¥ä¸ã®ãããªå½¹å²ã§ãã
::... Rust2015ã§ã¯çµ¶å¯¾ãã¹ãRust2018ã§ã¯extern preludeãã¹ã¨ãã¦æ¯ãèãã¾ããå é¨çã«ã¯{{root}}::ã¨ãã¦æ±ããã¾ãã$crate::,crate::... 絶対ãã¹ã§ããå ã ã¯$crateã¨ãããã¯ãå°ç¨ã®ãã¹ããããåãç¨éã®crateããã¨ãã追å ããã¾ããã$crate::ã¨crate::ã®åä½ã¯ã»ã¼åãã§ããself::,super::... ç¸å¯¾ãã¹ã§ããsuperã¯å é ã¾ãã¯self::ã®ç´å¾ããä»»æåæ°ç¶ãããã¨ãã§ãã¾ãã
. ã§å§ã¾ããã® (s.parse::<i32>() ã® parse ãªã©) ã¯ãã¹ã§ã¯ããã¾ããã
ãã¹ã¨ã¸ã§ããªã¯ã¹ãã©ã¡ã¼ã¿ã¼
åæèã¨å¤æèã§ã¯ãã¹è¦ç´ ã«ã¸ã§ããªã¯ã¹ãã©ã¡ã¼ã¿ã¼ãä»ä¸ã§ãã¾ããæå³çãªæ±ãã¯å¾è¿°ãã¾ããã以ä¸ã®ãããªè¦åãããã¾ãã
- ã¢ã¸ã¥ã¼ã«æè (
use,pub()) ã§ã¯ã¸ã§ããªã¯ã¹ãã©ã¡ã¼ã¿ã¼ã¯å©ç¨ä¸å¯è½ - åæè (æ§æçã«åããã¬ã¤ããæå¾
ããã¦ããå ´æ) ã§ã¯
<>ã§ã¸ã§ããªã¯ã¹ãã©ã¡ã¼ã¿ã¼ãæå®å¯è½()->ã¨ããç¹æ®ãªã¸ã§ããªã¯ã¹ãã©ã¡ã¼ã¿ã¼æå®ãå©ç¨å¯è½ãããã¯Fn(i32) -> i32ã®ããã«ä½¿ãã¾ãã::<>ãä¸å¿ä½¿ãã
- 弿è (æ§æçã«å¼ããã¿ã¼ã³ãæå¾
ããã¦ããå ´æ) ã§ã¯
::<>ã§ã¸ã§ããªã¯ã¹ãã©ã¡ã¼ã¿ã¼ãæå®å¯è½
åæè or 弿èã®åºå¥ã¯é£ãããªãã§ãããå°ããããã¥ããã±ã¼ã¹ãæ¸ãã¦ããã¾ãã
- ã¬ã³ã¼ãæ§é ä½ã®åæåæ§æ
MyStruct { .. }ã¯å¼æèã ããåå空é(å¾è¿°)ã¨ãã¦ã¯ååå空éãç¨ãããã asã®ç´å¾ã¯åæè1 as usize < 2ã®ãã¼ã¹ã«å¤±æããã®ã¯ãã®ãã
- 弿èã®ãã¹ã§ãããã®ã¸ã§ããªã¯ã¹ãã©ã¡ã¼ã¿ã¼ã¯åæèã«ãªã
Vec::<Vec<i32>>::new()ã®ããã«ãªã
ã¸ã§ããªã¯ã¹ãã©ã¡ã¼ã¿ã¼ãå®éã«å¦çããã®ã¯åæ¨è«ã»åæ¤æ»æãªã®ã§ã以éã¯ã¸ã§ããªã¯ã¹ãã©ã¡ã¼ã¿ã¼ã«ã¯è§¦ãã¾ããã
修飾åã¤ããã¹
<>:: ã§å§ã¾ãç¹æ®ãªãã¹ãããã¾ã(ããã¯turbofish ::<> ã¨ã¯å¥ç©)ãããã¯ããã«ä»¥ä¸ã®2種é¡ã«åãããã¾ãã
<T>::ã§å§ã¾ããã® ...Tã¯åã<T as Trait>::ã§å§ã¾ããã® ...Tã¯åã§ãTraitã¯ãã¬ã¤ãã
ãã®2ã¤ã¯åå解決ã®è¦³ç¹ããã¯å¤§ããç°ãªãã¾ãã <T>:: ã¯åç¸å¯¾ãã¹ãªã®ã§ãåºæ¬çã«åå解決ã§ã¯ã»ã¨ãã©ä½ãã§ããã«åæ¨è«ã«ãã®å¦çãå§ãããã¨ã«ãªãã¾ãã
䏿¹ã <T as Trait>:: ã®ã»ãã¯å®éã¯åãªãã¸ã§ããªã¯ã¹ãã©ã¡ã¼ã¿ã¼ã®ã¤ãããã¹ã§ãããã¬ã¤ãã«ã¨ã£ã¦ã® Self ã¯ç¬¬0ã¸ã§ããªã¯ã¹ãã©ã¡ã¼ã¿ã¼ã§ããã¨ããååã念é ã«ç½®ãã¦ã以ä¸ã®ã³ã¼ããçºããã¨ããããããã¨æãã¾ãã
// `A: Into<B>` ã¯ãAãBã«å¤æã§ããã¨ãããã¨ã§ããã // AãBãæå®ããªãã¨ã let x: i64 = Into::into(42); // Bã ãæå®ããã¨ã let x = Into::<i64>::into(42); // Aã ãæå®ããã¨ã let x: i64 = <i32 as Into<_>>::into(42); // AãBãæå®ããã¨ã let x = <i32 as Into<i64>>::into(42);
ãããã£ãèæ¯ããããã¨ãã° <i32 as std::default::Default>::default ã¯4ã»ã°ã¡ã³ãã®ãã¹ (= std::default::Default::default) ã¨ãã¦æ±ããã¾ãã
Def
Rustã«ãããåå解決ã¯ã³ã³ãã¤ã©ã®ãã§ã¼ãºã®ã²ã¨ã¤ã§ããã¹(ã®éä¸ã¾ã§)ãDefã«è§£æ±ºããå¦çã§ããDef㯠src/librustc/hir/def.rsã«å®ç¾©ãããã¾ãã
Defã®å 容ã¯å¤æ§ã§ãç¾ç¶ã¯ä»¥ä¸ã®å 容ãå«ã¾ãã¦ãã¾ã (èªã¿é£ã°ãã¦OKã§ã)
- ååå空éã«å±ããDef
- ã¢ã¸ã¥ã¼ã« (
mod my_module;) - æ§é ä½ (
struct MyStruct;) - å
±ç¨ä½ (
union MyUnion {}) - åæå (
enum MyEnum {}) - åæåã®ããªã¢ã³ã (
enum MyEnum { MyVariant }) - ãã¬ã¤ã (
trait MyTrait {}) - åå¨å (
existential type MyType;) RFC2071 - åã¨ã¤ãªã¢ã¹ (
type MyType = i32;) - å¤é¨å (
extern { type MyType; }) RFC1861 - ãã¬ã¤ãã¨ã¤ãªã¢ã¹ (
trait MyTrait = Into<i32>;) RFC1733 - é¢é£å (
trait MyTrait { type MyAssocType; }/impl MyTrait for MyStruct { type MyAssocType = i32; }) - é¢é£åå¨å (
impl MyTrait for MyStruct { existential type MyAssocType; }) RFC2071 - ããªããã£ãå (
i32) - åãã©ã¡ã¼ã¿ã¼ (
fn foo<MyTyParam>() {}) - Selfå (
Self) - ãã¼ã«ã¢ã¸ã¥ã¼ã« (
rustfmtãªã©)
- ã¢ã¸ã¥ã¼ã« (
- å¤åå空éã«å±ããDef
- 颿° (
fn my_function() {}) - 宿° (
const MY_CONST: i32 = 42;) - 宿°ã¸ã§ããªã¯ã¹ãã©ã¡ã¼ã¿ã¼ (
fn foo<const MY_CONST: i32>() {}) RFC2000 - static夿° (
static MY_STATIC: i32 = 42;) - ã¿ãã«æ§é ä½ã»ã¦ãããæ§é ä½ã®ã³ã³ã¹ãã©ã¯ã¿ (
struct MyStruct;/struct MyStruct();) - åæåã®ã¿ãã«ããªã¢ã³ãã»ã¦ãããããªã¢ã³ãã®ã³ã³ã¹ãã©ã¯ã¿ (
enum MyEnum { MyVariant1, MyVariant2() }) - ã¿ãã«æ§é ä½ã®Selfã³ã³ã¹ãã©ã¯ã¿ (
Self) - é¢é£é¢æ° (
trait MyTrait { fn my_assoc_function(); }/impl MyTrait for MyStruct { fn my_assoc_function() {} }) - é¢é£å®æ° (
trait MyTrait { const MY_ASSOC_CONST: i32; }/impl MyTrait for MyStruct { const MY_ASSOC_CONST: i32 = 42; })
- 颿° (
- å¤åå空éã«å±ãããã¼ã«ã«Def
- ãã¼ã«ã«æç¸ (
let my_var = 42;) - Upvar: ãã£ããã£ããã夿° (
let my_upvar = 42; let closure = || { .. my_upvar .. };) - ã©ãã« (
'outer: loop { .. })
- ãã¼ã«ã«æç¸ (
- ãã¯ãåå空éã«å±ããDef
- ãã¯ã (
macro_rules! my_macro {}) - ãã¯ã以å¤ã®å±æ§å¤ (
#[inline]ãªã©)
- ãã¯ã (
ãã®Defã®å®ç¾©ã«ã¯extern crate 㨠use ãå«ã¾ãã¦ããªããã¨ã«æ³¨æãã¦ãã ããããããã¯æ¢åã®Defã¨åããã®ãä½ãã¾ãããããã£ã¦ã以ä¸ã®ã³ã¼ãã§ã¯â¦â¦
type MyType1 = i32; use self::MyType1 as MyType2; type MyType3 = i32;
MyType1 㨠MyType2 ã¯åãDefã§ããã MyType1 㨠MyType3 ã¯å¥ã®Defã¨ãããã¨ã«ãªãã¾ãã
åå解決ã¨å解決ã®å½¹å²åæ
åå解決ã¯ããã¹(ã®éä¸ã¾ã§)ãDefã«è§£æ±ºããå¦çãã¨æ¸ããéããååè§£æ±ºã®æç¹ã§ã¯ãã¹ãå®å ¨ã«ã¯è§£æ±ºãããªãå ´åãããã¾ãã
ãã¨ãã°ã以ä¸ã®ã³ã¼ã (playground) ã¯ã¨ã©ã¼ã«ãªãã¾ããããã¯ã Option ã2種é¡ã® cloned ãæã£ã¦ããã Option::cloned ã¨æ¸ããæç¹ã§ã¯ç¢ºå®ã§ããªãããã§ãã
fn main() { Option::cloned(Some(&42)); //~^ERROR multiple applicable items in scope }
ããã¯ãåãæç¤ºãããã¨ã§è§£æ±ºã§ãã¾ãã (playground)
fn main() { Option::<&i32>::cloned(Some(&42)); }
ãã®ãåã使ã£ã¦è§£æ±ºãããã¨ããã®ã¯ããã£ã¨è¤éãªå½¢ã§ç¾ãããã¨ãããã¾ãããã¨ãã°ä»¥ä¸ã®ããã«æ¸ãã¦ã解決ããã¾ãã (playground)
fn main() { Option::<<&Vec<i32> as IntoIterator>::Item>::cloned(Some(&42)); }
ãããããã®ã¾ã§ååè§£æ±ºã®æç¹ã§è§£æ±ºãããã¨ããã¨è¤éã«ãªãããããããåã«ä¾åãã¦æ±ºã¾ãé¨åã¯åå解決ããå¾ã®ãã§ã¼ãº(忍è«ã»åæ¤æ»)ã§è¡ããã¾ãããã®ãããåå解決ã§ã¯ä»¥ä¸ã®ããã«ãã¹ã®ã©ãã¾ã§ãä½ã¨ããDefã«è§£æ±ºãããããæçµçãªè§£æ±ºçµæã¨ãã¦ç¨ãã¾ãã
#[derive(Copy, Clone, Debug)] pub struct PathResolution { // éä¸ã¾ã§ã®è§£æ±ºçµæ base_def: Def, // 解決ã§ããªãã£ããã¹ã»ã°ã¡ã³ãã®åæ° unresolved_segments: usize, }
ãã¨ãã°ãåå解決ã¯ä»¥ä¸ã®ã¨ããã¾ã§è§£æ±ºãã¾ãã
let v = Vec::<i32>::new(); // ^^^ ããã¾ã§ let v = Clone::clone(&v); // ^^^^^^^^^^^^ ããã¾ã§ let v = Vec::clone(&v); // ^^^ ããã¾ã§ let v = <Vec<i32> as IntoIterator>::Item::min_value(); // ^^^^^^^^^^^^^^^^^^^ ããã¾ã§ let it = std::iter::once(42); // ^^^^^^^^^^^^^^^ ããã¾ã§
åãçç±ã§ãã¡ã½ããåãåå解決ã§ã¯å¦çããã¾ããã
let x = Some(42); let x = x.unwrap(); // ^^^^^^ ãããOption::unwrapãªã®ãResult::unwrapãªã®ãã¯å¾ã§æ±ºã¾ã
ãã®ããã«ãããã§è§£èª¬ãã¦ãããåå解決ãã®ç¯çã§ã¯åæ¨è«ã«é ¼ããªãç¯å²ã§ã®è§£æ±ºããè¡ãã¾ããããã®2段é解決ã®ä»çµã¿ãé ã«å ¥ãã¦ããã¨æ§é ã®æ´çãã¤ããããã¨æãã¾ãã
ååè§£æ±ºã®æé
åå解決ã®è²¬ä»»ç¯å²ã¯æç¢ºã«ãªãã¾ããããã®æé ãå°ãç´°ããå²ãã¨ä»¥ä¸ã®ããã«ãªãã¾ãã
useã¨extern crate以å¤ã®æ§é (ã¢ã¸ã¥ã¼ã«æ¨) ã確å®ããããuseã¨extern crateã解決ããã- ããã«ããã¢ã¸ã¥ã¼ã«ã°ã©ããæ§æãããã
- åãã¹ã®æãã¦ããå
容ã(éä¸ã¾ã§)確å®ãããã
- ãã ãããã¯ãã®åå解決ã®çµæ1.ã«æ»ãå ´åããã (RFC1561)
ãããã¦åå解決ãçµããã¨ããã®çµæãç¹ãè¾¼ã¿ãªããAST(æ½è±¡æ§ææ¨)ãHIR(é«ã¬ãã«ä¸é表ç¾)ã«å¤æãã¾ããHIRã¯ASTã¨ããä¼¼ã¦ãã¾ããåå解決æ¸ã¿ãªã®ã§ãå¾ã®ãã§ã¼ãºã¯åãã¹ãæãDefãç°¡åã«ç¹å®ã§ãã¾ãã
ã¾ã¨ã
foo::bar::baz ãªã©ã®ãã¹ãæãå®ä½(Def)ãã©ããªã®ãã対å¿ã¥ããã®ãåå解決ã§ãããã ãã Vec::new() ã x.unwrap() ãªã©åã«ç¸å¯¾ãã¦æ±ºã¾ããã®ã¯ãã®ãã§ã¼ãºã§ã¯è§£æ±ºã§ããªãã®ã§ãéä¸ã¾ã§è§£æ±ºããç¶æ
ã§é²ã¿ã¾ãã
次åã¯ãã¢ã¸ã¥ã¼ã«ã°ã©ãã®æ§é ã説æãã¾ãã
Rustã®ã¢ã¸ã¥ã¼ã«ã詳細ã«çè§£ãã(1) ã¢ã¸ã¥ã¼ã«å ¥é (ãã®åã¯ç°¡åã§ãï¼)
æ¦è¦: Rust2018以éãRustã®ã¢ã¸ã¥ã¼ã«ã·ã¹ãã ã¯å ¥éããããããã¤ãã¹ã¿ã¼ãã«ãããªãã¾ãããããã§æ¬è¨äºã§ã¯ããã®ä¸¡æ¹ãéæãããã¨ãç®æãã¾ããã
- ã¢ã¸ã¥ã¼ã«å ¥é
- åå解決ã®å½¹å²ã¨ç¨èª
- ã¢ã¸ã¥ã¼ã«ã°ã©ãã®æ§é
- ã¤ã³ãã¼ã解決
- å¯è¦æ§
- ãã¹è§£æ±º
- åå解決ã¨ãã¯ã
æ¬è¨äºã¯2017å¹´ã«æ¸ããè¨äº (https://qnighy.hatenablog.com/entry/2017/03/27/070000, https://qnighy.hatenablog.com/entry/2017/04/24/070000 ) ã¨åããã¼ãã§ãRust2018ãèæ ®ãã¦æ¹ãã¦ã¾ã¨ãç´ãããã®ã§ãã
ã¢ã¸ã¥ã¼ã«ã¨ã¯
ã¢ã¸ã¥ã¼ã«ã¯Rustã®ããã°ã©ã ãåå²ããåä½ã®ã²ã¨ã¤ã§ããã¯ã¼ã¯ã¹ãã¼ã¹ã»ã¯ã¬ã¼ãã»ã¢ã¸ã¥ã¼ã«ã¨ããåä½ã«ãªã£ã¦ããã¨èãã¦ãã ããã
- ã¯ã¼ã¯ã¹ãã¼ã¹ã¯é¢é£ããã©ã¤ãã©ãª(ã¯ã¬ã¼ã)ãã²ã¨ã¤ã«ã¾ã¨ãããã®ã§ãé常1ã¤ã®gitãªãã¸ããªã«å¯¾å¿ãã¾ãããã¨ãã°AWSã¯ã©ã¤ã¢ã³ãã©ã¤ãã©ãªã§ããrusoto/rusotoã«ã¯1ã¤ã®ã¯ã¼ã¯ã¹ãã¼ã¹ãããããã®ä¸ã«ã¯AWSã¯ã©ã¤ã¢ã³ãã®ã³ã¢ã©ã¤ãã©ãªã¨åãµã¼ãã¹ã«å¯¾å¿ããã©ã¤ãã©ãªãåå¨ãã¦ãã¾ããéçºæã«ä¾åé¢ä¿ã®ãã«ããéç´ããããã®ãã®ãªã®ã§ã
crates.ioã«ã¢ãããã¼ãããæç¹ã§ã¯ã¼ã¯ã¹ãã¼ã¹ã¨ããã¾ã¨ã¾ãã«æå³ã¯ãªããªãã¾ãã - ã¯ã¬ã¼ã (crate)ã¯ä¾å解決ã®åä½ã§ããã¯ã¬ã¼ãå士ã¯ä¸æ¹éè¡ã®ä¾åé¢ä¿ããæã¦ã¾ãã(dev-dependenciesãªã©ã®ä¾å¤ãã)
- ä¾åã®æ¹åãã¯ã£ãããã¦ããå ´å(Bã¯Aã«ä¾åããããAã¯Bã«ä¾åããã«åç¬ã§ã使ãã)ã¯ã¯ã¬ã¼ããåå²ããã®ãããã§ãããã
- 並åã³ã³ãã¤ã©ã¯å®è£
éä¸ãªã®ã§ã大ããªããã¸ã§ã¯ãã§ä¸¦åæ§ãé«ããå ´åã¯ä¾åé¢ä¿ãèæ
®ãã¦ã¯ã¬ã¼ããåå²ããã®ãã»ãªãªã¼ã§ãããã¨ãã°Rustã³ã³ãã¤ã©ã§ã¯å
±éã¤ã³ã¿ã¼ãã§ã¼ã¹ã
rustcå ã§å®ç¾©ããåãã§ã¼ãºã®ã¢ã«ã´ãªãºã ãrustc_resolve,rustc_typeck,rustc_mirãªã©ã§å®è£ ãã¦ããrustc_driverã§éç´ããã¨ããæ§é ã«ãªã£ã¦ãã¾ãã
- ã¢ã¸ã¥ã¼ã«ã¯ã¯ã¬ã¼ãå
ã§æ©è½ãå°ããåä½ã«ããã¦æ´çããããå®è£
ãé è½ãããããããã«ä½¿ãã¾ãã
- 1ãã¡ã¤ã«ã1ã¢ã¸ã¥ã¼ã«ã«ãªãããã«æ¸ãã®ãä¸è¬çã§ãã
- åºæ¬çã«ã¯ã¬ã¼ãå ¨ä½ãã³ã³ãã¤ã«ãããã®ã§ãã¹ãªã åã«ã¯ä½¿ãã¾ããã
å®éã«ããã°ã©ã ãæ¸ãå§ããã¨ãã¯ã1ã¢ã¸ã¥ã¼ã«ããå§ãã¦ãå¿ è¦ã«å¿ãã¦ã¢ã¸ã¥ã¼ã«åå²âã¯ã¬ã¼ãåå²âãªãã¸ããª(ã¯ã¼ã¯ã¹ãã¼ã¹)åå²ã¨ããå½¢ãä¸è¬çãã¨æãã¾ãã
Rustã®ã¢ã¸ã¥ã¼ã«ã¯(ä»ã®å¤ãã®è¨èªã¨åæ§)ãã¡ã¤ã«ã·ã¹ãã ã®ããã«æ¨æ§é ã«ãªã£ã¦ãããã¢ã¸ã¥ã¼ã«ãæå®ããã¨ãã®è¨æ³ (foo::bar::baz) ã¯ãã®ãã®ãã°ããã¹ã¨å¼ã³ã¾ãã
Rust2018ã§ä¸æ§ãã¹ãå°å ¥ããã
Rust2018ã«ãããã¦RFC2126ã§å®ããããã¢ã¸ã¥ã¼ã«ã·ã¹ãã ã®æ¹é©ãå®è£ ããã2015æç¹ã§ã®ã¢ã¸ã¥ã¼ã«ã·ã¹ãã ã®åé¡ç¹ãæ¹åããã¾ãããäºææ§ã®ããã«å¤ãæ¸ãæ¹ãæ®ããã¦ããã®ã§å ¨ä½ã®ä»çµã¿ã¯è¤éã«ãªãã¾ããããã¤ãã£ãªããã£ãã¯ãªRustã³ã¼ãã§ã®ã¢ã¸ã¥ã¼ã«ã®åä½ã¯ããªããããããããªã£ãã®ã§ã¯ãªããã¨æãã¾ãã
Rust2018æä»£ã®ã¤ãã£ãªããã£ãã¯ãªRustã³ã¼ãã§ã¯ã
extern crateã使ãã¾ããã- 代ããã«ãextern prelude (1.30.0ã§å®å®å) ã使ãã¾ãã
#[macro_use],#[macro_export]ã使ãã¾ããã- 代ããã«ããã¯ãã®åå解決 (RFC1561; 1.30.0ã§å®å®å) ã使ãã¾ãã
::ã§å§ã¾ããã¹ã¯åºæ¬çã«ä½¿ãã¾ããã::ã§å§ã¾ããã¹ã®æå³èªä½ãRust2018ã§å¤§ããå¤åãã¾ããã- 代ããã«ã
crate::(1.30.0ã§å®å®å) ã使ãã¾ãã
$crate::ã§å§ã¾ããã¹ã¯ä½¿ãã¾ããã- 代ããã«ã
crate::(1.30.0ã§å®å®å) ã使ãã¾ãã
- 代ããã«ã
ç¹ã«ãããããå®ããã¨ã§ä¸æ§ãã¹ (1.32.0ã§å®å®å) ã®æ©æµãåãããã¨ãã§ãã¾ããããªãã¡ã use ã pub(in) ã§ã®ãã¹æå®ã¨ããã以å¤ã®ç®æã§ã®ãã¹æå®ãä¸è²«ããã¨ãããã¨ã§ãã (playground)
pub enum RealWeekday { Sun, Fri, Sat, } pub mod m1 { pub enum Weekday { Sun, Sat, } // ããã©ã«ããã¹ (useå ) pub use Weekday::Sun; // ããã©ã«ããã¹ (use以å¤) pub const X: Weekday = Weekday::Sun; // extern preludeãã¹ (useå ) pub use chrono::naive::MIN_DATE; // extern preludeãã¹ (use以å¤) pub const Y: chrono::NaiveDate = chrono::naive::MIN_DATE; // ç¸å¯¾ãã¹ (useå ) pub use self::Weekday::Sat; // ç¸å¯¾ãã¹ (use以å¤) pub const Z: self::Weekday = self::Weekday::Sat; // 絶対ãã¹ (useå ) pub use crate::RealWeekday::Fri; // 絶対ãã¹ (use以å¤) pub const W: crate::RealWeekday = crate::RealWeekday::Fri; }
ããã¯1.29以åã®Rust2015ã§ã¯ä»¥ä¸ã®ããã«æ¸ãå¿ è¦ãããã¾ããã (playground)
// 1.29ã¾ã§ã¯extern crateãå¿ é ã ã£ã extern crate chrono; pub enum RealWeekday { Sun, Fri, Sat, } pub mod m1 { pub enum Weekday { Sun, Sat, } // ããã©ã«ããã¹ (useå ) â ç¸å¯¾ãã¹ pub use self::Weekday::Sun; // ããã©ã«ããã¹ (use以å¤) pub const X: Weekday = Weekday::Sun; // extern preludeãã¹ (useå ) â extern crate + ããã©ã«ããã¹ pub use chrono::naive::MIN_DATE; // extern preludeãã¹ (use以å¤) â extern crate + 絶対ãã¹(æ§) pub const Y: ::chrono::NaiveDate = ::chrono::naive::MIN_DATE; // ç¸å¯¾ãã¹ (useå ) pub use self::Weekday::Sat; // ç¸å¯¾ãã¹ (use以å¤) pub const Z: self::Weekday = self::Weekday::Sat; // 絶対ãã¹ (useå ) â 絶対ãã¹(æ§) pub use ::RealWeekday::Fri; // 絶対ãã¹ (use以å¤) â 絶対ãã¹(æ§) pub const W: ::RealWeekday = ::RealWeekday::Fri; }
ã¾ããextern preludeã¸ã®ç§»è¡ã«ããã use chrono; ã®ãããªåç¬useã«é¢ãã許ããããæå (ã«ã¼ãã§ã¯æ¸ãã¦ã¯ãããªãããã«ã¼ã以å¤ã§ã¯æ¸ãå¿
è¦ããã) ãè§£æ¶ãããã®ãé常ã«å¥½ã¾ããå¤åã ã¨è¨ãã¾ãã
Rust2018æä»£ã®ãã¹ã®è§£é
ä¸è¨ã®ããã«ãã¹ã®è§£éãæ´çãããã®ã§ã(Rust2018ã¤ãã£ãªã ã«éã£ã¦ããã°)ã·ã³ãã«ã«ä»¥ä¸ã®ããã«èª¬æã§ãã¾ãã
- é常ã®ãã¹
foo::bar::bazã¯ã¹ã³ã¼ãå ã®fooãæ¢ç´¢ãããªããã°ãã¬ãªã¥ã¼ãã«ãã©ã¼ã«ããã¯ãããstdãCargo.tomlã«æå®ããã¦ããä¾åé¢ä¿ã¯ããã¬ãªã¥ã¼ãã®äºç¨®ã¨ããæ±ãã
self::ã¾ãã¯super::ã§å§ã¾ããã¹ã¯ç¸å¯¾ãã¹ã§ãä»ããmodããã®ç¸å¯¾ä½ç½®ã§æ¢ç´¢ãããcrate::ã§å§ã¾ããã¹ã¯çµ¶å¯¾ãã¹ã§ãã¯ã¬ã¼ãã®ã«ã¼ãããæ¢ç´¢ããã
ããã«ãã£ã¦ãã¢ã¸ã¥ã¼ã«ã«ã¤ãã¦èª¬æããªãã¦ãç´æçã«åãã±ã¼ã¹ãå¢ããã¨æãã¾ãããã¨ãã°
let it = std::iter::once(42);
ã¨
use std::iter; let it = iter::once(42);
ã¯ã©ã¡ããå ´æã«é¢ä¿ãªãèªç¶ã«åä½ããã®ã§ãå®å
¨ä¿®é£¾åã使ããã©ããã¯åã«DRYãå¯èªæ§ã好ã¿ã®è¦³ç¹ã§æ±ºå®ããã°ãããªãã¾ããã (Rust2015ã§ã¯ std::iter::once ã使ãã«ã¯ã«ã¼ãã§ãã or use std; ããã or ::std::iter::once ã¨è¡¨è¨ããå¿
è¦ãããã¨ããè¤éãªæ¡ä»¶ãæ¤è¨ããªããã°ãªããªãã£ã)
ã¢ã¸ã¥ã¼ã«ã使ãããªãããã®åºæ¬ç¥è3ã¤
åç¯ã§èª¬æããéããRust2018ã§ã¯ãã¹ã®æåãæ¯è¼çã·ã³ãã«ã«ãªã£ãã®ã§ãèãããã¨ã¯å°ãªããªãã¾ããããã£ã½ãã mod/use ã®ä½¿ãæ¹ã«ã¤ãã¦ã¯ãç¥ã£ã¦ãããã»ãããããã¨ãããå°ãããã¾ãã
- 1ã¯ã¬ã¼ã = 1ãã¡ã¤ã«
modã¯ã¹ã³ã¼ããæã¡åãpub useã¯useã®ä»²é
1ã¯ã¬ã¼ã = 1ãã¡ã¤ã«
rustc ã³ãã³ãã¯ä¸åã®å¼ã³åºãã§1ã¤ã® lib.rs ã1ã¤ã® *.rlib ã«å¤æãã¾ãããã¨ãã°ä»¥ä¸ã®ãã㪠lib.rs ãèãããã¾ãã
pub mod fmt { ... } pub mod io { ... } pub mod sync { ... } ...
ãããã大ããªã¯ã¬ã¼ãã§ã¯ãã®ããã«1ãã¡ã¤ã«ã«è©°ããã¨å·¨å¤§åãããã¦ç ´ç¶»ãã¾ãããã®ãã以ä¸ã®ããã«åå²ã§ãããããªä»çµã¿ã«ãªã£ã¦ãã¾ãã
pub mod fmt; // ä¸èº«ã¯ `fmt.rs` ã `fmt/mod.rs` ã«ãã pub mod io; // ä¸èº«ã¯ `io.rs` ã `io/mod.rs` ã«ãã pub mod sync; // ä¸èº«ã¯ `sync.rs` ã `sync/mod.rs` ã«ãã ...
ããã¯æ§æè§£æã®æ®µéã§çµåããã¦ãã¾ãã®ã§ãRustã®ä»æ§ä¸ã¯1ãã¡ã¤ã«ã«ã¾ã¨ããå ´åã¨ã»ã¼åãæåã«ãªãã¾ãããã¡ã¤ã«ãç½®ããã ãã§ã¯ã¢ã¸ã¥ã¼ã«ã«ãªããªãã®ã¯ããããä»çµã¿ã ããã¨èãããã¨ãã§ãã¾ãã
ã³ã³ãã¤ã©ã®ä»çµã¿ã¨ãã¦ã¯ä»¥ä¸ã®ããã«ãªã£ã¦ãã¾ã(1ã¯ã¬ã¼ã = 1ãã¡ã¤ã«)ããã¤ãã£ãªããã£ãã¯ãªRustã³ã¼ãã§ã¯ã¢ã¸ã¥ã¼ã«ãæå¤§éãã¡ã¤ã«ã«åå²ãã(1ã¢ã¸ã¥ã¼ã« = 1ãã¡ã¤ã«)ã®ãä¸è¬çã§ãã
mod ã¯ã¹ã³ã¼ããæã¡åã
mod ã¯åå解決ã®ã¹ã³ã¼ããæã¡åãã¾ãããã¨ãã°ã
const X: i32 = 21 + 21; #[cfg(test)] mod tests { use super::*; // â #[test] fn test_everythings_answer() { assert_eq!(X, 42); } }
ã¨ãããã¹ãã³ã¼ãã¯(2015/2018ã§å
±éã®)é »åºãã¿ã¼ã³ã§ããããã§ fn test_everythings_answer ãã X ã¯(mod å¢çãã¾ããã§ããã®ã§)ãã®ã¾ã¾ã§ã¯åç
§ã§ããã super::X ã¨æ¸ãå¿
è¦ãããã¾ãããã ããã®ãããªãã¡ã¤ã«å
ãã¹ãã§ã¯ãã¡ã¤ã«å
ã®å®ç¾©ã use ããã®ã¾ã¾åå©ç¨ããã»ããèªç¶ãªã®ã§ã use super::* ã¨æ¸ãã¦å
¨ã¦ãã¤ã³ãã¼ããã¦ãã¾ããããã«ãã£ã¦ããããã¹ã³ã¼ããå¤å´ã¾ã§å»¶é·ããããã®ãããªæè¦ã§ãã¹ãã³ã¼ããæ¸ããã¨ãã§ãã¾ãã
åè¿°ã®ããã«ããã¹ã以å¤ã®ã¤ãã£ãªããã£ãã¯ãªRustã³ã¼ãã§ã¯ã1ã¢ã¸ã¥ã¼ã«=1ãã¡ã¤ã«ãã¨ãã¦æ¸ãããã®ã§ããã®ä»çµã¿ã«ãã£ã¦ãã¡ã¤ã«å¤ã® use ã®å½±é¿ãåé¿ã§ããããã«ãªã£ã¦ããã¨èãããã¨ãã§ãã¾ãã
pub use 㯠use ã®ä»²é
RFC1560ã«ãã2016å¹´ã®ã¢ã¸ã¥ã¼ã«ã·ã¹ãã æ¹é©ä»¥éã pub use ã¯ç¹å¥æ±ãã§ã¯ãªã use ã¨ä¸è²«ããæåãããããã«ãªã£ã¦ãã¾ãã
#![allow(dead_code, path_statements)] mod m1 { use std::marker::PhantomData; pub use std::marker::PhantomPinned; struct Foo; pub struct Bar; fn foo() { PhantomData::<i32>; PhantomPinned; Foo; Bar; } } fn bar() { m1::PhantomPinned; m1::Bar; }
use ã®åãã¯åã«ååãã¹ã³ã¼ãã«å
¥ããã¨ããããã§ã¯ããã¾ãããä»ããã¢ã¸ã¥ã¼ã«ã«å®ç¾©ããç¶ãæ¨ããã¦ãçµæã¨ãã¦ååãã¹ã³ã¼ãå
ã«å
¥ãã¨ããæåããã¾ãã pub use ã®å ´åã¯ããããã¦ãç¶ãæ¨ãããå®ç¾©ãå¤ãããåç
§ã§ããããã«ãªããã¨ãã寸æ³ã§ãã
ã¾ã¨ã
Rust2018ã§ã¢ã¸ã¥ã¼ã«ã¾ããã®éç´æçãªæåãæ´çãããæ¯è¼çç´æçã«åä½ããããã«ãªãã¾ããã
ã¨ã¯ããããã®æ£ç¢ºãªåä½ã¯å¥¥ãæ·±ãã§ããæ¬¡åã¯åå解決ã®å½¹å²ãã©ãããã©ãã¾ã§ãªã®ããæç¢ºã«ãã¾ãã