์ด๊ฒ์ 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 ์์ ์๋. ์ง๋ ๋ช ์ฃผ ๋์ IRC์์ ๊ทธ๋ฅผ ํ(ping)ํ ์ ์์๊ธฐ ๋๋ฌธ์ @eddyb ๋ ์ฐธ์ผ๋ก ๋งค์ฐ ๋ฐ๋นด์ต๋๋ค. ์ฌํ๊ฒ๋ ๋ด const-qualif ๋ถ๊ธฐ๋ ๋ด๊ฐ master ์์ ๋ง์ง๋ง์ผ๋ก ๋ฆฌ๋ฒ ์ด์คํ ์ดํ๋ก ์ปดํ์ผ์กฐ์ฐจ ๋์ง ์์ต๋๋ค. (์์ง ๋ฐ์๋ค๋ ๊ฒ ๋ฏฟ๊ธฐ์ง ์๋๋ค.)
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 ์ฃ์กํฉ๋๋ค. ํ์ง ์๋ฉด ์ผ์ ์ผ๋ก ๋ณ๊ฒฝํ๋๋ฐ ์ ๊ฐ ์ผ์ด๋ฌ์ ๋ ๋น์ ์ด ์ ์๊ฒ ํ์
๋น์ ์ ์ง์ ์์ ํ๋ณด๋ฅผ ํด์ผ ํฉ๋๊น? ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ผ๋ก ๋ฌด์์ ํด์ผ ํ๋์ง ์์์ต๋๊น?
@eddyb ๊ทธ๋ ๊ตฐ์ ํคํค . ๋๋ ๋ณดํต GMT ์คํ 8์๋ถํฐ ์์ํ๋ฏ๋ก ์ผ์ฐ ์ ์๋ฆฌ์ ๋ค์ด์ผ ํฉ๋๋ค. ํ์ง๋ง ๊ด์ฐฎ์ต๋๋ค! :-)
์ ๋ง ์ฃ์กํฉ๋๋ค. ๋ฌธ์ ์ ์ผ๋ จ์ ํจ์น๊ฐ Qualif::STATIC{,_REF}
์ ๊ฑฐํด์ผ ํ๋ค๋ ๊ฒ์ ๊นจ๋ซ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ ธ์ต๋๋ค. ์ฆ, ์ปดํ์ผ ํ์์ ์ ์ ์ก์ธ์ค์ ๋ํ ์ค๋ฅ์
๋๋ค. OTOH, ์ด๊ฒ์ const fn
s ๋ฐ static
s์ ๋ํ ์ก์ธ์ค ์ธก๋ฉด์์ ์ด๋ฏธ ์์๋์์ต๋๋ค.
#![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
"dangling pointer was dereferenced"(์ด๋ "dangling pointer" ๋์ static
s์ ๋ํด ์ค์ ๋ก ๋งํด์ผ ํจ)์ ๋ํด ๋ถํํฉ๋๋ค.
๊ทธ๋์ ๋๋ ์ปดํ์ผ ํ์์ static
์ฝ๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํ์ง๋ง ์ด๋ค ์ฌ๋๋ค์ const fn
๊ฐ ๋ฐํ์์ "์์"(์ฆ, "์ฐธ์กฐ์ ์ผ๋ก ํฌ๋ช
"ํ๊ฑฐ๋ ๊ทธ ์ ๋)๋๊ธฐ๋ฅผ ์ํฉ๋๋ค. const fn
์ธ์๊ฐ ๊ด์ฐฎ๋ก ์ป์ ์ฐธ์กฐ ๋ค์์ ์ฝ๊ธฐํ์ง๋ง const fn
์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ป์ ์ํด์๋ ์ static
๋ฐ์ผ๋ก ํ๊ณต์ (๋ฅผ ํฌํจํ์ฌ const
).
๊ทธ๋ฌ๋ฉด const
, const fn
๋ฐ ๊ธฐํ ์์ ์ปจํ
์คํธ(์น๊ฒฉ ํฌํจ)์์ static
์ธ๊ธํ๋ ๊ฒ์ ์ ์ ์ผ๋ก ๊ฑฐ๋ถํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ static
๊ฐ ๋ค๋ฅธ static
์ ์ฐธ์กฐ๋ฅผ ๊ฐ์ ธ์ค์ง๋ง (์๋ชป ์๋ํ์ง๋ง ์คํจ) ํด๋น ์ฐธ์กฐ ๋ค์์ ์ฝ๊ธฐ ๋ฅผ ๊ฑฐ๋ถํ๋ STATIC_REF
ํดํน์ ์ ๊ฑฐํด์ผ ํฉ๋๋ค. .
์ด๋ฅผ ์ํด RFC๊ฐ ํ์ํฉ๋๊น?
์ ์ ์์ ์ฝ๋ ๊ฒ์ด ๊ณต์ ํ๊ฒ ๋ค๋ฆฝ๋๋ค. RFC๊ฐ ํ์ํ์ง ์์ฌ์ด ๋ค์ง๋ง ์๋ง๋ ๋ถํ๊ตฌ์์ ๋ฐ๋ ๊ฒ์ผ ์๋ ์์ง๋ง ๋ด๊ฐ ๋งํ ์ ์๋ ์ต์ ์ ์๋ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ ๋ ์๋ฌด ๊ฒ๋ ์ ํ
์, ์ ๊ฐ ์๋ชป ์ฝ์์ต๋๋ค. ๋ฐ๋ผ์ const ํ๊ฐ๋ ์ฌ์ ํ ๊ฑด์ ํ๊ณ ์ฐธ์กฐ์ ์ผ๋ก ํฌ๋ช ํ์ง ์์ต๋๊น?
๋ง์ง๋ง ๋จ๋ฝ์ ์ฐธ์กฐ์ ์ผ๋ก ํฌ๋ช
ํ ์ ๊ทผ ๋ฐฉ์์ ์ค๋ช
ํฉ๋๋ค(๊ทธ๋ฌ๋ const
s ๋ฐ const fn
s์์ const
static
์ธ๊ธํ๋ ๊ฒ์ ํ์ฉํ๊ธฐ ์์ํ๋ฉด ํด๋น ์์ฑ์ ์๊ฒ ๋ฉ๋๋ค). ๊ฑด์ ์ฑ์ ๋ํ ๋
ผ์๋ ๋ณ๋ก ์์๋ ๊ฒ ๊ฐ์์.
๊ธ์, "๋งค๋ฌ๋ฆฐ ํฌ์ธํฐ"๋ ํ์คํ ๊ฑด์ ์ฑ ๋ฌธ์ ์ฒ๋ผ ๋ค๋ฆฌ์ง๋ง, ์ด๊ฒ์ ๋ํด์๋ ๋น์ ์ ๋ฏฟ๊ฒ ์ต๋๋ค!
"dangling pointer"๋ ์๋ชป๋ ์ค๋ฅ ๋ฉ์์ง์ด๋ฉฐ static
์์ ์ฝ๊ธฐ๋ฅผ ๊ธ์งํ๋ ๊ฒ์
๋๋ค. static
์ฐธ์กฐ ํ ์ ์๋ ์ ์ผํ ์์ ์ปจํ
์คํธ๋ ๋ค๋ฅธ static
. ๋ฐ๋ผ์ ํด๋น ์ฝ๋๋ ๋ชจ๋ ์ปดํ์ผ ํ์์ ํญ์ ํ ๋ฒ ์คํ๋๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์ฝ๊ธฐ๋ฅผ "๊ทธ๋ฅ" ํ์ฉํ ์ ์์ต๋๋ค.
(IRC์์) ์์ฝํ๋ฉด ์ฐธ์กฐ ํฌ๋ช
const fn
๋ ์ธ์๋ฅผ ๊ฑฐ์น์ง ์๊ณ ๊ณ ์ ํ ๋น์๋ง ๋๋ฌํ ์ ์์ต๋๋ค. ์ฆ, const
์๋ ๋์ผํ ์ ํ์ด ํ์ํ๊ณ ๊ณ ์ ๋์ง ์์ ํ ๋น์ static
์์๋ง ์ฌ ์ ์์ต๋๋ค.
๋๋ @eddyb ์ ์์ด๋์ด๊ฐ ํ์์ ์ผ๋ก ๋ค๋ฆฌ๋๋ก ์ฐธ์กฐ ํฌ๋ช ์ฑ์ ์ ์งํ๋ ๊ฒ์ ์ข์ํฉ๋๋ค!
์, ์ ๋ const fns๋ ์์ํ๊ฒ ๋ง๋๋ ๋ฐ ์ฐฌ์ฑํฉ๋๋ค.
๋ฌดํดํด ๋ณด์ด๋ ํน์ ๊ณํ์ ์ฐธ์กฐ ํฌ๋ช ์ฑ์ ๋ง์น ์ ์์ต๋๋ค. ์:
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 ์ค๋ฅ๋ก ์คํจํ์ง๋ง ๋ฐํ์์๋ ๋น๊ฒฐ์ ์ ์ ๋๋ค(๋ฏธ๋ฆฌ์ฒ๋ผ ํด๋น ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ "์ถ์"์ผ๋ก ํ์ํ ์ ์๊ธฐ ๋๋ฌธ์).
ํธ์ง : @Centril ์ unsafe
๋ด์์ ํน์ ์์ ํฌ์ธํฐ ์์
(์: ๋น๊ต ๋ฐ โโ์ ์๋ก ๋ณํ)์ unsafe
const fn
( const fn
์์ ํ๋ ๋๊น์ง ํ ์ ์์) ), ์ปดํ์ผ ํ์์ ๋ฏธ๋ฆฌ๊ฐ ํ์ฉํ๋ ๋ฐฉ์์ผ๋ก ๋ง ์ฌ์ฉํ ์ ์์์ ๋ช
์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ ํฌ์ธํฐ๋ฅผ ๋์ผํ ๋ก์ปฌ๋ก ๋นผ๋ ๊ฒ์ ๊ด์ฐฎ์ง๋ง(์ ํ ๋ ์ด์์, ๋ฐฐ์ด ์ธ๋ฑ์ค ๋ฑ์ ์์กดํ๋ ์๋ ๊ฑฐ๋ฆฌ๋ง ์ป์) ์ฐธ์กฐ ์ฃผ์ ํ์ ์ง์ ( {:p}
) ๋ ์๋ชป๋ ์ฌ์ฉ์ด๋ฏ๋ก fmt::Pointer::fmt
๋ฅผ const fn
๋ก ํ์ํ ์ ์์ต๋๋ค.
๋ํ ์์ ํฌ์ธํฐ์ ๋ํ Ord
/ Eq
ํน์ฑ impls๋ ์์ ํ๊ธฐ ๋๋ฌธ์ 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 ์ด์ const eval์ ์ผ๋ถ๊ฐ ์๋
AFAIK ์ฐ๋ฆฌ๋ const_qualify
์ ||
/ &&
์ํด ์์ฑ๋ SwitchInt
์ข
๊ฒฐ์๋ฅผ ๊ฑฐ๋ถํ๋ ์ฝ๋๊ฐ ์๊ธฐ ๋๋ฌธ์ HIR ๋ฎ์ถ๊ธฐ์ ์ด๋๊ฐ์์ ํด๋น ๋ฒ์ญ์ ์ํํฉ๋๋ค.
๋ํ, ๋ ๋ค๋ฅธ ์์ : @oli-obk๋ ์กฐ๊ฑด๋ถ๊ฐ ์์งํ๊ฒ ์๊ฐํ๋ ๊ฒ๋ณด๋ค ์ด๋ป๊ฒ ๋ ๋ ๋ณต์กํ๋ค๊ณ ์ด๋๊ฐ์ (ํ์ง๋ง ์ด๋์์ ์ฐพ์ ์ ์์) ๋งํ์ต๋๋ค ... ๋๋กญ / ๋ด๋ถ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ ๋ํ ๋ถ์์ ๋ํ "๊ทธ๋ฅ"์ด์์ต๋๊น?
๋ํ/๋ด๋ถ ๊ฐ๋ณ์ฑ์ ๋ํ ๋ถ์์ ๋ํ "๊ทธ๋ฅ"์ด์์ต๋๊น?
๋๋ ํ์ฌ ๊ทธ๊ฒ์ ์ง์ฐ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค. ๋ชจ๋ ์ ๋ณด๊ฐ ํ๋ณด๋๋ฉด ๋ค์ ์ฐ๋ฝ๋๋ฆฌ๊ฒ ์ต๋๋ค.
์ด ์ํ๋ ์ด๋ป์ต๋๊น? ์ธ๋ ฅ์ด ํ์ํ ๊ฑธ๊น์, ์๋๋ฉด ๋ฌธ์ ํด๊ฒฐ์ ๋งํ ๊ฑธ๊น์?
@mark-im const ์๊ฒฉ์ ๋ํ ์ ์ ํ ๋ฐ์ดํฐ ํ๋ฆ ๋ถ์ ๊ตฌํ์ด ์ฐจ๋จ๋์์ต๋๋ค. @eddyb ๋ ์ด ๋ถ์ผ์์ ๊ฐ์ฅ ์ง์์ด ํ๋ถํ๋ฉฐ ์ด์ ์ ์ด์ ๋ํ ์์ ์ ์ํํ์ต๋๋ค. (๋๋ ๊ทธ๋ฌ์ง๋ง ๊ทธ๋ฐ ์ข ๋ฅ์ ์ ์ฒด๋...) @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 ๋ ์ด๋ฏธ asize ์บ์คํธ๋ฅผ ๋ถ์์ ํ๊ฒ ๋ง๋๋
์ด๊ฒ์ ๋ํ ์๋ก์ด ์์์ด ์์ต๋๊น?
https://rust-lang.zulipchat.com/#narrow/stream/146212 -t-compiler.2Fconst-eval/topic/dataflow-based.20const.20qualification.20MVP์ ๋ํ ํ ๋ก ์ด ์์ต๋๋ค.
@oli-obk ๋งํฌ๊ฐ ์๋ํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋ฌด์์ ๋งํ๋๊ฐ?
๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ์๋ํฉ๋๋ค ... ๊ทธ๋ฌ๋ Zulip์ ๋ก๊ทธ์ธํด์ผํฉ๋๋ค.
@alexreg ํ ์ ๋ฐ์ดํฐ ํ๋ฆ ๊ธฐ๋ฐ const ์๊ฒฉ ์์ ์ ๊ดํ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค. @alexreg ์์์์ if ๋ฐ match์ ํ์ํ ์ด์ ๋ฅผ ์๊ณ ์์ต๋๊น?
๋ฐ์ดํฐ ํ๋ฆ ๊ธฐ๋ฐ ๋ฒ์ ์ด ์์ผ๋ฉด ์ค์๋ก ์์ ๋ด๋ถ์์ &Cell<T>
ํ์ฉํ๊ฑฐ๋ ์ค์๋ก None::<&Cell<T>>
๊ธ์งํฉ๋๋ค(์์ ์์ ์๋ํฉ๋๋ค. ๋ฐ์ดํฐ ํ๋ฆ ์์ด ์ ๋๋ก ๊ตฌํํ๋ ๊ฒ์ ๋ณธ์ง์ ์ผ๋ก ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๋ฐ์ดํฐ ํ๋ฆ์ ์๋ชป๋ ์์ ๋ฒ์ ์ด์ด์ผ ํจ)
@est31 ๊ธ์์, @oli-obk๋ ์ด๊ฒ์ ์ ๋ณด๋ค ํจ์ฌ ๋ ์ ์ดํดํ๊ณ ์์ง๋ง ์์ ์์ค์์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๊ธฐ์ ๊ด๋ จ๋ ๋ชจ๋ ๊ฒ์ ๋น์ ์ด ๋ง์ ์ฃ์ง ์ผ์ด์ค๋ฅผ ์ํ์ง ์๋ ํ ๋ฐ์ดํฐ ํ๋ฆ ๋ถ์์ ์ ์ ๋ก ํ ๊ฒ์ ๋๋ค. ์ด์จ๋ , Zulip์ ์ด ์ฌ๋์ด ์์ ํ๋ ค๊ณ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ง์ฝ ๊ทธ๋ ์ง ์๋ค๋ฉด oli-obk์ eddyb๊ฐ ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ ์๋๋ค. ์๋ง๋ ์ด๋ฒ ๋ฌ์ด๋ ๋ค์(๋ด๊ฐ ๊ทธ๋ค์๊ฒ ๋ง์ง๋ง์ผ๋ก ์ด์ผ๊ธฐํ์ ๋๋ถํฐ)์ผ ๊ฒ์ ๋๋ค. '/๊ทธ๋ค์ ๋์ ํ์ฌ ์ฝ์ํ์ง ์์ต๋๋ค.
@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, ๊ฐ์ฅ ์ต๊ทผ์ ๋ฐ์ ์ ์ฃผ๋ณ์ ์์๋ค ConstSafe
/ ConstRefSafe
a์ ์ต์ข
๊ฐ์ ์ฐธ์กฐ ๋ค์ / ์ง์ ๊ด์ฐฐ ํ ์์๋ ๊ฒฐ์ ํจ๋ฌ๋ค์ const
. ๊ทธ๋๋ ๋์์ธ ์์
์ด ๋ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฐ๋ผ์ค๋ ์ฌ๋๋ค์ ์ํด #65949(๊ทธ ์์ฒด๊ฐ ๋ช ๊ฐ์ ๋ ์์ PR์ ์ข ์๋จ)๊ฐ ์ด์ ๋ํ ๋ค์ ์ฐจ๋จ๊ธฐ์ ๋๋ค. ์ ์ ์ ์ผ๋ก๋ง ๊ด๋ จ์ด ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ง๋ง const-checking/qualification์ด ํ๋ก๋ชจ์ ๊ณผ ๋งค์ฐ ๋ฐ์ ํ๊ฒ ์ฐ๊ฒฐ๋์ด ์๋ค๋ ์ฌ์ค์ด ์ด ๊ธฐ๋ฅ์ด ์ค๋ซ๋์ ์ฐจ๋จ๋ ์ด์ ์ค ์ผ๋ถ์์ต๋๋ค. ๋๋ ์ด์ const-checker๋ฅผ ์์ ํ ์ ๊ฑฐํ๋ ํ์ PR์ ์ด ๊ณํ์ ๋๋ค(ํ์ฌ ์ฐ๋ฆฌ๋ ๋ ๊ฒ์ฌ๊ธฐ๋ฅผ ๋ณ๋ ฌ๋ก ์คํํฉ๋๋ค). ์ด๋ ๊ฒ ํ๋ฉด ์์ ์ธ๊ธํ ๋นํจ์จ์ฑ์ ํผํ ์ ์์ต๋๋ค.
์์ ์ธ๊ธํ ๋ PR์ด ๋ณํฉ๋ ํ ์์์์ if
๋ฐ match
๋ ๋ช ๊ฐ์ง ์ง๋จ ๊ฐ์ ์ฌํญ๊ณผ ๊ธฐ๋ฅ ํ๋๊ทธ๊ฐ ์ ๊ฑฐ๋ฉ๋๋ค! ์, ๊ทธ๋ฆฌ๊ณ ํ
์คํธ๋ ๋ง์ด ํ๊ณ ํ
์คํธ๋ ๋ง์ด ํ๊ณ ...
ํ ์คํธ๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ์์ํด์ผ ํ ์ง ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง ๊ธฐ๊บผ์ด ๊ธฐ์ฌํ ์ ์์ต๋๋ค! ํ ์คํธ๊ฐ ์ด๋๋ก ๊ฐ์ผ ํ๋์ง/์ด๋ป๊ฒ ์๊ฒผ๋์ง/์ด๋ค ๋ธ๋์น๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋์ง ์๋ ค์ฃผ์ญ์์ค. :)
๋ค์ PR์ #66385์ ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ ๋ฐ์ดํฐ ํ๋ฆ ๊ธฐ๋ฐ ๋ฒ์ ์ ์ํด ์ด์ const ์๊ฒฉ ๋ ผ๋ฆฌ(๋ถ๊ธฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์์)๊ฐ ์์ ํ ์ ๊ฑฐ๋ฉ๋๋ค.
@jyn514 ๋๋จํ๊ตฐ์ ! ๊ตฌํ ์ด์ ์์ฑ์ ์์ํ ๋ ping์ ๋ณด๋ด๋๋ฆฌ๊ฒ ์ต๋๋ค. ๋ํ ์ผ๊ฐ์ if
๋ฐ match
๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉด ์ฌ๋๋ค์ด const ์์ (ํนํ HasMutInterior
๋ถ๋ถ)์ ์๋ฐํ๋ ค๊ณ ์๋ํ๋ ๊ฒ๋ ๋งค์ฐ ๋์์ด ๋ฉ๋๋ค.
ํนํ ์ง๋จ๊ณผ ๊ด๋ จํ์ฌ ๊ฑฐ์น ๊ฐ์ฅ์๋ฆฌ๋ฅผ ์ ๊ฑฐํ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆด ๊ฒ์ผ๋ก ์์ํ๊ณ ํ ์คํธ ๋ฒ์๊ฐ ๋งค์ฐ ํฌ๋ฐํฉ๋๋ค( @jyn514 ํด๋น ๋ฌธ์ ์ ๋ํด ์กฐ์ ํด์ผ ํจ). ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์์ผ๋ก ๋ช ์ฃผ ์์ ๊ธฐ๋ฅ ํ๋๊ทธ ๋ค์ ์ด๋ฅผ ๋ฆด๋ฆฌ์คํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ด๊ฒ์ #66507์์ ๊ตฌํ๋์์ผ๋ฉฐ ์ด์ ์ต์ nightly ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ์์
๊ณผ ๋ด๋ถ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ ๋๋ ์ฌ์ฉ์ ์ ์ Drop
impl์ด ์๋ ์ ํ๊ณผ ๊ด๋ จ๋ ๊ธฐ์กด ๊ตฌํ์์ ๋ฐ์ํ ์ ์๋ ๋ช ๊ฐ์ง ๋ฌธ์ ์ ๋ํด ์์ธํ ์ค๋ช
ํ๋ Inside Rust ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ๋ ์์ต๋๋ค.
๊ฐ์ ๊ตฌ์ฑํ๋ผ!
ํ๋ฑ์ด 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 ์ค์ ๋ก ์๋ ํด์ผ
์ด๊ฒ์ด ์๋์ ์ธ ๊ฒ์ธ์ง ํ์คํ์ง ์์ง๋ง ์ด๊ฑฐํ๊ณผ ์ผ์น์ํค๋ ค๊ณ ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ฐ๊ฒฐํ ์ ์๋ ์ฝ๋๊ฐ ์๋ const fn์ด ์์ ์ ์ด์ง ์์ต๋๋ค.
์ด๊ฑฐํ์ด ์์ ํ๊ณ ๋์ผํ ์์์ ์ ์๋์ด ์์์๋ ๋ถ๊ตฌํ๊ณ .
@jhpratt ์ฝ๋๋ฅผ ๊ฒ์ํ ์ ์์ต๋๊น? ๋ฌธ์ ์์ด ๊ฐ๋จํ ์ด๊ฑฐํ์์ ์ผ์น์ํฌ ์ ์์ต๋๋ค. https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=585e9c2823afcb49c6682f69569c97ea
@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=518926a27c&end=51cf46 ์ด๊ฒ์ 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 ์ธํธ๋ก ์ ๋ฌ ํจ์๋ฅผ ํํํ ์ ์๋ ๋ ๋ค๋ฅธ ๋ฐ์ดํฐ ํ๋ฆ ๋ฌธ์ ์
๋๋ค. ๊ทธ๋ฌ๋, ์ผ์ ํ ์ ํ ๊ฐ ๋ณ์์ ์ค์ ๊ฐ์ ์ ์ฅํด์ผํ์ง๋ง, CONST ๊ฒ์ฌ๋ฟ๋ง ๋จ์ผ ๋นํธ๊ฐ ๋ณ์๊ฐ ์ง์ ๋์ด ์๋์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ์ ์ฅํด์ผ Drop
IMPL ๋๋ํ์ง Freeze
๊ทธ๊ฒ์ ๋ง๋ค๊ธฐ ์ผ์ ํ ์ ํ๋ณด๋ค ์ฝ๊ฐ ์ ๋ ดํฉ๋๋ค.
๋ช ํํ๊ฒํ๊ธฐ ์ํด, @ OLI-OBK์ ์ฒซ ๋ฒ์งธ ์์ ์์ ์ ์ปดํ์ผ ์ค๋, ๊ทธ๋ฆฌ๊ณ ์ดํ์ด 1.38.0 ํ์ง ์์๋ค, # 64470๋ฅผ ํฌํจํ๋ค.
๊ฒ๋ค๊ฐ const X: Option<Foo> = None;
๋ 1.0 ์ดํ๋ก ์ปดํ์ผ๋๋ฉฐ, ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ const eval์ด ์ป์ ์๋ก์ด ๊ธฐ๋ฅ๊ณผ ํจ๊ป ์์ฐ์ค๋ฝ๊ฒ ํ์ฅ๋ ๊ฒ์
๋๋ค.
๋ค, ๊ทธ๋ ๋ค๋ฉด ์์ ํ ๊ฐ์น ๊ธฐ๋ฐ ์ต์ ์ ์ฑํํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ํ์์์ ๊ทธ๊ฒ์ ๋ฎ๊ณ ๋ค์ ๋ณด๊ณ ํ ์ ์์ ๊ฒ ๊ฐ์์ =)
ํ์ฌ ์๋ฏธ ์ฒด๊ณ๋ก #![feature(const_if_match)]
๋ฅผ ์์ ํํ ๊ฒ์ ์ ์ํฉ๋๋ค.
ํนํ if
๋ฐ match
ํํ์๊ณผ ๋จ๋ฝ ๋
ผ๋ฆฌ ์ฐ์ฐ์ &&
๋ฐ ||
๋ ๋ชจ๋ 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
impls๋ฅผ ํธ์ถ ํ๊ฑฐ๋ ๋ด๋ถ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฐ์ ๋ํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ๊ณผ ๊ฐ์ ํน์ ์์
์ ํผํด์ผ ํฉ๋๋ค. ์งํฉ์ ์ผ๋ก ์ด๋ฌํ ๋ถ์ ๊ฒฉ ์์ฑ์ "์๊ฒฉ"์ด๋ผ๊ณ ํ๋ฉฐ, ํ๋ก๊ทธ๋จ์ ํน์ ์ง์ ์์ ๊ฐ์ ์๊ฒฉ์ด ์๋์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ํ๋ก์ธ์ค๋ฅผ "const ์๊ฒฉ"์ด๋ผ๊ณ ํฉ๋๋ค.
Miri๋ ๊ท์ ๋ ๊ฐ์ ๋ํด ์๋ชป๋ ์ฐ์ฐ์ด ๋ฐ์ํ์ ๋ ์ค๋ฅ๋ฅผ ์๋ฒฝํ๊ฒ ๋ด๋ณด๋ผ ์ ์์ผ๋ฉฐ ์คํ ์์ด ๊ทธ๋ ๊ฒ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ CTFE๋ ๋จํํ ํ ๋ฐ์ํฉ๋๋ค. ์ฆ, ๋ค๋ฅธ ์์์์ ๋ฐ์ํ ์ ์๋ ์ธ์คํด์คํ๋ ๋๊น์ง ์ผ๋ฐ ์ปจํ ์คํธ์ ์ ์๋ ์์๊ฐ ์ ํจํ์ง ์ ์ ์์ต๋๋ค. pre-monomorphization ์ค๋ฅ๋ฅผ ์ป์ผ๋ ค๋ฉด const ์๊ฒฉ์ ์ํํ๋ ์ ์ ๋ถ์์ ๊ตฌํํด์ผ ํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ const ์๊ฒฉ์ ๊ฒฐ์ ํ ์ ์์ผ๋ฏ๋ก( Rice์ ์ ๋ฆฌ ์ฐธ์กฐ) ๋ชจ๋ ์ ์ ๋ถ์์ 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
๋ฌธ์ ์ง์ํ๋๋ก ํ์ฅ๋์์ต๋๋ค. ์ฆ, ๋ค์ ์ rust 1.42.0 stable ์์ ์ปดํ์ผ๋ฉ๋๋ค .
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)
}
๊ฐ ๊ธฐ๋ฐ ๋ถ์์ด ๋ด๋ถ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ ๋ฐ ์ฌ์ฉ์ ์ง์ drop impls์ ๋ํด ๋ณด์์ ์ธ ๋ฐฉ๋ฒ์ ๋ํ ๋ ๋ง์ ์์ ๋ณด์์ ๋ถ์์ด ํ ์คํธ ์ค์ํธ์์ ๋ถ๋ฒ์ ์ธ ์ผ์ด ๋ฐ์ํ ์ ์์ ์ ์ฆ๋ช ํ ์ ์๋ ์ผ๋ถ ๊ฒฝ์ฐ๋ฅผ
๊ธฐ์กด ์ ๊ทผ ๋ฐฉ์์ ๋ํ ์ค์ฉ์ ์ด๊ณ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋๋ ๋์์ ์ฐพ๋ ๊ฒ์ด ์ด๋ ต๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค. const ์ปจํ
์คํธ์์ ์กฐ๊ฑด๋ฌธ์ด ์ฌ์ฉ๋์๋ง์ ๋ชจ๋ ๋ณ์์ ๋ํ ์ ํ ๊ธฐ๋ฐ ๋ถ์์ผ๋ก ๋์ฒดํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ๊ด๋ จ์ด ์์ด ๋ณด์ด๋ ์ถ๊ฐ๋ก ์ธํด ์ฝ๋๊ฐ ๋ ์ด์ ์ปดํ์ผ๋์ง ์๊ฒ ๋๋ฏ๋ก ์ฌ์ฉ์์๊ฒ ์ค๋ช
ํ๊ธฐ ์ด๋ ค์ธ ๊ฒ์
๋๋ค(์: @oli-obk์ ๋ค์ ์์ ์์ assert
.
const fn foo<T>(b: bool) {
let x = Option::<T>::None;
assert!(b);
{x};
}
๊ฐ์น ๊ธฐ๋ฐ ๋ถ์์ ํํ๋ ฅ ์ฆ๊ฐ๋ ๊ณต์ง๊ฐ ์๋๋ค. const
๋ฟ๋ง ์๋๋ผ ๋ชจ๋ ํญ๋ชฉ ๋ณธ๋ฌธ์ ๋ํด const ์๊ฒฉ์ ์ํํ perf ์คํ์ ๋น๋ ํ์ธ ์์ ์ต๋ const
๋ก ๋ง๋ค์ด์ง ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ์ต์
์ ์๋๋ฆฌ์ค์
๋๋ค. #71330์ ์๋ ๊ฒ๊ณผ ๊ฐ์ ๊ฐ๋ฅํ ์ต์ ํ๋ ์ค๋ ๋์ ์๋ถ๋ถ์์ ๋
ผ์๋์์ต๋๋ค.
ํ์ฌ const-checking์ drop elaboration ์ ์ ์คํ๋ฉ๋๋ค. ์ฆ, ์ค์ ๋ก๋ ๋๋ฌํ ์ ์๋ ์ผ๋ถ drop terminator๊ฐ MIR์ ๋จ์ ์์ต๋๋ค. ์ด๊ฒ์ Option::unwrap
๊ฐ const fn
๊ฐ ๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค(#66753 ์ฐธ์กฐ). ์ด๊ฒ์ ํด๊ฒฐํ๊ธฐ๊ฐ ๊ทธ๋ฆฌ ์ด๋ ต์ง๋ ์์ง๋ง const-checking ํจ์ค๋ฅผ ๋ ๋จ๊ณ(์ญ์ ์ ๋ฐ ํ ์ ๊ตํ)๋ก ๋ถํ ํด์ผ ํฉ๋๋ค.
#![feature(const_if_match)]
๊ฐ ์์ ํ๋๋ฉด ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์๋ฅผ const fn
๋ก ๋ง๋ค ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ #53718์ ์ด๊ฑฐ๋ ์์ ์ ์ ์ ํ์ ๋ํ ๋ง์ ๋ฉ์๋๊ฐ ํฌํจ๋ฉ๋๋ค.
const ์ปจํ
์คํธ์ ๋ฃจํ๋ ์กฐ๊ฑด๋ฌธ๊ณผ ๋์ผํ const ์๊ฒฉ ์ง๋ฌธ์์ ์ฐจ๋จ๋ฉ๋๋ค. ํ์ฌ ๋ฐ์ดํฐ ํ๋ฆ ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์ ์์ ์์ด ์ํ CFG์๋ ์๋ํ๋ฏ๋ก #![feature(const_if_match)]
๊ฐ ์์ ํ๋๋ฉด #52000์ ๋ํ ์ฃผ์ ์ฐจ๋จ๊ธฐ๊ฐ ์ฌ๋ผ์ง๋๋ค.
ํน๋ณ ๊ฐ์ฌ๋ ๊ตฌํ ๋๋ถ๋ถ์ ์์ ์ ๋ํ ๊ธฐ๋ณธ ๊ฒํ ๋ฟ๋ง ์๋๋ผ, ๋๋ฅผ const๋ฅผ ์ค์ฌ์ผ๋ก ๊ด๋ จ ๋ฌธ์ ๋ฅผ ์ดํด ๋๋ @ ๋ น LANG / WG-const๋ฅผ-ํ๊ฐ์ ๋๋จธ์ง์ด์๋ค @ OLI-OBK์ @eddyb์ ๊ธฐ์ธ ์๊ฒฉ. @solson์ด ๋ง๋ค๊ณ ํ์ฌ @RalfJung ๊ณผ @oli-obk๊ฐ ์ ์ง ๊ด๋ฆฌํ๋ Miri ์์ด๋ ์ด ๋ชจ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
์ด๊ฒ์ FCP ์ด์ ์ ์์ ํ ๋ณด๊ณ ์๋ฅผ ์ํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ FCP๋ฅผ ์ด ์ ์์ต๋๋ค.
@ecstatic-morse ์ด ๋ฌธ์ ์ ๋ํ ๋ชจ๋ ๋ ธ๊ณ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
์ข์ ๋ณด๊ณ ์!
๋ด๊ฐ ๋ณด๊ณ ์ถ๋ค๊ณ ์๊ฐํ๋ ํ ๊ฐ์ง๋ @ecstatic-morse์ ๋๋ค.
์ฆ, ์ฐ๋ฆฌ๋ const fn์ ๋ณธ๋ฌธ์ด ํฉ๋ฒ์ ์ธ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ถ์์ ๊ฒฐ์ ํ์ง๋ง const fn์ด ์ฃผ์ด์ง๋ฉด ์ฌ๊ธฐ์ ์ฐ๋ฆฌ์ ์ ํ์ "const fn์ ํธ์ถ์๊ฐ ์ํํ ์ ์๋ ์์ "๊ณผ ๊ฐ์ ๊ฒ์ ๊ฒฐ์ ํ์ง ์์ต๋๋ค. ๊ฒฐ๊ณผ"๋ผ๊ณ ์? ๋๋ ๋ด๊ฐ ๋งํ๋ ๊ฒ์ ์๊ฐ ๋ฌด์์ธ์ง ์์ ๋ด๋ ค๊ณ ๋ ธ๋ ฅ ์ค์ ๋๋ค. ํธ์ถ์๋ ์ด๊ฑฐ ํ์ ์ด๋ค ๋ณํ์ด ์ฌ์ฉ๋์๋์ง ์ ํํ ์์ง ๋ชปํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๊ฐ์ด ๋ฌด์์ด๋ ๋ฐํ๋จ -- ๋ด๋ถ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ์์์ต๋๋ค(๋งค์นญํ ๋ ์์กดํ ์ ์๊ธฐ ๋๋ฌธ์).
์, const fn์ ๋ณธ๋ฌธ์ ๋ถํฌ๋ช
ํฉ๋๋ค. ์ด๋ const
ํญ๋ชฉ์ ์ด๋์
๋ผ์ด์ ํํ์๊ณผ ๋์กฐ๋ฉ๋๋ค. ์ด๋ผ๋ ์ฌ์ค๋ก ์ด๊ฒ์ ๊ด์ฐฐํ ์ ์๋ค.
const FOO: Option<Cell<i32>> = None;
&'static Option<Cell<i32>>
๋ฅผ ๋ง๋๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
const BAR: &'static Option<Cell<i32>> = &FOO;
๋์ผํ ๋ณธ๋ฌธ์ ๊ฐ์ง const fn์ ๋ค์์ ์ํํ ์ ์์ต๋๋ค.
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
์ ํธ์ถ ์ฌ์ดํธ์ ๋ํด ์๋ฌด ๊ฒ๋ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ ํด๋น const fn ๋ด๋ถ์์ ํ์ฉ๋๋ ์ฝ๋์ ๋ํด์๋ง ๋ณ๊ฒฝํฉ๋๋ค.
๋ฆฌํฌ์งํ ๋ฆฌ์ ๋ช ๊ฐ์ง ๋ํ์ ์ธ ํ ์คํธ์ ๋ํ ๋งํฌ๋ฅผ ํตํด ๋์์ ๊ด์ฐฐํ ์ ์์ต๋๋ค.
ํฅ๋ฏธ๋ก์ด ํ ์คํธ ์ฌ๋ก๋ก ์ฐ๊ฒฐ๋๋ "Current Nightly Semantics" ์น์ ์ ๋์ ๋จ๋ฝ์ ์ถ๊ฐํ์ต๋๋ค. ์ด๊ฒ์ด ์์ ํ๋๊ธฐ ์ ์ ๋ ๋ง์ ํ ์คํธ(์ํฉ์ ๊ด๊ณ์์ด ์ฌ์ค์ธ ์ง์ )๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํ์ง๋ง, ํ์ฌ ์๋ฏธ ์ฒด๊ณ๊ฐ ๋ฐ๋์งํ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ฉด ํด๊ฒฐํ ์ ์์ต๋๋ค.
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`
๊ทธ๋ฌ๋ ์๋ฒฝํ ์ ๋ฐ๋๋ก const ํ์ ์ ์ํํ ์ ์๊ธฐ ๋๋ฌธ์ 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๊ฐ์ ์น์ธ์ด ๋ฏธ๊ฒฐ ์ํ์) ์ต์ข ์๊ฒฌ ์๋ ด ๊ธฐ๊ฐ์ด ์์๋ฉ๋๋ค. ์ด ํ๋ก์ธ์ค์ ์ด๋ ์์ ์์๋ ์ ๊ธฐ๋์ง ์์ ์ฃผ์ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๋ฉด ์๋ ค์ฃผ์ธ์!
ํ๊ทธ๊ฐ ์ง์ ๋ ํ ๊ตฌ์ฑ์์ด ๋์๊ฒ ์ค ์ ์๋ ๋ช ๋ น์ ๋ํ ์ ๋ณด๋ ์ด ๋ฌธ์ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
:bell: ์ ์ ์ด์ ๋ง์ง๋ง ๋๊ธ ๊ธฐ๊ฐ์ ์ ์ด๋ค์์ต๋๋ค . :๋ฒจ:
?
์์ const fn
?
๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๊น?
๊ทธ๋ ์ง ์์ต๋๋ค . ์ผ๋ฐ์ ์ผ๋ก ํน์ฑ์ const fn
์์ ํ์ฉ๋์ง ์์ต๋๋ค .
?
์ฌ์ฉํ๋ค๋ ๊ฒ์ Try
ํน์ฑ์ ์ฌ์ฉํ๋ค๋ ์๋ฏธ์
๋๋ค. const fn
์์ ํน์ฑ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ถ์์ ํฉ๋๋ค. https://github.com/rust-lang/rust/issues/67794๋ฅผ ์ฐธ์กฐ
@TimDiekmann ๋น๋ถ๊ฐ ์ ? ์๋์ผ๋ก. loop
๋ฐ for
๋์ง๋ง ์ต์ํ ํน์ ์ ํ(๊ธฐ๋ณธ ์ฌ๊ท ์คํ์ผ)๊น์ง๋ const eval์๋ ์ด๋ฌํ ์ ํ์ด ์์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ ๋งค์ฐ ํ๋ฅญํ์ฌ ์ด์ ์๋ ๋ถ๊ฐ๋ฅํ๋ ๋ง์ ์ผ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์ํ๋ ๊ฒฝ์ฐ const fn์์ ์์ wasm vm์ ๋น๋ํ ์๋ ์์ต๋๋ค.
์ ์ ๋ณํฉ ์ฒ๋ฆฌ๊ฐ ํฌํจ๋ ์ต์ข ์๊ฒฌ ์๋ ด ๊ธฐ๊ฐ์ด ์ด์ ์๋ฃ๋์์ต๋๋ค .
๊ฑฐ๋ฒ๋์ค ํ๋ก์ธ์ค์ ์๋ํ๋ ๋ํ์๋ก์ ๋๋ ๊ทธ๋ค์ ์์ ์ ๋ํด ์ ์์ ๊ธฐ์ฌํ ๋ค๋ฅธ ๋ชจ๋ ์ฌ๋๋ค์๊ฒ ๊ฐ์ฌํ๊ณ ์ถ์ต๋๋ค.
RFC๋ ๊ณง ๋ณํฉ๋ฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด์ #64470๊ณผ #63812๊ฐ ๋ณํฉ๋์์ผ๋ฏ๋ก ์ด์ ํ์ํ ๋ชจ๋ ๋๊ตฌ๊ฐ ์ปดํ์ผ๋ฌ์ ์์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ด ํ์ฑํ๋ ์ํ์์ ๋ถํ์ํ๊ฒ ๋นํจ์จ์ ์ด์ง ์๋๋ก const ์๊ฒฉ๊ณผ ๊ด๋ จ๋ ์ฟผ๋ฆฌ ์์คํ ์ ์ฝ๊ฐ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์์ ์ง์ ์ ์ด๋ฃจ๊ณ ์์ผ๋ฉฐ, ์ด๊ฒ์ ์คํ์ ๊ตฌํ์ ๋ช ๋ฌ์ด ์๋๋ผ ๋ช ์ฃผ ์์ ๋ฐค๋ง๋ค ์ฌ์ฉํ ์ ์์ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค(์ ๋ช ํ ๋ง์ง๋ง ๋จ์ด:smile:).