ããã¯ãRFCãå®æ°ã§if
ãšmatch
ãèš±å¯ãããïŒrust-lang / rfcsïŒ2342ïŒã®è¿œè·¡ã®åé¡ã§ãã
å ±åãããç¹å®ã®æ©èœãŸãã¯åé¡ã®æ§æãæ°ããåé¡ã«ãªãã€ã¬ã¯ããã F-const_if_match
é©åã«ã©ãã«ä»ãããŠããã®åé¡ãéèŠãªéçºãææ§ã«ããäžæçãªã³ã¡ã³ãã§æº¢ããªãããã«ããŠãã ããã
æé ïŒ
let
&&
ããã³||
ç絡æäœã䜿çšããå®æ°ã®let
ãã€ã³ãã£ã³ã°ã çŸåšããããã¯const
ããã³static
ã¢ã€ãã å
ã§&
ããã³|
ãšããŠæ±ãããŸããæªè§£æ±ºã®è³ªåïŒ
ãªã
switch
ããã³switchInt
ã¿ãŒãããŒã¿ã«ã¯ã«ã¹ã¿ã ã³ãŒããå¿
èŠã§ããã£ãŒãã£ãŒã²ãŒããã¢ã¯ãã£ããªå Žå@ oli-obkè€éãªå¶åŸ¡ãããŒã¯ããŒã¿ãããŒåæãæ¡çšããå¿ èŠãããããšãæå³ãããããå°ã泚æãå¿ èŠã§ãã @alexregã«æ»ã£ãŠãå€æŽãçµ±åããæ¹æ³ãç解ããå¿ èŠããããŸãã
@eddybè¯ãåºçºç¹ã¯ãããããç§ã®const-qualif
ãã©ã³ãïŒãããã³ããããå·®ãåŒãããã®ïŒãååŸããããããã¹ã¿ãŒïŒé¢çœããªãïŒã«ãªããŒã¹ããŠãããããŒã¿ã¢ãããŒã·ã§ã³ãè¿œå ããããšã§ãããïŒ
ããã«é¢ãããã¥ãŒã¹ã¯ãããŸããïŒ
@ mark-imãããããã @eddybã¯ç¢ºãã«éåžžã«å¿ããã£ããšæããŸããéä¿¡ããããšããã§ããªãã£ãããã§ãã æ²ããããšã«ãç§ã®const-qualifãã©ã³ãã¯ãæåŸã«ãã¹ã¿ãŒã«ãªããŒã¹ããŠä»¥æ¥ãã³ã³ãã€ã«ããããŠããŸããã ïŒç§ã¯ãŸã ããã·ã¥ãããšã¯æããªããïŒ
thread 'main' panicked at 'assertion failed: position <= slice.len()', libserialize/leb128.rs:97:1
note: Run with `RUST_BACKTRACE=1` for a backtrace.
error: Could not compile `rustc_llvm`.
Caused by:
process didn't exit successfully: `/Users/alex/Software/rust/build/bootstrap/debug/rustc --crate-name build_script_build librustc_llvm/build.rs --error-format json --crate-type bin --emit=dep-info,link -C opt-level=2 -C metadata=74f2a810ad96be1d -C extra-filename=-74f2a810ad96be1d --out-dir /Users/alex/Software/rust/build/x86_64-apple-darwin/stage1-rustc/release/build/rustc_llvm-74f2a810ad96be1d -L dependency=/Users/alex/Software/rust/build/x86_64-apple-darwin/stage1-rustc/release/deps --extern build_helper=/Users/alex/Software/rust/build/x86_64-apple-darwin/stage1-rustc/release/deps/libbuild_helper-89aaac40d3077cd7.rlib --extern cc=/Users/alex/Software/rust/build/x86_64-apple-darwin/stage1-rustc/release/deps/libcc-ead7d4af4a69e776.rlib` (exit code: 101)
warning: build failed, waiting for other jobs to finish...
error: build failed
command did not execute successfully: "/Users/alex/Software/rust/build/x86_64-apple-darwin/stage0/bin/cargo" "build" "--target" "x86_64-apple-darwin" "-j" "8" "--release" "--manifest-path" "/Users/alex/Software/rust/src/librustc_trans/Cargo.toml" "--features" " jemalloc" "--message-format" "json"
expected success, got: exit code: 101
thread 'main' panicked at 'cargo must succeed', bootstrap/compile.rs:1085:9
note: Run with `RUST_BACKTRACE=1` for a backtrace.
failed to run: /Users/alex/Software/rust/build/bootstrap/debug/bootstrap -i build
ããŠãããããªããšã«ãç§ã¯ä»æ¥ãŸããªããŒã¹ããŸããããããŠããã¯ä»ãã¹ãŠããŸãæ§ç¯ãããŠããããã§ãïŒ ãªã°ã¬ãã·ã§ã³ãçºçããããã§ãããä¿®æ£ãããŸããã ä»ãã@eddybã«è¡ããŸãããã
@alexregç³ãèš³ãããŸããããããŒã«ã«ã®ç¡ç ã¹ã±ãžã¥ãŒã«ã«åãæ¿ããŸãããèµ·ãããšãã«pingãéä¿¡ãããããã§ãããèµ·ããŠãããšãã¯1æ¥äžãªãã©ã€ã³ã«ãªã£ãŠããŸãïŒã¿ã€ã ãŸãŒã³ãå³ããïŒã
ç§ã¯ããªãã®ãã©ã³ãããPRãäœãã¹ãã§ããïŒ ã©ãããããå¿ããïŒ
@eddybããã¯å€§äžå€«ã§ãã ç§ã¯éåžžã°ãªãããžæšæºæååŸ8æãããªã³ã«ãªã£ãŠããã®ã§ãæ©ãã«å¯ãå¿ èŠããããŸãããããã¯ãã¹ãŠåé¡ãããŸããã :-)
æ¬åœã«ç³ãèš³ãããŸããããåé¡ã®äžé£ã®ãããã§ã¯Qualif::STATIC{,_REF}
åé€ããå¿
èŠãããããšãã€ãŸãã³ã³ãã€ã«æã®çµ±èšãžã®ã¢ã¯ã»ã¹ã«é¢ãããšã©ãŒã«æ°ä»ãã®ã«å°ãæéãããããŸããã OTOHãããã¯const fn
ãšstatic
ãžã®ã¢ã¯ã»ã¹ã«é¢ããŠãã§ã«å£ããŠããŸãïŒ
#![feature(const_fn)]
const fn read<T: Copy>(x: &T) -> T { *x }
static FOO: u32 = read(&BAR);
static BAR: u32 = 5;
fn main() {
println!("{}", FOO);
}
ããã¯éçã«æ€åºãããŸããã代ããã«ã miri
ã¯ããã³ã°ãªã³ã°ãã€ã³ã¿ãéåç
§ãããŸããããšæå¥ãèšããŸãïŒããã³ã°ãªã³ã°ãã€ã³ã¿ãã®ä»£ããã«static
ã«ã€ããŠäœããèšãå¿
èŠããããŸãïŒã
ãããã£ãŠãã³ã³ãã€ã«æã«static
èªã¿åãããšã¯åé¡ãªããšæããŸãããå®è¡æã«const fn
ããçŽç²ãïŒã€ãŸããåç
§ééæ§ããŸãã¯ãã®åšèŸºïŒã«ããããšèãã人ãããŸããåŒæ°ãšããŠååŸããåç
§ã®èåŸããã®const fn
èªã¿åãã¯åé¡ãããŸãããã const fn
ã¯ãèã空æ°ããstatic
ãžã®åç
§ãååŸã§ããªãã¯ãã§ãïŒ const
ïŒã
ããããã°ã const
sã const fn
ãããã³ãã®ä»ã®äžå®ã®ã³ã³ããã¹ãïŒããã¢ãŒããå«ãïŒã§static
èšåããããšãéçã«æåŠãç¶ããããšãã§ãããšæããŸãã
ãã ãã STATIC_REF
ããã¯ãåé€ããå¿
èŠããããŸããããã«ããã static
ãä»ã®static
ã®åç
§ãååŸã§ããããã«ãªããŸããããããã®åç
§ã®èåŸããã®èªã¿åãã¯ïŒäžååã«è©Šè¡ããã倱æããŸãïŒæåŠãããŸãã ã
ããã«ã¯RFCãå¿ èŠã§ããïŒ
éååŠããã®èªã¿åãã¯å ¬æ£ã«èãããŸãã ééããªãRFCãå¿ èŠã§ãããããããã¯ã¬ãŒã¿ãŒã®å®è¡ã ãã§ããããããªãç§ã¯ããããèšãã®ã«æé©ãªäººã§ã¯ãããŸããã
äœãå¶éããªãããšã«æ³šæããŠãã ããããã§ã«ç ŽãããŠããå¶éãç·©åããŸãã
ãããèªã¿ééããŸããã ããã§ãconstè©äŸ¡ã¯ãŸã å¥å šã§ãããåç §ééæ§ã§ã¯ãªãã®ã§ããããïŒ
æåŸã®æ®µèœã§ã¯ãåç
§ééæ§ã®ã¢ãããŒãã«ã€ããŠèª¬æããŠããŸãïŒãã ãã const
ãšconst fn
static
ã®èšåãèš±å¯ãå§ãããšããã®ããããã£ã¯å€±ãããŸãïŒã å¥å
šæ§ã«ã€ããŠã¯ããŸãè°è«ãããŠããªãã£ããšæããŸãã
ãããšãããã³ã°ãªã³ã°ãã€ã³ã¿ãã¯ç¢ºãã«å¥å šæ§ã®åé¡ã®ããã«èãããŸãããç§ã¯ããã§ããªããä¿¡é ŒããŸãïŒ
ããã³ã°ãªã³ã°ãã€ã³ã¿ãã¯æªããšã©ãŒã¡ãã»ãŒãžã§ããããã¯ãããªãstatic
ããã®èªã¿åããçŠæ¢ããŠããã ãã§ãã static
åç
§ããããšããã§ããå¯äžã®å®æ°ã³ã³ããã¹ãã¯ä»ã®static
ã§ããããã®ã³ãŒãã¯ãã¹ãŠã³ã³ãã€ã«æã«åžžã«1åå®è¡ãããããããããã®èªã¿åããããã ãèš±å¯ããããšãã§ããŸãã
ïŒIRCããïŒèŠçŽãããšãåç
§ééæ§ã®const fn
ã¯ãåŒæ°ãçµç±ããã«åçµãããå²ãåœãŠã«ããå°éã§ããŸããã§ãããã€ãŸãã const
ã«ã¯åãå¶éãå¿
èŠã§ãããåçµãããŠããªãå²ãåœãŠã¯static
ããã®ã¿ååŸã§ããŸãã
ç§ã¯åç §ééæ§ãç¶æããã®ã奜ããªã®ã§ã @ eddybã®ã¢ã€ãã¢ã¯çŽ æŽãããã§ããïŒ
ãããç§ã¯constfnsãçŽç²ã«ããããã§ãã
äžèŠç¡å®³ã«èŠããç¹å®ã®èšç»ã¯ãåç §ééæ§ãæãªãå¯èœæ§ãããããšã«æ³šæããŠãã ãããäŸïŒ
let x = 0;
let non_deterministic = &x as *const _ as usize;
if non_deterministic.count_ones() % 2 == 0 {
// do one thing
} else {
// do a completely different thing
}
ããã¯ã³ã³ãã€ã«æã«miriãšã©ãŒã§å€±æããŸãããå®è¡æã«ã¯é決å®çã§ãïŒmiriã®ããã«ãã®ã¡ã¢ãªã¢ãã¬ã¹ããæœè±¡ããšããŠããŒã¯ã§ããªãããïŒã
ç·šéïŒ @Centrilã¯ãç¹å®ã®çã®ãã€ã³ã¿ãŒæŒç®ïŒæ¯èŒãæŽæ°ãžã®ãã£ã¹ããªã©ïŒãunsafe
å
ã§const fn
unsafe
ãããšããã¢ã€ãã¢ãæã£ãŠããŸããïŒ const fn
å®å®ãããŸã§å®è¡ã§ããŸãïŒ ïŒãããã³miriãã³ã³ãã€ã«æã«èš±å¯ããæ¹æ³ã§ã®ã¿äœ¿çšã§ããããšãè¿°ã¹ãŸãã
ããšãã°ãåãããŒã«ã«ã«2ã€ã®ãã€ã³ã¿ãæžç®ããããšã¯åé¡ãããŸãããïŒã¿ã€ãã¬ã€ã¢ãŠããé
åã€ã³ããã¯ã¹ãªã©ã«ã®ã¿äŸåããçžå¯Ÿè·é¢ãåŸãããŸãïŒãåç
§ã®ã¢ãã¬ã¹ããã©ãŒãããããŸãïŒ {:p}
ä»ããŠïŒã¯èª€ã£ã䜿çšæ³ã§ããããã fmt::Pointer::fmt
const fn
ããŒã¯ãä»ããããšã¯ã§ããŸããã
ãŸããçã®ãã€ã³ã¿ãŒã®Ord
/ Eq
ãã¬ã€ãimplã¯ãå®å
šã§ããããã const
ãšããŠããŒã¯ããããšã¯ã§ããŸããïŒãã®ããã«æ³šéãä»ããããšãã§ããå Žåã¯ãã€ã§ãïŒããã ããæäœã¯unsafe
const fn
ã§ãã
ãç¡å®³ããšã¯ã©ãããæå³ãã«ãã£ãŠç°ãªããŸã...ãã®ãããªé決å®è«çãªè¡åãçŠæ¢ãããçç±ã¯ç¢ºãã«ããããŸãã
ããã«ã€ããŠã®äœæ¥ãç¶ããããã°çŽ æŽãããã§ãããã
@lachlansneffããã¯åããŠããŸã...ç§ãã¡ãæãã»ã©éãã¯ãããŸããããäœæ¥ã¯è¡ãããŠããŸãã çŸåšããããã«ãŒãšããŠhttps://github.com/rust-lang/rust/pull/51110ãåŸ ã£ãŠã
@alexregãããããããšãã const fnã«ãªãå Žåã§ããäžèŽãããŒã¯ããããconstãšããŠããŒã¯ãããã§ãããšéåžžã«äŸ¿å©ã§ãã
ïŒ51110ãããŒãžããããããã¹ããŒã¿ã¹ãæŽæ°ãããŸãããïŒ
@programmerjakeããŒãžããåã«ïŒã§ããã°ããã«ïŒ https://github.com/rust-lang/rust/pull/52518ã§@eddybããã®ãã£ãŒãããã¯ãåŸ ã£ãŠããŸãã 圌ã¯æè¿ïŒåžžã«éèŠãé«ãïŒéåžžã«å¿ããã§ãããéå»æ°æ¥éã§ã¬ãã¥ãŒãªã©ã«æ»ã£ãŠããã®ã§ãç§ã¯æåŸ ããŠããŸãã ãã®åŸãé©åãªããŒã¿ãããŒåæãè¿œå ããããšã¯è€éãªåé¡ã§ããããã圌èªèº«ã«ããäœæ¥ãå¿ èŠã«ãªããšæããŸãã ããããç§ãã¡ã¯èŠãã§ãããã
æåã®æçš¿ã®TODOãªã¹ãã®ã©ããã«ã &&
ãš||
ã&
ãš|
å€æããçŸåšã®æãããããã¯ãåé€ããããã«è¿œå ããå¿
èŠããããŸãå®æ°å
ã®
@RalfJungå€ãæ§æã®äžéšã§ã¯ãããŸããå°å ¥ãããã®ã§ãããã§å®å šã«ãªããªããŸãããïŒ
||
/ &&
ã«ãã£ãŠçæãããSwitchInt
ã¿ãŒãããŒã¿ãæåŠããã³ãŒããconst_qualify
ãããããHIRäœäžã®ã©ããã§ãã®å€æãè¡ããŸãã
ãŸããå¥ã®ãã€ã³ãïŒ@ oli-obkã¯ãæ¡ä»¶æãåçŽã«èãããããè€éã§ãããšã©ããã§èšããŸããïŒããããã©ããèŠã€ããããšãã§ããŸããïŒ...ããã¯ãããã/å éšå¯å€æ§ã®åæã«ã€ããŠã®ãã¡ããã©ãã§ãããïŒ
ãããã/å éšã®å¯å€æ§ã®åæã«ã€ããŠã¯ãã¡ããã©ãã§ãããïŒ
ç§ã¯çŸåšãããçä»ããããšããŠããŸãã ç§ããã¹ãŠã®æ å ±ãæã£ãŠãããšãã«ããªãã«æ»ã£ãŠããŸã
ããã®ç¶æ³ã¯ã©ãã§ããïŒ ããã¯äººçè³æºãå¿ èŠãšããŠããã®ã§ããããããããšãäœããã®åé¡ã解決ããäžã§åŠšããããŠããã®ã§ããããã
@ mark-imconstèªå®ã®ããã®é©åãªããŒã¿ãããŒåæã®å®è£ ããããã¯ãããŠããŸãã @eddybã¯ãã®åéã§æãç¥èãè±å¯ã§ã以åã«ããã«ã€ããŠããã€ãã®äœæ¥ãè¡ã£ãŠããŸããã ïŒç§ãããã ã£ããããã®çš®ã®åæ»...ïŒ@ eddybã«ãŸã æéããªãå Žåã¯ããããã@ oli-obkãŸãã¯@RalfJungã
@eddybã¯ã const fn
ã§åç
§ééæ§ãç¶æããããšã«ã€ããŠèšåããŸããããããã¯è¯ãèãã ãšæããŸãã const fn
ãã€ã³ã¿ã䜿çšããªãããã«ããå Žåã¯ã©ããªããŸããïŒ ãããã£ãŠã以åã®ã³ãŒããµã³ãã«ã¯ã³ã³ãã€ã«ãããªããªããŸãã
let x = 0;
// compile time error: cannot cast reference to pointer in `const fun`
let non_deterministic = &x as *const _ as usize;
if non_deterministic.count_ones() % 2 == 0 {
// do one thing
} else {
// do a completely different thing
}
åç §ã¯åŒãç¶ãèš±å¯ãããŸãããããããå çããããšã¯èš±å¯ãããŸããã
let x = 0;
let p = &x;
if *p != 0 { // this is fine
// do one thing
} else {
// do a completely different thing
}
ç§ãå®å šã«ããŒã¹ããå€ããŠããå Žåã¯ãç§ã«ç¥ãããŠãã ãããããã¯ãããã決å®è«çã«ããããã®è¯ãæ¹æ³ã ãšæããŸããã
@ jyn514ã¯ãusizeãã£ã¹ããäžå®å®ã«ããããšã§ãã§ã«ã«ããŒãããŠããŸããïŒhttps://github.com/rust-lang/rust/issues/51910ïŒããŠãŒã¶ãŒã¯çã®ãã€ã³ã¿ãŒãæ¯èŒããããšãã§ããŸãïŒhttps://github.com/rust- lang / rust / issues / 53020ïŒãããåæ§ã«æªãããããã£ãŠäžå®å®ã§ãã ãããã¯å¶åŸ¡ãããŒãšã¯ç¬ç«ããŠåŠçã§ããŸãã
ããã«ã€ããŠäœãæ°ããããšã¯ãããŸããïŒ
@ oli-obkãªã³ã¯ãæ©èœããŸããã ããã¯äœãšèšã£ãŠããŸããïŒ
ããã¯ç§ã«ãšã£ãŠã¯ããŸããããŸã...ããããZulipã«ãµã€ã³ã€ã³ããå¿ èŠããããŸãã
@alexregããŒããããããã¯ããŒã¿ãããŒããŒã¹ã®constèªå®äœæ¥ã«é¢ãããã®ã ã£ããšæããŸãã @alexregå®æ°ã§ifãšmatchãå¿ èŠãªçç±ãç¥ã£ãŠããŸããïŒ
ããŒã¿ãããŒããŒã¹ã®ããŒãžã§ã³ããªãå Žåã¯ãå®æ°å
ã§èª€ã£ãŠ&Cell<T>
èš±å¯ãããã誀ã£ãŠNone::<&Cell<T>>
çŠæ¢ããŸãïŒããã¯å®å®ããŠåäœããŸããããŒã¿ãããŒãªãã§é©åã«å®è£
ããããšã¯æ¬è³ªçã«äžå¯èœã§ãïŒãŸãã¯å®è£
ã¯ããŒã¿ãããŒã®æªãå£ããã¢ãããã¯ããŒãžã§ã³ã§ããïŒ
@ est31ãããšã
@alexreg @ mark-im @ est31 @ oli -obkä»é±äžã«ããŒã¿ãããŒããŒã¹ã®constè³æ Œã®WIPå®è£ ãå ¬éã§ããããã«ãªãã¯ãã§ãã ããã«ã¯äºææ§ã®å±éºæ§ãããããããã®ã§ãå®éã«ããŒãžããã®ã«æéããããå ŽåããããŸãã
çŽ æŽããã; ããã楜ãã¿ã«åŸ ã€ã
ïŒãªã¯ãšã¹ãããšã«ïŒ57563ããã³ããŒïŒ
bool && bool
ã bool || bool
ãªã©ã®ç¹æ®ãªã±ãŒã¹ã¯å¯èœã§ããããïŒ çŸåšã const fn
ã§å®è¡ã§ããŸããããããè¡ãã«ã¯ãããåäœã®æŒç®åãå¿
èŠã§ãããããã¯æãŸãããªãå ŽåããããŸãã
ãããã¯ããããåäœã®æŒç®ã«å€æããããšã«ããã const
ããã³static
ã¢ã€ãã ã§ãã§ã«ç¹æ®ãªã±ãŒã¹ã«ãªã£ãŠããŸãã ãããããã®ç¹æ®ãªã±ãŒã·ã³ã°ã¯å€§ããªããã¯ã§ããããããå®éã«æ£ããããšã確èªããã®ã¯éåžžã«å°é£ã§ãã ããªããèšã£ãããã«ãããã¯æã
æãŸããªãããšããããŸãã ãããã£ãŠãããããã£ãšé »ç¹ã«è¡ãããšã¯é¿ããããšæããŸãã
ç©äºãæ£ããè¡ãã«ã¯å°ãæéãããããŸãããããã¯èµ·ãããŸãã ãã®éã«ããŸãã«ãå€ãã®ããã¯ãç©ã¿éãããšãæãåºããªãã³ãŒããŒã«èŠããå¯èœæ§ããããŸãïŒãããã®ããã¯ã®äžéšãééã£ãæ¹æ³ã§çžäºäœçšãã誀ã£ãŠæãŸãããªãåäœãå®å®ãããŠããŸãå ŽåïŒã
ïŒ64470ãšïŒ63812ãããŒãžãããã®ã§ãããã«å¿ èŠãªãã¹ãŠã®ããŒã«ãã³ã³ãã€ã©ãŒã«ååšããŸãã ãã®æ©èœãæå¹ã«ããç¶æ ã§äžå¿ èŠã«éå¹çã«ãªããªãããã«ãconst修食ã«é¢ããã¯ãšãªã·ã¹ãã ã«ããã€ãã®å€æŽãå ããå¿ èŠããããŸãã ç§ãã¡ã¯ããã§é²æ©ãéããŠãããããã®å®éšçãªå®è£ ã¯ãæ°ãæã§ã¯ãªãæ°é±éã§æ¯æ©å©çšã§ããããã«ãªããšæããŸãïŒæåãªæåŸã®èšèïŒsmile :)ã
@ ecstatic-morseèããŠããã£ãïŒ ãããæãéããããã«ããªãã®å調ããåªåã«æè¬ããŸãã ç§ã¯å人çã«ãã®æ©èœã«ãã°ããç±å¿ã«åãçµãã§ããŸããã
ãããå®äºããåŸãCTFEã®ããŒãå²ãåœãŠãµããŒãã確èªããããšæããŸãã ããªããä»ã®èª°ããããã«åãçµãããšã«èå³ããããã©ããã¯ããããŸããããããã§ãªãå Žåã¯ããããç§ãå©ããããšãã§ããŸãã
@alexregããããšãïŒ
ã³ã³ãã€ã«æã®ããŒãå²ãåœãŠã«é¢ããè°è«ã¯ãrust-rfcs / const-evalïŒ20ã§çµãããŸããã AFAIKãææ°ã®éçºã¯ã const
ã®æçµå€ã§åç
§ã®èåŸã«çŽæ¥/èåŸã§èŠ³å¯ã§ãããã®ã決å®ããããã®ConstSafe
/ ConstRefSafe
ãã©ãã€ã ã®åšãconst
ã ã§ãããã£ãšãã¶ã€ã³äœæ¥ãå¿
èŠã ãšæããŸãã
ããã«ç¶ã人ã ã«ãšã£ãŠãïŒ65949ïŒããèªäœã¯ããã€ãã®å°ããªPRã«äŸåããŸãïŒã¯ããã«å¯Ÿãã次ã®ãããã«ãŒã§ãã æ¥ç·æ¹åã«ã®ã¿é¢é£ããŠããããã«èŠãããããããŸããããconst-checking / qualificationãããã¢ãŒã·ã§ã³ãšéåžžã«ç·å¯ã«çµåãããŠãããšããäºå®ã¯ããã®æ©èœãé·ãéãããã¯ãããŠããçç±ã®äžéšã§ããã å€ãconst-checkerãå®å šã«åé€ããåŸç¶ã®PRãéãäºå®ã§ãïŒçŸåšãäž¡æ¹ã®ãã§ãã«ãŒã䞊è¡ããŠå®è¡ããŠããŸãïŒã ããã«ãããåè¿°ã®éå¹çæ§ãåé¿ã§ããŸãã
åè¿°ã®äž¡æ¹ã®PRãããŒãžãããåŸãå®æ°ã®if
ãšmatch
ã¯ãããã€ãã®èšºæã®æ¹åãšæ©èœãã©ã°ã®åé€ã«ãªããŸãã ããããããŠãŸããã¹ãããšãŠãå€ãã®ãã¹ã...
ãã¹ããå¿ èŠãªå Žåã¯ãã©ã®ããã«å§ããã°ãããããããŸããããåãã§è²¢ç®ããŸãã ãã¹ããã©ãã«è¡ãã¹ãã/ã©ã®ããã«èŠããã¹ãã/ã©ã®ãã©ã³ãããã³ãŒããããŒã¹ã«ãã¹ãããæããŠãã ãã:)
次ã«æ³šç®ããPRã¯ïŒ66385ã§ãã ããã«ãããå€ãconst修食ããžãã¯ïŒåå²ãåŠçã§ããªãã£ãïŒãå®å šã«åé€ãããæ°ããããŒã¿ãããŒããŒã¹ã®ããŒãžã§ã³ãåªå ãããŸãã
@ jyn514ããã¯çŽ æŽãããããšã§ãïŒ å®è£
ã®ãã©ãããéå§ããããpingãéä¿¡ããŸãã if
ãšmatch
ãæ¯æ©å©çšå¯èœã«ãªã£ããã人ã
ãconstã®å®å
šæ§ïŒç¹ã«HasMutInterior
éšåïŒã«éåããããšããããšãéåžžã«åœ¹ç«ã¡ãŸãã
ç¹ã«èšºæã«é¢ããŠã¯ãèåããªéšåãåãé€ãã®ã«ãã°ããæéãããããšæããŸãããã¹ãã«ãã¬ããžã¯ããªããŸã°ãã§ãïŒ @ jyn514ã¯ããã®åé¡ã«ã€ããŠèª¿æŽããå¿ èŠããããŸãïŒã ããã§ããä»åŸæ°é±éã§ãã£ãŒãã£ãŒãã°ã«ã®èåŸã§ããããªãªãŒã¹ã§ããããšãé¡ã£ãŠããŸãã
ããã¯ïŒ66507ã§å®è£
ãããææ°ã®å€éã«äœ¿çšã§ããããã«ãªããŸããã ãŸãã Inside Rustã®ããã°æçš¿ã§ã¯ãæ°ããå©çšå¯èœãªæäœãšãå
éšå¯å€æ§ãåããåãŸãã¯ã«ã¹ã¿ã Drop
implã«é¢ããæ¢åã®å®è£
ã§çºçããå¯èœæ§ã®ããããã€ãã®åé¡ã«ã€ããŠè©³ãã説æããŠããŸãã
åºãŠè¡ã£ãŠãåºããªããïŒ
å¹³çã¯const
ã¯ãªãããã§ããïŒ ãŸãã¯ç§ã¯ééã£ãŠããŸããïŒ
error[E0019]: constant function contains unimplemented expression type
--> src/liballoc/raw_vec.rs:55:22
|
55 | let cap = if mem::size_of::<T>() == 0 { !0 } else { 0 };
| ^^^^^^^^^^^^^^^^^^^^^^^^
error[E0019]: constant function contains unimplemented expression type
--> src/liballoc/raw_vec.rs:55:19
|
55 | let cap = if mem::size_of::<T>() == 0 { !0 } else { 0 };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to 2 previous errors
@ mark-imããã¯ç¢ºãã«æ©èœããã¯ãã§ãã å€åããŒãã¹ãã©ããã®åé¡ïŒ Zulipã«ã€ããŠè©±ãåããŸãããã
ãããæå³çãªãã®ãã©ããã¯ããããŸããããåæåã§äžèŽãããããšãããšãšã©ãŒãçºçããŸã
å°éäžèœã³ãŒããå«ãconstfnã¯å®å®ããŠããŸãã
åæåãç¶²çŸ çã§ãããåãã¯ã¬ãŒãã§å®çŸ©ãããŠãããšããäºå®ã«ããããããã
@jhprattã³ãŒããæçš¿ã§ããŸããïŒ ç§ã¯åé¡ãªãåçŽãªåæåã«äžèŽããããšãã§ããŸãïŒ
æ°ç§ã§ç§ã殎ããŸããã ããã¯ãç§ã®æ£ç¢ºãªã±ãŒã¹ã瀺ãæå°éã®äŸã§ãã
@jhpratt絶察ã«æå³çã§ã¯ãããŸããã åé¡ãéããŠããããŸããïŒ
å ±åãããç¹å®ã®æ©èœãŸãã¯åé¡ã®æ§æãæ°ããåé¡ã«ãªãã€ã¬ã¯ããã F-const_if_match
é©åã«ã©ãã«ä»ãããŠããã®åé¡ãéèŠãªéçºãææ§ã«ããäžæçãªã³ã¡ã³ãã§æº¢ããªãããã«ããŠãã ããã
@Centrilããªãã®ã³ã¡ã³ããåãããªãããã«ããããã³ã¡ã³ãã«å ¥ããã®ã¯æªãããšã§ã¯ãããŸããã
ç¶æ³æŽæ°ïŒ
ããã¯å®è£ ã®èŠ³ç¹ããã¯å®å®åã®æºåãã§ããŠããŸãããã¿ã€ãããŒã¹ã®ïŒãã ã匷åã§ã¯ãªãïŒããŒã¿ãããŒã§ã¯ãªããçŸåšã®å€ããŒã¹ã®ããŒã¿ãããŒãç¶æãããã©ãããšããåé¡ããããŸãã å€ããŒã¹ã®ããŒã¿ãããŒã¯å°ãé«äŸ¡ã§ããïŒããã«ã€ããŠã¯ããã«è©³ãã説æããŸãïŒã次ã®ãããªé¢æ°ã«å¿ èŠã§ãã
const fn foo<T>() {
let x = Option::<T>::None;
{x};
}
Option<T>
ã¯ãå®è¡ãè©Šã¿ããã¹ãã©ã¯ã¿ããããéconstã³ãŒããå®è¡ããå¯èœæ§ããããããããã¯ã¿ã€ãããŒã¹ã®åæã§ã¯æåŠãããŸãã
ãã©ã³ãããããšããã«ã¿ã€ãããŒã¹ã®åæã«ãã©ãŒã«ããã¯ã§ããŸãããããã¯æåŠããããšãæå³ããŸã
const fn foo<T>(b: bool) {
let x = Option::<T>::None;
assert!(b);
{x};
}
ããã¯ãããããŠãŒã¶ãŒã«ãšã£ãŠéåžžã«é©ãã¹ãããšã§ãã
@ ecstatic-morseã¯ãconst fnã ãã§ãªãããã¹ãŠã®é¢æ°ã§åæãå®è¡ããæ倧5ïŒ
ã®é床äœäžã確èªããŸããïŒhttps://perf.rust-lang.org/compare.html?start=93dc97a85381cc52eb872d27e50e4d518926a27c&end=51cf313c7946365d5be38113950703c6aea9f2 ããã¯æ²èŠ³çãªããŒãžã§ã³ã§ããããšã«æ³šæããŠãã ãããããã¯ã const fn
ãªãããšã¯ãªããå€ãã®å Žåããããå®çŸã§ããªãé¢æ°ã§ãå®è¡ãããããšãæå³ããŸãã
ããã¯ãé¢æ°ã®ããŒããconst fnã«ãããšããã®å€ããŒã¹ã®åæã®ããã«ã³ã³ãã€ã«ãé ããªãå¯èœæ§ãããããšãæå³ããŸãã
äžéç¹ã¯ãã¿ã€ãããŒã¹ã®åæã倱æããå Žåã«ã®ã¿å€ããŒã¹ã®åæãå®è¡ããããšã§ãã ããã¯ããã¹ãã©ã¯ã¿ããªãå Žåãååšããªããã¹ãã©ã¯ã¿ãå®è¡ãããªããã©ãããå€æããããã«å€ããŒã¹ã®åæãå®è¡ããå¿ èŠããªãããšãæå³ããŸãïŒã¯ããããã§ã¯åŠå®ã®è² è·ããããŸãïŒã å¥ã®èšãæ¹ãããã°ããã¹ãã©ã¯ã¿ãååšããå Žåã«ã®ã¿ãå€ããŒã¹ã®åæãå®è¡ããŸãã
ç§ã¯ããã@ rust-lang / langã®è°è«ã«æšèŠããŠããã®ã§ãäžç·ã«è¡ããããã©ãããå€æããããšãã§ããŸã
@ oli-obk
ã«ãŒããŸãã¯åå²ãååšããå Žåã®ã¿ã€ãããŒã¹ã®ãªãã·ã§ã³ïŒãŠãŒã¶ãŒã«å¥åŠãªåäœãäžããïŒ
ããããã§ãã¯ã€ã³ããã ãã§ããçŽç·çãªã³ãŒãã§ãã¿ã€ãããŒã¹ã®åæãè¡ãããšã¯ã§ããŸãããïŒ ç§ãã¡ã¯ãã§ã«æ¬¡ã®ãã®ïŒéã³å ŽïŒãåãå ¥ããŠããããšãèãããšãããã¯äžçš®ã®åŸæ¹äºææ§ããªããšæããŸãïŒ
struct Foo { }
impl Drop for Foo {
fn drop(&mut self) { }
}
const T: Option<Foo> = None;
fn main() { }
å人çã«ã¯ããŠãŒã¶ãŒã«ãšã£ãŠããäžè²«æ§ã®ãããããè¯ããšã¯ã¹ããªãšã³ã¹ãæšé²ããå¿
èŠããããšæãåŸåããããŸãã å¿
èŠã«å¿ããŠæé©åã§ããããã§ããããããã«ããŠãã³ã¹ãã¯ããã»ã©æªããããŸããã ãããããã®ããé«äŸ¡ãªåæã§äœãèµ·ãã£ãŠããã®ããããå°ãæ£ç¢ºã«ç解ããããšæããŸããåºæ¬çã«ãå®æ°äŒæããè¡ã£ãŠãããšããèãã§ããã€ãŸããäœããããããããããã³ã«ããããããããæ£ç¢ºãªå€ãåæããŠããã¹ãã©ã¯ã¿ãå®è¡ããããã«å¿
èŠãªå€ãå«ãŸããŠããå¯èœæ§ããããŸããïŒ ïŒã€ãŸãã None
å Žåã Option<T>
ã®äžè¬çãªäŸã䜿çšããŸãïŒ
ããããã§ãã¯ã€ã³ããã ãã§ããçŽç·çãªã³ãŒãã§ãã¿ã€ãããŒã¹ã®åæãè¡ãããšã¯ã§ããŸãããïŒ ç§ãã¡ã¯ãã§ã«æ¬¡ã®ïŒéã³å ŽïŒãåãå ¥ããŠããããšãèãããšãããã¯äžçš®ã®åŸæ¹äºææ§ããªããšæããŸãïŒ
ã¯ãããããã¿ã€ãããŒã¹ã®åæã«å®å šã«ç§»è¡ã§ããªãçç±ã§ãã
äœããããããããããã³ã«ããããããããæ£ç¢ºãªå€ãåæããŠããã¹ãã©ã¯ã¿ãå®è¡ããå¿ èŠãããå€ãå«ãŸããŠãããã©ãããå€æããããã«ãåºæ¬çã«ãå®æ°äŒæããå®è¡ããŠãããšããèãã§ããïŒ ïŒã€ãŸããNoneã®å ŽåãOptionã®äžè¬çãªäŸã䜿çšããŸã
ïŒã
ãã©ã°ã®ãªã¹ãã®ã¿ãäŒæããŠããŸãïŒ Drop
ãšFreeze
ã説æãç°¡åãªãããããã§ã¯Drop
ãŸããïŒã Drop
ãã©ã°ãèšå®ããã«Drop
ã¿ãŒãããŒã¿ãŒã«å°éãããšã Drop
ã¿ãŒãããŒã¿ãŒãç¡èŠããŸãã ããã«ããã次ã®ãããªã³ãŒããå¯èœã«ãªããŸãã
{
let mut x = None;
// Drop flag for x: false
let y = Some(Foo);
// Drop flag for y: true
x = y; // Dropping x is fine, because Drop flag for x is false
// Drop flag for y: false, Drop flag for x: true
x
// Dropping y is fine, because Drop flag for y is false
}
ããã¯è©äŸ¡æã«çºçããªãããã次ã®ããšã¯åé¡ãããŸããã
{
let mut x = Some(Foo);
if false {
x = None;
}
x
}
èãããããã¹ãŠã®å®è¡ãã¹ãDrop
åŒãèµ·ãããªãããšã確èªããŸãã
ãã ããå®æ°äŒæã¯è¯ãäŸãã§ãã ããã¯ãå€æ°éã®ç¶æ
ã®ã³ããŒãåŠçããªãgen / killã»ããã§äŒéé¢æ°ãè¡šçŸã§ããªããã1ã€ã®ããŒã¿ãããŒã®åé¡ã§ãã ãã ããå®æ°äŒæã§ã¯åå€æ°ã®å®éã®å€ãæ ŒçŽããå¿
èŠããããŸãããå®æ°ãã§ãã¯ã§ã¯ããã®å€æ°ã«ã«ã¹ã¿ã Drop
implããããã Freeze
ãªããã瀺ã1ãããã®ã¿ãæ ŒçŽããå¿
èŠããããŸããå®æ°äŒæãããå°ãå®äŸ¡ã§ãã
æ確ã«ããããã«ã@ oli-obkã®æåã®äŸã¯ãä»æ¥ã®å®å®çã§ã³ã³ãã€ã«ããã 1.38.0以éãïŒ64470ã¯å«ãŸããŠããŸããã
ããã«ã const X: Option<Foo> = None;
ã¯1.0以éã§ã³ã³ãã€ã«ãããŸããããã以å€ã¯ãã¹ãŠãconstevalãç²åŸããæ°æ©èœãåãããã®ããã®èªç¶ãªæ¡åŒµã§ãã
ããã§ãããçŽç²ã«äŸ¡å€ããŒã¹ã®ãªãã·ã§ã³ãæ¡çšããã®ã¯çã«ããªã£ãŠãããšæããŸãã
ç§ãã¡ã¯äŒè°ã§ãããã«ããŒããå ±åããããšãã§ãããšæããŸã=ïŒ
#![feature(const_if_match)]
ãçŸåšã®ã»ãã³ãã£ã¯ã¹ã§å®å®ãããããšãææ¡ããŸãã
å
·äœçã«ã¯ã if
ãšmatch
åŒãããã³ç絡è«çæŒç®å&&
ãš||
ã¯ããã¹ãŠã®constã³ã³ããã¹ãã§æå¹ã«ãªããŸãã constã³ã³ããã¹ãã¯ã次ã®ããããã§ãã
const
ã static
ã static mut
ãŸãã¯åæåå€å¥åŒã®åæååãconst fn
ã®æ¬äœã[u8; 3]
ïŒãŸãã¯é
åå埩åŒïŒ [0u8; 3]
ïŒãããã«ãç絡è«çæŒç®åã¯ã const
ããã³static
åæååã§ãããåäœã®åçç©ïŒãããã&
ããã³|
ïŒã«äžããããªããªããŸãïŒãåç
§ïŒã ïŒ57175ïŒã ãã®çµæã let
ãã€ã³ãã£ã³ã°ã¯ããããã®åæååã®ç絡ããžãã¯ãšäžç·ã«äœ¿çšã§ããŸãã
远跡ã®åé¡ïŒïŒ49146
ããŒãžã§ã³ã¿ãŒã²ããïŒ1.45ïŒ2020-06-16ïŒ
#![feature(const_if_match)]
æ©èœã²ãŒããå®è£
ããŸããã[Miri]ã¯ãããæ°å¹Žã rustc
ã§ã³ã³ãã€ã«æé¢æ°è©äŸ¡ïŒCTFEïŒã匷åããŠãããå°ãªããšããã®éãæ¡ä»¶æãè©äŸ¡ããããšãã§ããŸããã CTFEäžã¯ãã«ã¹ã¿ã Drop
implãåŒã³åºããå
éšå¯å€æ§ã®ããå€ãžã®åç
§ãååŸãããªã©ãç¹å®ã®æäœãåé¿ããå¿
èŠããããŸãã ç·ç§°ããŠããããã®å€±æ Œããããã£ã¯ãè³æ ŒããšåŒã°ããå€ãããã°ã©ã ã®ç¹å®ã®ãã€ã³ãã§è³æ Œãæã£ãŠãããã©ãããå€æããããã»ã¹ã¯ãå®æ°è³æ ŒããšåŒã°ããŸãã
Miriã¯ã修食ãããå€ã«å¯ŸããŠäžæ£ãªæäœãçºçããå Žåã«ãšã©ãŒãçºçãããããšãã§ãã誀æ€ç¥ãªãã§çºçããå¯èœæ§ããããŸãã ãã ããCTFEã¯ã¢ãã¢ã«ãã£ãŒãŒã·ã§ã³åŸã«çºçããŸããã€ãŸããäžè¬çãªã³ã³ããã¹ãã§å®çŸ©ãããå®æ°ãæå¹ãã©ããã¯ãã€ã³ã¹ã¿ã³ã¹åããããŸã§ããããŸãããããã¯ãå¥ã®ã¯ã¬ãŒãã§çºçããå¯èœæ§ããããŸãã ã¢ãã¢ã«ãã£ãŒãŒã·ã§ã³åã®ãšã©ãŒãååŸããã«ã¯ãconst修食ãè¡ãéçåæãå®è£ ããå¿ èŠããããŸãã äžè¬çãªã±ãŒã¹ã§ã¯ãconstã®ä¿®é£Ÿã¯æ±ºå®äžå¯èœã§ããããïŒã©ã€ã¹ã®å®çãåç §ïŒãéçåæã§ã¯ãMiriãCTFEäžã«å®è¡ãããã§ãã¯ã®ã¿ãè¿äŒŒã§ããŸãã
éçåæã§ã¯ãå
éšå¯å€æ§ã®ããåïŒ &Cell<i32>
ïŒãžã®const
ãconst
ãå€æŽã§ããŸãã
const X: &std::cell::Cell<i32> = std::cell::Cell::new(0);
fn main() {
X.get(); // 0
X.set(42);
X.get(); // 42
}
ãã ãããã®const
ã®æçµå€ãããã§ã¯ãªãããšã蚌æã§ããéãããŠãŒã¶ãŒãå
éšå¯å€æ§ïŒ !Freeze
ïŒãæã€ã¿ã€ãã®const
ãå®çŸ©ããããšãèš±å¯ããŸãã ããšãã°ãå®å®ããéã®åç以éã以äžãã³ã³ãã€ã«ãããŠããŸãã
const _X: Option<&'static std::cell::Cell<i32>> = None;
éçåæãžã®ãã®ã¢ãããŒãã¯ãã¿ã€ãããŒã¹ã§ã¯ãªãå€ããŒã¹ãšåŒã³ãŸãããã«ã¹ã¿ã Drop
implãåŒã³åºãããå¯èœæ§ã®ããã³ãŒãããã§ãã¯ããããã«ã䜿çšãããŸãã Drop
implsãåŒã³åºããšãconstãã§ãã¯ãè¡ããããconstã³ã³ããã¹ãã§èš±å¯ãããªãã³ãŒããå«ãŸããå¯èœæ§ãããããåé¡ããããŸãã å€ããŒã¹ã®æšè«ã¯ã let
ã¹ããŒãã¡ã³ãããµããŒãããããã«æ¡åŒµãããŸãããã€ãŸãã以äžã¯
const _: Option<Vec<i32>> = {
let x = None;
let mut y = x;
y = Some(Vec::new()); // Causes the old value in `y` to be dropped.
y
};
#![feature(const_if_match)]
ã®çŸåšã®åäœã¯ãããŒã¿ãããŒã䜿çšããŠè€éãªå¶åŸ¡ãããŒã°ã©ãã§æ©èœããããã«å€ããŒã¹ã®ã»ãã³ãã£ã¯ã¹ãæ¡åŒµããŸãã èšãæããã°ãããã°ã©ã ãéããã¹ãŠã®å¯èœãªãã¹ã«æ²¿ã£ãŠãå€æ°ãåé¡ã®è³æ Œãæã£ãŠããªãããšã蚌æããããšã
enum Int {
Zero,
One,
Many(String), // Dropping this variant is not allowed in a `const fn`...
}
// ...but the following code is legal under this proposal...
const fn good(x: i32) {
let i = match x {
0 => Int::Zero,
1 => Int::One,
_ => return,
};
// ...because `i` is never `Int::Many` on any possible path through the program.
std::mem::drop(i);
}
ããã°ã©ã ãä»ããŠå¯èœãªãã¹ãŠã®ãã¹ã«ã¯ãå®éã«ã¯å°éã§ããªãå¯èœæ§ã®ãããã¹ãå«ãŸããŸãã äžèšãšåãInt
åæåã䜿çšããäŸïŒ
const fn bad(b: bool) {
let i = if b == true {
Int::One
} else if b == false {
Int::Zero
} else {
// This branch is dead code. It can never be reached in practice.
// However, const qualification treats it as a possible path because it
// exists in the source.
Int::Many(String::new())
};
// ILLEGAL: `i` was assigned the `Int::Many` variant on at least one code path.
std::mem::drop(i);
}
ãã®åæã§ã¯ãæ»ãå€ã«ãã®ã¿ã€ãã®å€ãå«ãŸããŠããå¯èœæ§ããããšæ³å®ããŠãé¢æ°åŒã³åºããäžéæãšããŠæ±ããŸãã ãŸããå€æ°ãžã®å¯å€åç §ãäœæããããšããã«ãå€æ°ã®åããŒã¹ã®åæã«ãã©ãŒã«ããã¯ããŸãã constã³ã³ããã¹ãã§å€æŽå¯èœãªåç §ãäœæããããšã¯ãçŸåšãå®å®ããéã§ã¯çŠæ¢ãããŠããããšã«æ³šæããŠãã ããã
#![feature(const_mut_refs)]
const fn none() -> Option<Cell<i32>> {
None
}
// ILLEGAL: We must assume that `none` may return any value of type `Option<Cell<i32>>`.
const BAD: &Option<Cell<i32>> = none();
const fn also_bad() {
let x = Option::<Box<i32>>::None;
let _ = &mut x;
// ILLEGAL: because a mutable reference to `x` was created, we can no
// longer assume anything about its value.
std::mem::drop(x)
}
å€ããŒã¹ã®åæãå éšã®å¯å€æ§ãšéæ³ãªããšãèµ·ããåŸãªãããšã蚌æã§ããããã€ãã®ã±ãŒã¹ãèŠãããšãã§ããŸãã
æ¢åã®ã¢ãããŒãã«ä»£ãããå®çšçã§äžäœäºææ§ã®ãã代æ¿æ¡ãèãåºãã®ã¯é£ãããšæããŸããã constã³ã³ããã¹ãã§æ¡ä»¶ã䜿çšããããšããã«ããã¹ãŠã®å€æ°ã®åããŒã¹ã®åæã«ãã©ãŒã«ããã¯ã§ããŸãã ãã ãã@ oli-obkã®æ¬¡ã®äŸã®assert
ããã«ãäžèŠç¡é¢ä¿ãªè¿œå ãè¡ããšã³ãŒããã³ã³ãã€ã«ãããªããªãããããŠãŒã¶ãŒã«èª¬æããã®ãå°é£ã§ãã
const fn foo<T>(b: bool) {
let x = Option::<T>::None;
assert!(b);
{x};
}
䟡å€ããŒã¹ã®åæã®è¡šçŸåã®åäžã¯èªç±ã§ã¯ãããŸããã const
ãã®ã ãã§ãªãããã¹ãŠã®ã¢ã€ãã æ¬äœã§constèªå®ãè¡ã£ãããã©ãŒãã³ã¹å®è¡ã§ã¯ããã§ãã¯ãã«ãã§æ倧const
ãªããšæ³å®ããŠããããã§ãã ïŒ71330ã®ãããªå¯èœãªæé©åã«ã€ããŠã¯ãã¹ã¬ããã®ååã§èª¬æããŸããã
çŸæç¹ã§ã¯ãããããã®è©³çŽ°åã®åã«const-checkingãå®è¡ãããŸããã€ãŸããå®éã«ã¯å°éã§ããªãããããã¿ãŒãããŒã¿ãMIRã«æ®ã£ãŠããŸãã ããã«ããã Option::unwrap
ãconst fn
é²ãã§ããŸãïŒïŒ66753ãåç
§ïŒã ããã解決ããã®ã¯ããã»ã©é£ããããšã§ã¯ãããŸããããconst-checkingãã¹ã2ã€ã®ãã§ãŒãºïŒããããåãšããããåŸã®è©³çŽ°ïŒã«åå²ããå¿
èŠããããŸãã
#![feature(const_if_match)]
ãå®å®ãããšã倧éã®ã©ã€ãã©ãªé¢æ°ãconst fn
ããããšãã§ããŸãã ããã«ã¯ãïŒ53718ã§åæãããŠããããªããã£ãæŽæ°åã®å€ãã®ã¡ãœãããå«ãŸããŸãã
constã³ã³ããã¹ãã®ã«ãŒãã¯ãæ¡ä»¶ä»ããšåãconst修食質åã§ãããã¯ãããŸãã çŸåšã®ããŒã¿ãããŒããŒã¹ã®ã¢ãããŒãã¯ãå€æŽãªãã®åŸªç°CFGã§ãæ©èœããããã #![feature(const_if_match)]
ãå®å®ãããšãïŒ52000ã®ã¡ã€ã³ãããã«ãŒã¯ãªããªããŸãã
@ oli-obkãš@eddybã¯ãã»ãšãã©ã®å®è£ äœæ¥ã®äž»èŠãªã¬ãã¥ãŒæ åœè ã§ãããæ®ãã®@ rust-lang / wg-const-evalã¯ãconstã«é¢é£ããåé¡ãç解ããã®ã«åœ¹ç«ã¡ãŸãããè³æ Œã @solsonã«ãã£ãŠäœæãããçŸåšã¯@RalfJungãš@ oli-obkã«ãã£ãŠä¿å®ãããŠããMiriããªããã°ãããã¯äžå¯èœã§ãã
ããã¯ãFCPã«å è¡ããå®å®åã¬ããŒãã§ããããšãæå³ãããŠããŸãã ãã ããFCPãéãããšã¯ã§ããŸããã
@ ecstatic-morseãã®åé¡ã«ãå°œåããã ããèª ã«ããããšãããããŸãã
çŽ æŽãããã¬ããŒãïŒ
ç§ãèŠãããšæãããšã®1ã€ã@ ecstatic-morseã¯
èšãæãããšãconst fnã®æ¬äœãåæ³ã§ãããã©ãããå€æããããã«äœ¿çšãããåæã決å®ããŠããŸãããconst fnãäžããããå Žåãããã§ã®éžæã§ã¯ããconstfnã®åŒã³åºãå ãäœãå®è¡ã§ãããããªã©ã¯å€æãããŸãããçµæãã§ããïŒ ç§ã話ããŠããããšã®äŸãäœã§ããããç解ããããšããŠããŸã-åŒã³åºãå ã¯åæåã®ã©ã®ããªã¢ã³ãã䜿çšãããããæ£ç¢ºã«ç¥ãããšãã§ããªããšæããŸãããããã ãã§ã-ã©ã®ãããªå€ã§ãè¿ãããŸãã-å éšã®å¯å€æ§ã¯ãããŸããã§ããïŒããããããããã³ã°æã«ãä¿¡é Œã§ããŸããïŒã
ã¯ããconstfnã®æ¬äœã¯äžéæã§ãã ããã¯ã const
ã¢ã€ãã ã®ã€ãã·ã£ã©ã€ã¶ãŒåŒãšã¯å¯Ÿç
§çã§ãã ããªãã¯ããã芳å¯ããããšãã§ããŸã
const FOO: Option<Cell<i32>> = None;
&'static Option<Cell<i32>>
ãäœæããããã«äœ¿çšã§ããŸã
const BAR: &'static Option<Cell<i32>> = &FOO;
åãããã£ã®constfnã¯ã次ã®ããšã¯ã§ããŸããã
const fn foo() -> Option<Cell<i32>> { None }
const BAR: &'static Option<Cell<i32>> = &foo();
å®æ°ã«å¶åŸ¡ãããŒãå°å ¥ãããšãããã¯æ¬¡ã®ããšãæå³ããŸãã
const FOO: Option<Cell<i32>> = if MEH { None } else { None };
MEH
ã®å€ãšã¯é¢ä¿ãªããæ©èœããŸã
const FOO: Option<Cell<i32>> = if MEH { Some(Cell::new(42)) } else { None };
ç¹°ãè¿ãã«ãªããŸããã MEH
å€ãšã¯é¢ä¿ãããŸããã
å¶åŸ¡ãããŒã¯ã const fn
ã®åŒã³åºããµã€ãã«ã€ããŠã¯äœãå€æŽããããã®constfnå
ã§èš±å¯ãããã³ãŒãã«ã€ããŠã¯å€æŽããŸããã
ãªããžããªå ã®ããã€ãã®ä»£è¡šçãªãã¹ãã«ãªã³ã¯ããŠããã®ã§ãåäœã芳å¯ã§ããŸãã
ãCurrentNightlySemanticsãã»ã¯ã·ã§ã³ã®æåŸã«ãããã€ãã®èå³æ·±ããã¹ãã±ãŒã¹ã«ãªã³ã¯ãã段èœãè¿œå ããŸããã ãããå®å®ããåã«ãããã«ãã¹ãïŒç¶æ³ã«é¢ä¿ãªãçã§ããã¹ããŒãã¡ã³ãïŒãå¿ èŠã ãšæããŸãããçŸåšã®ã»ãã³ãã£ã¯ã¹ãæãŸãããã©ãããå€æããã°ãããã«å¯ŸåŠã§ããŸãã
semverãŸãã¯ä»ã®äœãã®åšãã«åœ±é¿ããããã©ããã
@ oli-obkãäžã§èšã£ãããšã«å ããŠã const
ã®æçµçãªå€ãå€æŽããããšã¯ãæè¡çã«ã¯ãã§ã«é倧ãªå€æŽã§ããããšãææããããšæããŸãã
// Upstream crate
const IDX: usize = 1; // Changing this to `3` will break downstream code!
// Downstream crate
extern crate upstream;
const X: i32 = [0, 1, 2][upstream::IDX]; // Only compiles if `upstream::IDX <= 2`
ãã ããå®æ°ã®ä¿®é£Ÿãå®å
šãªç²ŸåºŠã§è¡ãããšã¯ã§ããªããããå®æ°ãå€æŽããŠif
ãŸãã¯match
ãããšãæçµçãªå€ãå€æŽãããªããŠããããŠã³ã¹ããªãŒã ã³ãŒããç Žæãã
// Changing from `cfg` attributes...
#[cfg(not(FALSE))]
const X: Option<Vec<i32>> = None;
#[cfg(FALSE)]
const X: Option<Vec<i32>> = Some(Vec::new());
// ...to the `cfg` macro...
const X: Option<Vec<i32>> = if !cfg!(FALSE) { None } else { Some(Vec::new() };
// ...could break downstream crates, even though `X` is still `None`!
// Downstream
// Only legal if static analysis can prove the qualifications in `X`
const _: () = std::mem::drop(upstream::X);
ããã¯ã const fn
ã®æ¬äœå
ã®å€æŽã«ã¯é©çšãããŸãããããã¯ãåãã¯ã¬ãŒãå
ã§ãã£ãŠããæ»ãå€ã«åžžã«åããŒã¹ã®ä¿®é£Ÿã䜿çšããããã§ãã
ç§ã®èŠè§£ã§ã¯ãããã§ã®ãå眪ãã¯ãå€éšã®æšæ ã§å®çŸ©ãããconst
ãšstatic
ã®ã¿ã€ãããŒã¹ã®è³æ Œã«ãã©ãŒã«ããã¯ããŠããŸããã§ããã ãã ããããã¯1.0以éã«åœãŠã¯ãŸããšæããŸãããŸããããªãå€ãã®ã³ãŒããããã«äŸåããŠãããšæããŸãã éçåæãå®å
šã«æ£ç¢ºã§ã¯ãªãconståæååãèš±å¯ãããšããã«ãéçåæã§èšŒæã§ããªããŠãåãå€ãçæããããã«ãããã®åæååãå€æŽããããšãå¯èœã«ãªããŸãã
ç·šéïŒ
ãã®ç¹ã§ã if
ãšmatch
ã¯äœããŠããŒã¯ãªãã®ã¯ãããŸããã ããšãã°ãçŸåšãããŠã³ã¹ããªãŒã ã¯ã¬ãŒããå€ããŒã¹ã®è³æ Œã«äŸåããŠããå Žåã const
ã€ãã·ã£ã©ã€ã¶ãŒãconst fn
ã«ãªãã¡ã¯ã¿ãªã³ã°ããããšã¯é倧ãªå€æŽã§ãã
// Upstream
const fn none<T>() -> Option<T> { None }
const VALUE_BASED: Option<Vec<i32>> = None;
const TYPE_BASED: Option<Vec<i32>> = none();
// Downstream
const OK: () = { std::mem::drop(upstream::VALUE_BASED); };
const ERROR: () = { std::mem::drop(upstream::TYPE_BASED); };
@ ecstatic-morseå®å®åã¬ããŒããäœæããŠããã ãããããšãããããŸãïŒ ã³ã³ã»ã³ãµã¹ãéåæçã«æž¬å®ããŸãããïŒ
@rfcbotããŒãž
誰ããäŒè°ã§ãããåæçã«è°è«ãããå Žåã¯ãååãä»ãçŽããŠãã ããã
ããŒã ã¡ã³ããŒã®@joshtriplettã¯ããããããŒãžããããšãææ¡ããŸããã 次ã®ã¹ãããã¯ãã¿ã°ä»ããããæ®ãã®ããŒã ã¡ã³ããŒã«ããã¬ãã¥ãŒã§ãã
çŸåšãªã¹ããããŠããæžå¿µã¯ãããŸããã
ã¬ãã¥ãŒã¢ã®éåæ°ãæ¿èªãããšïŒãããŠæ倧2ã€ã®æ¿èªãæªè§£æ±ºã«ãªããšïŒããããæçµã³ã¡ã³ãæéã«å ¥ããŸãã ãã®ããã»ã¹ã®ã©ã®æç¹ã§ãæèµ·ãããŠããªã倧ããªåé¡ãèŠã€ããå Žåã¯ã声ãäžããŠãã ããã
ã¿ã°ä»ããããããŒã ã¡ã³ããŒãç§ã«äžããããšãã§ããã³ãã³ãã«ã€ããŠã¯ããã®ããã¥ã¡ã³ããåç §ããŠãã ããã
ããã«ããã ?
ã§const fn
?
ã䜿çšããããšãã§ããŸããïŒ
ããŸããã äžè¬ã«ãç¹æ§ã¯const fn
ã§ã¯èš±å¯ãããŠããŸããã
?
ã䜿çšãããšããããšã¯ã Try
ãã¬ã€ãã䜿çšããããšãæå³ããŸãã const fn
ãã¬ã€ãã®äœ¿çšã¯äžå®å®ã§ããhttpsïŒ//github.com/rust-lang/rust/issues/67794ãåç
§ããŠ
@TimDiekmannåœé¢ã¯ãïŒãäžããprocãã¯ããäœæããå¿
èŠããããŸãã æåã§ã loop
ãšfor
ã«ã€ããŠãåãããšãèšããŸãããå°ãªããšãç¹å®ã®å¶éïŒåå§ååž°ã¹ã¿ã€ã«ïŒãŸã§ã§ãããconstevalã«ã¯ãšã«ãããã®ãããªå¶éããããŸãã ãã®æ©èœã¯ãšãŠãçŽ æŽãããã以åã¯äžå¯èœã ã£ãå€ãã®ããšãå¯èœã«ããŸãã å¿
èŠã«å¿ããŠãconstfnã§å°ããªwasmvmãæ§ç¯ããããšãã§ããŸãã
äžèšã®ããŒãžããåŸåã®ããæåŸã®ã³ã¡ã³ãæéãå®äºããŸããã
ã¬ããã³ã¹ããã»ã¹ã®èªååããã代衚ãšããŠãèè ãšè²¢ç®ããŠãããä»ã®ãã¹ãŠã®äººã«æè¬ããŸãã
RFCã¯ãŸããªãããŒãžãããŸãã
æãåèã«ãªãã³ã¡ã³ã
ïŒ64470ãšïŒ63812ãããŒãžãããã®ã§ãããã«å¿ èŠãªãã¹ãŠã®ããŒã«ãã³ã³ãã€ã©ãŒã«ååšããŸãã ãã®æ©èœãæå¹ã«ããç¶æ ã§äžå¿ èŠã«éå¹çã«ãªããªãããã«ãconst修食ã«é¢ããã¯ãšãªã·ã¹ãã ã«ããã€ãã®å€æŽãå ããå¿ èŠããããŸãã ç§ãã¡ã¯ããã§é²æ©ãéããŠãããããã®å®éšçãªå®è£ ã¯ãæ°ãæã§ã¯ãªãæ°é±éã§æ¯æ©å©çšã§ããããã«ãªããšæããŸãïŒæåãªæåŸã®èšèïŒsmile :)ã