Rust-lang/rfc#2000์ ๋ํ ์ถ์ ๋ฌธ์
์ ๋ฐ์ดํธ:
๋์์ ์ฃผ๊ณ ์ถ๋ค๋ฉด open const ์ ๋ค๋ฆญ ๋ฌธ์ ๋ฅผ ์ดํด๋ณด๊ณ @varkor , @eddyb , @yodaldevoid , @oli-obk ๋๋ @lcnr ๋ก ์์ํ๋ ๋ฐ ๋์์ ์์ฒญํ์ญ์์ค.
๋ธ๋กํน ์์ ํ:
๋๋จธ์ง ๊ตฌํ ๋ฌธ์ :
FIXME(const_generics)
๋๊ธ์ ํด๊ฒฐํฉ๋๋ค.FIXME(const_generics:defaults)
).has_infer_types
์ฌ์ฉ ๊ฐ์ฌ{X * 2}
.ConstEvaluatable
์ ์ด๋ฅผ ์ถ๊ฐํ๊ณ expr
๊ฐ ๋๋ฆฌ๊ฒ ํ๊ฐ๋๊ธฐ ๋๋ฌธ์ WF([T; expr])
์๋ ์ด์ ConstEvaluatable(expr)
๊ฐ ํ์ํฉ๋๋ค(์ ์ ๋ฆฌํฐ๋ด์ผ์ง๋ผ๋). ์ด ์ ์ด๋ฅผ ์ถฉ์กฑํ๋ ค๋ฉด ํํ์์ด ์ฑ๊ณต์ ์ผ๋ก ํ๊ฐ๋์ด์ผ ํ์ง๋ง ์ ๊ทํ๋ ์ค๋ฅ๋ฅผ ๋ฌด์ํ๊ณ ์ฐพ์ Unevaluated
ํํ์์ ๊ทธ๋๋ก ๋ก๋๋ค. ์ด๋ ๊ด๋ จ ์ ํ ํ๋ก์ ์
์์ ๋ฐ์ํ๋ ๊ฒ๊ณผ ๊ฑฐ์ ๊ฐ์ต๋๋ค. ๋์ผํ ์์คํ
์ด const ์ ๋ค๋ฆญ์ผ๋ก ํ์ฅ๋ ๊ฒ์ผ๋ก ๊ธฐ๋ํฉ๋๋ค.@EpicatSupercell ์ ์ด ์์ ์ ๊ด์ฌ์ ํ๋ช ํ์ผ๋ฉฐ ์ด๊ธฐ ๊ตฌํ์ ํตํด ๋ฉํ ๋งํ๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ #44275์ ์ค๋ช ๋ ์ ํ ์ฌํญ ๋๋ฌธ์ ๋๋ฌด ๋ฉ๋ฆฌ ๊ฐ ์๋ ์์ต๋๋ค.
์ฆ, ์ฐ๋ฆฌ๋ @nikomatsakis ์ ์ง์ฐ ์ ๊ทํ๊ฐ ํ์ํฉ๋๋ค. ์ ํ์ ํฌํจ๋ ์์ ํํ์์ด ์ ๋ฐ์ ์ํ ์ข ์์ฑ์ ์์ฑํ์ง ์๊ณ ๋ฒ์(ํจ์/์ ํ ์ ์/impl ๋ฑ ํญ๋ชฉ์์) ๋ฒ์์ ๊ฒฝ๊ณ๋ฅผ ๊ด์ฐฐํ ์ ์์ต๋๋ค.
๊ตฌํ ์จ์ดํฌ์ธํธ(๋ณด๋ค ์ง์ ์ ์ธ ๋ฉํ ๋ง์ ์ํ๋ฉด Gitter์์ @eddyb
๋๋ IRC์์ eddyb
):
const
๋งค๊ฐ๋ณ์ ์ถ๊ฐparse_generic_params
- const IDENT: Type
๊ตฌ๋ฌธ ๋ถ์DefId
์์ง๊ธฐty::Generics
- ์ ํ 1๊ณผ ํจ๊ป const
๋งค๊ฐ๋ณ์ ์ถ๊ฐgenerics_of
- ty::ConstParameterDef
์์ hir::ConstParam
Def
- const
๋งค๊ฐ๋ณ์์ ๋ํ ๋ณํ ์ถ๊ฐwith_type_parameter_rib
- ์ ํ ๋ฐ const
์ ๋ค๋ฆญ ๋ชจ๋ ์ง์ConstVal
- ty::TyParam
์ ์ ์ฌํ Param
๋ณํ ์ถ๊ฐTyArray
์ ๊ธธ์ด๋ฅผ ๊ฐ์ง ExprPath
๋ก ํด๊ฒฐํ๋ ๊ฒ์ด Def::ConstParam
์ฌ์ฉํด์ผํฉ๋๋ค ConstVal::Param
๋์ ConstVal::Unevaluated
- ๋น์ทํ์ Def::TyParam
๊ฐ ty::TyParam
๋ก ๋ฐ๋๋ ํจ์
subst::Kind
- ์ง์ &ty::Const
๋ฐ ํ์ธ as_const
์๋๋ผ ์ฅ์ ์ด๋์์์ ๊ฐ์ ๊ฒฝ์ฐ as_type
๋ฐ as_region
ํ์ธ๋ฉ๋๋คConstVal
- ty::ReVar
/ ty::TyInfer(TyVar(_))
์ ์ ์ฌํ InferVar
๋ณํ ์ถ๊ฐInferCtxt
- const
int_unification_table
๋ฐ UnifyKey
impl์ ํด๋นํ๋ ty::relate::{Relate,TypeRelation}
- ๊ด๋ จ ์ง์ ty::Const
, ๋ฐ ์ฒ๋ฆฌ๋ฅผ ConstVal::InferVar
๋ฐฉ๋ฒ๊ณผ ์ ์ฌํ ๋ฐฉ๋ฒ์ผ๋ก super_combine_tys
์ ํ์ ์ํ์ด ๋ชจ๋ ๊ฒ์ด impl<T, const N: usize> Trait for [T; N] {...}
ํ์ฉํด์ผ ํ์ง๋ง ์ค์ ๋ก ์์ ํํ์์ ์ ํ/ํจ์(์: ArrayVec<T, 3>
์ ๋ฌํด์๋ ์ ๋ฉ๋๋ค.
์ด ์ ์ ํ๋ฒ ์ง์ด๋ณด๊ณ ์ถ์ต๋๋ค. :)
@jplatte @eddyb ์ด์ ๋ํ ์์์ด ์์ต๋๊น?
@samsartor ์ฃผ์ ๊ตฌํ ์์ ์ ์ ์ํํด์ผ ํ๋ ๋ฆฌํฉํ ๋ง์ด ์์์ต๋๋ค. ์ด์ ๊ฑฐ์ ์๋ฃ๋์์ต๋๋ค(ํ์ฌ ํผ๋๋ฐฑ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค). ๊ทธ ์ดํ์ ์ผ๋ง๋ ๋ง์ ์ผ์ด ์์๋์ง๋ ์ฌ์ค ๋ชจ๋ฆ ๋๋ค. const ๋งค๊ฐ๋ณ์ ๊ตฌ๋ฌธ ๋ถ์์ ๋ฆฌํฉํ ๋ง ์ ์ ์ฒ์์ ์์ํ ์์ ์ด์์ต๋๋ค. ์์ง ์๋ฃ๋์ง ์์์ง๋ง ๋น๊ต์ ๋นจ๋ฆฌ ์๋ฃํ ์ ์์ด์ผ ํฉ๋๋ค.
@jplatte pull request๋ฅผ ์ฐ๊ฒฐํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์ฐพ์ ์ ์์๋ค.
์์ง PR์ด ์์ต๋๋ค. ๋ด ๋ชจ๋ ์์ ์ ์ฌ๊ธฐ ์์ ์ฐพ์ ์
์ง๊ธ๊น์ง ์๊ณ ํ์ด
์ด์ ๊ธฐ์ด ์์
์ ๋ํ PR์ด ์์ต๋๋ค( Generics
๋ฆฌํฉํ ๋ง): #45930
๋๋ ์ด๊ฒ์ด ์ด๋ฏธ ํฌํจ๋์ด ์๋ค๊ณ ์๊ฐํ์ง๋ง ๋ค์ํ ๊ธธ์ด์ ์ ํ ๋์ํ ์คํ์ผ n ์ฐจ์ ๋ฐฐ์ด, IE a 4x4 [[f64;4];4]๋๋ 4x3x5x6 ์ฐจ์ ๋ฐฐ์ด [[[[ f64;6];5];3];4] ๋ฐ ์ค์นผ๋ผ์ ๋ํ ์ ์ ํ ํน์ฑ ๊ตฌํ ๋ฐ ์ ์ ํ ์ฐจ์์ ๋ฒกํฐ ๋ฑ์ ๋ํ ํน์ ๋ฉ์๋๋ฅผ ์ ์ ํ๊ฒ ๋ํํ๊ณ ์์ฑํ ์ ์์ต๋๋ค. https://gist.github.com/huhlig ์ฐธ์กฐ ๊ธฐ๋ณธ์ ์ธ ์๋
์ด์ ์ ์ด RFC์ ์ผ๋ถ๋ก Rust์ ๋ํด ์ ๊ธฐ ํํ์์ ์ ์ํ ์ฌ๋์ ๊ธฐ์ตํ์ง ๋ชปํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ด Rust์ด๊ธฐ ๋๋ฌธ์ ์๋ก์ด ์ ์ฉ ๊ตฌ๋ฌธ์ด ์๋ ์ผ๋ฐ ๋งคํฌ๋ก๋ก ์ ๊ธฐ ํํ์์ ๊ตฌํํ ์ ์๋ ์ด์ ๊ฐ ์์ต๋๊น?
#45930์ด ๋ณํฉ๋ ํ ๋ค์ ๋จ๊ณ๋ ๋ฌด์์ ๋๊น? @jplatte
@kjaleshire ๋ค์ ๋จ๊ณ๋ const ์ ๋ค๋ฆญ์ ๊ตฌ๋ฌธ ๋ถ์์ ๊ตฌํํ๋ ๊ฒ์ ๋๋ค( @eddyb ์ ์ถ๊ฐ ์ค๋ช ์ฐธ์กฐ). ๋ฆฌํฉํ ๋ง์์ ๋ฆฌํฉํ ๋ง์ด ํ์ํ๋ค๋ ๊ฒ์ด ๋ถ๋ช ํด์ง๊ธฐ ์ ์ ์ด๋ฏธ ์ด ์์ ์ ์์ํ์ต๋๋ค. ๊ทธ๊ฒ์ ๋ํ ๋์ ๊ธฐ์กด ์์ ์ ์ฌ๊ธฐ ์์ ์ฐพ์ ์
@jplatte @kjetilkjeka ๋ฅผ ์ธ๊ธํ๋ ค๊ณ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ ๋ฐ์ดํธํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ๋๋ ์ด ๊ธฐ๋ฅ์ ๊ธฐ๋ํ๋ ์ ์ผํ ์ฌ๋์ด ์๋๋ผ๊ณ ํ์ ํฉ๋๋ค. ์ข์ ์ผ์ ๊ณ์ํ์ญ์์ค!
@jplatte ๋ ์กฐ๊ธํดํ๊ณ ์ถ์ง ์์ง๋ง ์ด์ ๋ํ ์์ ์ด ์์์ต๋๊น? ๋์์ด ํ์ํ์ธ์? ๋๊ตฐ๊ฐ ๋์์ผ ํ ๊น์?
@est31 ์ฃ์กํฉ๋๋ค. ํ๋์ ์ด ์์ ์ ํ ์๊ฐ์ด ์์๊ณ ์ธ์ ์๊ฐ์ด ๋ ์ง ํ์ ํ ์ ์์ต๋๋ค. ๋ด๊ฐ ์ค๋จํ ๊ณณ์์ ๋ค๋ฅธ ์ฌ๋์ด ๊ณ์ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ ์๋ ์์ต๋๋ค. ํ์ฑ โโ๋ถ๋ถ์ ๋๋ถ๋ถ ๋๋ ๊ฒ ๊ฐ์์. ์ฝ๋์์ ์ผ๋ฐ ๋งค๊ฐ๋ณ์๊ฐ const ๋งค๊ฐ๋ณ์์ธ ๊ฒฝ์ฐ ๋ฌด์์ ํด์ผ ํ ์ง ํ์ ์ด ์์ง ์๋ ๋ ๊ณณ์ด ์์ต๋๋ค.
๋ํ ์์ง const ์ ๋ค๋ฆญ์ ๊ตฌ๋ฌธ ๋ถ์์ ๋ํ ํ ์คํธ๊ฐ ์์ต๋๋ค(๊ทธ๋ฆฌ๊ณ ๋์์ ์ ๋ฐ์ดํธํ ์์ ์ธ์ ์ฝ๋์ ๋ํ ํ ์คํธ๋ ์ํ๋์ง ์์). ๋ค๋ฅธ ์ฌ๋์ด ์ด ์์ ์ ๊ณ์ํ๋ ๋ฐ ํ์ํ๊ฑฐ๋ ๋์์ด ๋ ๋งํ ๋ค๋ฅธ ์ ๋ณด๋ฅผ ์ ๊ณตํ ์ ์๋์ง ํ์คํ์ง ์์ง๋ง ๋ด ์ฝ๋์ ๋ํด ๋ถ๋ถ๋ช ํ ๋ถ๋ถ์ด ์์ผ๋ฉด ์ธ์ ๋ ์ง ์ ์๊ฒ ํ์ ๋ณด๋ด์ฃผ์ญ์์ค.
@jplatte ~ ์ฒซ ๋ฒ์งธ๋ None
์ด๊ณ ๋ ๋ฒ์งธ๋ ์๋ฌด๊ฒ๋ ์๋๋๋ค~~ (cc @pnkfelix @nikomatsakis)
ํธ์ง : ๋ ๊ฒฝ์ฐ ๋ชจ๋ ํ ์ผ์ด ์์ต๋๋ค.
@eddyb ์ฒซ ๋ฒ์งธ ์ฐ๊ฒฐ๋ ์ค๋ํซ์ ๊ฒฝ์ฐ None
๊ฐ ๋ฐํ๋์ด์ผ ํฉ๋๊น? ์ฌ๊ธฐ์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ดํดํ์ง ๋ชปํ ์๋ ์์ง๋ง ์๋ฌด ๊ฒ๋ ํด์๋ ์ ๋๋ ๊ฒ ๊ฐ์ต๋๋ค. None
๊ฐ ๋ฐํ๋๋ฉด ์์ ํ์ง ์์ ์ ์๋ ๋ค๋ฅธ ๋งค๊ฐ๋ณ์๋ ๊ฑด๋๋๋๋ค.
@yodaldevoid ์ฃ์กํฉ๋๋ค. ๋ง์ต๋๋ค. Generics
์ ์๋์ง ๋ชฐ๋์ต๋๋ค.
@jplatte ๊ฐ ์ค๋จ๋ ๋ถ๋ถ์์ @eddyb ์ ๋ฉํ ๋ง ์ง์นจ์ ์ดํด๋ณด๊ณ ์ ๊ฐ ์ด๋๋ผ๋ ๊ฐ ์ ์๋์ง ํ์ธํ๋ ์๊ฐ์ ๊ฐ์ก์ต๋๋ค. ์ด ์์ ์์ "์ฌ์ฉ / ์๋ฏธ๋ก " ์น์ ์ผ๋ก ์ด๋ํ์ต๋๋ค. ๋๋ ์๋ง ์ง๋ฌธ์ ํ ์ ์์ ๋งํผ ๊ณง ์ฑํ ์ค ํ๋์ ๋ค๋ฅด๊ฒ ๋ ๊ฒ์ ๋๋ค.
@yodaldevoid ๋ฐ๊ฐ ์ต๋๋ค. ๋๋ Gitter์ ๋ํด ๋ชจ๋ฅด์ง๋ง IRC์์ #rustc ๋ฐ/๋๋ #rust-internals์ ๋ํ ๋ง์ ์ง์นจ์ ์ป์ ์ ์์ ๊ฒ์ ๋๋ค!
@yodaldevoid : ํ์ ์ ํ์๊ฒ ์ต๋๊น? ์ ๋ ์ด ๋ฌธ์ ์ ๋ํด ์กฐ์ฌ๋ฅผ ํ๊ณ ์์์ต๋๋ค(๐ ) โ ์๋ง๋ ์๋ก์ ์์ ์์ ๋ถ์กฑํ ๋ถ๋ถ์ ์ฑ์ธ ์ ์์ ๊ฒ์ ๋๋ค. ( ์ฌ๊ธฐ์์ ๋ด๊ฐ ์ผ์ ๋ณผ ์ ์์ต๋๋ค.) IRC(#rustc ๋๋ #rust-internals)์์ ์ด์ ๋ํด ์ด์ผ๊ธฐํ ์ ์์๊น์?
@varkor ๋น์ ์ ๋ด๊ฐ ๊ฐ์ง ๊ฒ๋ณด๋ค ํจ์ฌ ์์์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ๋ถ๋ช ํ ํ๋ ฅํ ์ํฅ์ด ์์ต๋๋ค. ์ด๋ ์์ ์์ IRC์์ ๋น์ ์ ์ก์ผ๋ ค๊ณ ๋ ธ๋ ฅํ ๊ฒ์ด๊ณ ๊ทธ ๋์ ๋น์ ์ด ์์ง ํ์ง ์์ ์ผ์ ๋ด๊ฐ ํ๋์ง ํ์ธํ์ญ์์ค.
์ด๊ฒ์ ์ง์ ์ด ์์ต๋๊น?
์๋ฒ ๋๋์ฉ ์ฝ๋๋ฅผ ์์ฑ ์ค์ด๋ฉฐ const ์ ๋ค๋ฆญ์ด ์ ๋ง ํ์ํฉ๋๋ค.
@qwerty19106
๋๋ฆฌ๊ธด ํ์ง๋ง ์ด์ ๋ํ ์ง์ ์ด ์ด๋ฃจ์ด์ง๊ณ ์์ต๋๋ค. @varkor ์ ์ ๋ ์๊ฐ์ด ์์ ๋๋ง๋ค ์ด ์์
์ ๊ณ์ํด ์์ต๋๋ค. ๋๋ ์ด๋ฒ ์ฃผ์ ์ฝ๊ฐ์ ์ง์ ์ ์ด๋ฃจ์๊ณ ๊ธฐ๋ณธ ์ฌ์ฉ์ ์ํด ํฐ๋ ๋์์ ๋น์ ๋ณด๊ณ ์์ต๋๋ค.
const ์ ๋ค๋ฆญ์ ๊ตฌํํ๋ ๊ฒ ์ธ์๋ ์ฐ๋ฆฌ(varkor)๋ ์ด ๋ชจ๋ ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ์ ๋ฆฌ ์์ ์ ์ํํ์ต๋๋ค(#48149 ๋ฐ #48523 ์ฐธ์กฐ). ๋๋ ํ์ฌ ๊ณํ์ด const ์ ๋ค๋ฆญ์ ๊ฐ์ ธ์ค๊ธฐ ์ ์ ๋ ๊ฐ์ pull ์์ฒญ์ด ํต๊ณผํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง varkor๋ ์ด์ ๋ํด ๋ ๋งํ ์ ์์ต๋๋ค.
์๋ฒ ๋๋ ์์ ์ ์ํ const ์ ๋ค๋ฆญ์ ํ์์ฑ์ ์ ๋ง๋ก ์ดํดํฉ๋๋ค. ๋๋ const ์ ๋ค๋ฆญ์ ์ํ๊ธฐ ๋๋ฌธ์ ์ด ์์ ์ ์์ํ์ฌ ์๋ฒ ๋๋ ์ฝ๋๋ฅผ ์ ๋ฆฌํ๊ณ ์ ํ์ด ์์ ํ ํฐ ๋ฒ์๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
TL;DR: ์งํ์ด ์งํ๋๊ณ ์์ง๋ง ์ด๋ ๋ณต์กํฉ๋๋ค. ๋ด์ฅ๋ ์ ๋ฉด์์ ๋น์ ์ ๋๋๋๋ค.
"๋ฌธ์" ์ฒดํฌ๋ฐ์ค์ ๊ฒฝ์ฐ, rustc ๊ฐ์ด๋ ์์ ๋ฌด์ธ๊ฐ๋ฅผ ์ป๋ ๊ฒ์ด
@yodaldevoid ํ์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋๋ ๋น์ ์ ์์ ์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆด ๊ฒ์ ๋๋ค.
๊ถ๊ธํ์ ๋ถ๋ค์ ์ํ ์ ๋ฐ์ดํธ(์ ๋ ๊ถ๊ธํด์). Re: ์์์ ์ธ๊ธ
@mark-im ์ข์ ์๋ฃ์ ๋๋ค! @varkor๋์ ๋ฉ์ง ์ํ์ ๋๋ค. ๋๋ต์ ์ธ ETA๊ฐ ์ธ์ ์ธ์ง ์์ญ๋๊น? :-)
@alexreg https://github.com/rust-lang/rust/issues/51192#issuecomment -394126083
๊ฑด๋ฐฐ, @flip111.
๋ ๋ฒ์งธ ํฐ ๋ฆฌํฉํ ๋ง PR #48149๊ฐ ๋ณํฉ๋ ๊ฒ ๊ฐ์ต๋๋ค. :)
/๋๋ฅผ ์ฐธ์กฐ
๋ค์ @varkor PR #51880
์ผ๋ถ ์ฌ๋๋ค์ด const ์ ๋ค๋ฆญ์ ์งํ ์ํฉ์ ๋ํด ๋ฌป๋ ๊ฒ์ ์๊ณ ์๊ธฐ ๋๋ฌธ์ ๋น ๋ฅธ ์ ๋ฐ์ดํธ๋ฅผ ์ ๊ณตํ๊ณ ์ถ์์ต๋๋ค.
์ปจํ ์คํธ๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด 3์ ์ @yodaldevoid ์ ์ ๋ ๊ฑฐ์ ์๋ํ๋ ์ด๊ธฐ ๊ตฌํ์ ํ์ต๋๋ค(๋๋ถ๋ถ์ ๊ตฌํ์ด ์๋ฃ๋ ๊ฒ์ฒ๋ผ ๋ณด์๊ณ ์ฐ๋ฆฌ๋ ๋๋จธ์ง ์ผ๋ถ ์ถฉ๋์ ์ ๋ฆฌํ๋ ์ค์ด์์ต๋๋ค). ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๊ฐ ์์ ํ๊ณ ์๋ ๋ธ๋์น๋ pre-miri์์ต๋๋ค. miri๊ฐ ๋ณํฉ๋์์ ๋(๊ทธ๋ฆฌ๊ณ ์ฌ๋ฌ ํ์ PR์์) ์ง์์ ์ธ ํ๊ฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ฝ๋๊ฐ ํฌ๊ฒ ๋ณ๊ฒฝ๋์์ต๋๋ค.
๊ฒ๋ค๊ฐ ๊ฐ๋ ์ฑ์ ํฅ์์ํค๊ธฐ ์ํด ๋ฟ๋ง ์๋๋ผ ํน์ ๊ฒฝ์ฐ์ const ์ ๋ค๋ฆญ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์์ด๋ฒ๋ฆฐ ์ค์๋ฅผ ํ๊ธฐ ์ํด const ์ ๋ค๋ฆญ์ ์ ์ฉํ๊ธฐ ์ ์ ์ ๋ค๋ฆญ ๋งค๊ฐ๋ณ์ ์ฝ๋๋ฅผ ์ผ๋ฐ์ ์ผ๋ก ์ ๋ฆฌํด์ผ ํ๋ค๊ณ ๊ฒฐ์ ํ์ต๋๋ค. ๋ง๋ค๋ค. ์ด๊ฒ์ https://github.com/rust-lang/rust/pull/48523 , https://github.com/rust-lang/rust/pull/48149 ์์ ์ํ๋์์ผ๋ฉฐ https://github ์์ ์๋ฃ๋ ๊ฒ
๊ทธ๋์ @yodaldevoid ์ ์ ๋ ์๋์ ๊ตฌํ์ rustc์ ๋ชจ๋ ํ์ ๋ณ๊ฒฝ ์ฌํญ๊ณผ ํธํ๋๋๋ก ๋ง๋ค๊ธฐ ์ํด ๋ ธ๋ ฅํ์ต๋๋ค. ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ธด ํ์ง๋ง, ์ฐ๋ฆฌ๋ ๊ฑฐ๊ธฐ์ ๋๋ฌํ๊ณ ์์ต๋๋ค(๋น๋ก ์์ํ ๋งํผ์ ์๊ฐ์ ๊ฐ์ง ๋ชปํ๋ ์๊ตฌ์ ์ธ ๋ฌธ์ ๊ฐ ์์ง๋ง). ์กฐ๋ง๊ฐ ์ข์ ์์์ด ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. (ํํธ https://github.com/rust-lang-nursery/chalk ๋ ์ข์ ์ง์ ์ ๋ณด์ด๊ณ ์์ผ๋ฉฐ @eddyb๊ฐ ์๋ ์ค๋ช ํ๋ ์ด๋ ค์ ์ค ์ผ๋ถ๋ฅผ ํด๊ฒฐํด์ผ ํฉ๋๋ค.)
์ด๋ค ์ฌ๋๋ค์ ๋์์ด ๋ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ฌป์ต๋๋ค. ์ด ๋จ๊ณ์์ ์ด๊ธฐ ๊ตฌํ์ ์๋ฃํ๊ณ ์ฃผ์๊ฐ ํ์ํ ๋ถ๋ถ์ ํ์ธํ๋ ๊ฒ์ด ๋ ์ฌ์ธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ผ๋จ ์ค๋น๊ฐ ๋์์ผ๋ฉด ๋ค์ํ ์์น์์ const ์ ๋ค๋ฆญ์ ์ฌ์ฉํ๋ ๋ง์ ํ ์คํธ๊ฐ ํ์ํ ๊ฒ์ ๋๋ค(์ค๋ฅ ๋ฉ์์ง์ ๋ํด ์๋ชป๋ ๊ฒ์ ํฌํจํ์ฌ). ๊ทธ๋์ ๊ทธ๊ฒ์ ํ์คํ ์ฐ๋ฆฌ๊ฐ ๋ง์ ๋์์ ๋ฐ์ ์ ์๋ ๊ณณ์ ๋๋ค! ๊ทธ๋ฐ ์ผ์ด ๋ฐ์ํ๋ฉด ์๋ ค ๋๋ฆฌ๊ฒ ์ต๋๋ค!
์ ์ ํ ์ฅ์๊ฐ ์๋๋ผ๋ฉด ์ฃ์กํ์ง๋ง ์ถ์ const ํํ์์ ํ๋ฑ์ ๊ดํ ์ ์์ด ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์์ ์ข ์ ์ ํ ๋ฐ ๊ฒฐ์ ๋ถ๊ฐ๋ฅํ ์์ญ์ผ๋ก ์ง์ ์ถ์๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ น์์๋ ๋ชจ๋ ๊ฒ์ด ๊ฒฐ๊ตญ ๊ตฌ์ฒด์ ์ธ ๊ฐ/์ ํ
๋ด ๋ง์ ์ถ์ const ํํ์์ ํ๋ฑ์ ํ์ธํ๋ ๋น๊ต์ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค๋ ๊ฒ์ ๋๋ค.
N+1 == N+1
๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ํด์ผ ํจ).N+M == M+N
( where
์ ์ ์์ต๋๊น?)์ ๊ฐ์ ๋ฐฉ์ ์์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ด ๋ฐฉ์ ์์ ๋ฑ์ ๊ฒ์ฌ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค(์ผ๋ถ ํํ์ ์ผ์น ์ข
๋ฃ ์ฌ์ฉ). ์ด๋ฌํ ์ ๊ณต๋ ๋ฐฉ์ ์์ ์ฌ์ฉํ์ฌ ์ ํ ๊ฒ์ฌ๋ฅผ ์ํํ์ง ์๋ ์ ์๋ ๊ฑฐ๋ถ๋ฉ๋๋ค.false
์ถ์๋๋ฉด ์ปดํ์ผ ์ค๋ฅ๊ฐ ์๊ฑฐ๋("๋ฐฉ์ ์์ ๊ณต๋ฆฌ์
๋๋ค") ํน์ฑ์ ์ธ์คํด์คํํ ์ ์์ต๋๋ค("๋ฐฉ์ ์์ ์ ์ฝ ์กฐ๊ฑด์
๋๋ค").N
์ํด ๋งค๊ฐ๋ณ์ํ๋ f
ํจ์๊ฐ ์๋ ๊ฒฝ์ฐ N+0==N
์ด ๋ฐฉ์ ์์ ํธ์ถ์ g
์์ ์์ค๋์ง ์์์ผ ํฉ๋๋ค g
๊ฐ ํธ์ถ๋๋ ๊ฐ ๋ชจ๋
ธ๋ชจํฝ ์์น์์ ํ์ธํด์ผ ํ๋ฏ๋ก ์ด ๋ฐฉ๋ฒ์ ์ฅ์ ์ Rustc ์์ฒด์ ์ ๋ฆฌ ์ฆ๋ช
์, SMT ์๋ฒ ๋๋ ์ฐ์ ์ฌ์์ฑ๊ธฐ๊ฐ ํ์ํ์ง ์๋ค๋ ๊ฒ์
๋๋ค. "์ค์ง" ์ ํ, ๋ชจ๋๋ก ๋ณ์นญ ๋ฐ ๋ชจ๋๋ก ์ฌ์ฉ์๊ฐ ์ ๊ณตํ๋ ๋ฐฉ์ ์ ์ธํธ์ ๊ตฌ๋ฌธ ํ๋ฑ ๊ฒ์ฌ.
๋จ์ ์ M+N=N+M
์ ๊ฐ์ด ๋ช
๋ฐฑํด ๋ณด์ด๋ ๋๋ฑ์ฑ์ ๋ช
์์ ์ผ๋ก ์ถ๊ฐํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์์๊ฒ ๋ ์๋์ ์ด๋ผ๋ ๊ฒ์
๋๋ค.
/// this works directly because of syntactic checks
fn add_end<T:Copy, const N: usize>(a: &[T;N], b: T) -> [T;N+1] {
let x : [T;N+1] = [b;N+1];
x[0..N] = a;
x
}
/// this should work already
fn append<T:Copy, const M:usize, const N:usize>(a: &[T;M], b: &[T;N])
-> [T;{M+N}]
{ โฆ }
/// Here the equation M+M==N must be carried over or checked whenever this function is used
fn sum_pairwise_append<const M: usize, const N: usize>(a: &[i32, M],b: &[i32;N])-> [T;N]
where M+M == N {
let mut res : [i32; N] = append(a,a);
for i in 0 .. N { res[i] += b[i] };
res
}
fn main() {
let a: [i32; 2] = [1;2];
let b: [i32; 4] = [2;4];
let _ = sum_pairwise_append(a, b); // need to check 2+2=4
}
์ด๊ฒ์ e1 == e2
๊ฐ ํญ์ true์ฌ์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฏ๋ก ์ค์ ๋ก where
์ ์ฝ ์กฐ๊ฑด์ด ์๋๋ผ ์ ํ ๊ฒ์ฌ๊ธฐ๊ฐ ์ฌ์ฉํ ์ ์๋ assert_eq!(e1,e2)
์ ๊ฐ๊น์ต๋๋ค. ์ฌ๊ธฐ์ ๊ตฌํ์๋ ์ด๊ฒ์ด ํญ์ ์ฌ์ค์์ ์ฝ์ํ๊ณ ์ฌ์ฉ์๊ฐ ๋ฐฉ์ ์์ ๋ฐ๋ฐํ๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๊ณตํ๋ฉด ์ปดํ์ผ ์ค๋ฅ์ ๋
ธ์ถ๋ฉ๋๋ค.
์ฌ๊ธฐ์ where e1 == e2
์ ์ ์ด ๋งค๊ฐ๋ณ์ํ๋ ํน์ฑ/๊ธฐ๋ฅ์ ์ฑ๊ณต์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด ์ถฉ์กฑ๋์ด์ผ ํ๋ ์ ์ฝ ์กฐ๊ฑด์
๋๋ค. ์ฆ, e1 == e2
๊ฐ ํญ์ ์ ์ง๋ ํ์๋ ์์ผ๋ฉฐ z==0
์ธ์คํด์คํ์ ์คํจํ๋ (x*y) / z == (y*x) / z
์ ๊ฐ์ด ๋๋ฉ์ธ์ ๋ํด์๋ง ์ฐธ์ธ ๋ฐฉ์ ์์ ๋ํด ํฅ๋ฏธ๋ก์ธ ์ ์์ต๋๋ค.
@c-cube ์ฐ๋ฆฌ๋ ์ด๋ฏธ " WF
(well-formedness) ๊ท์น"์์ ํ์๋ ํจ์์ ๋ํด "์์์ where
์ "์ ๋ํ ์์คํ
์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ฆ, fn foo<'a, 'b>(x: &'a &'b i32) {}
๋ฅผ ์ ์ํ๋ ๊ฒฝ์ฐ 'b: 'a
๋ฅผ ๋ง์กฑํด์ผ ํฉ๋๋ค( WF(&'a &'b i32)
-> &'b i32: 'a
-> 'b: 'a
).
์ฐ๋ฆฌ๋ ๊ทธ ์์คํ
(์ฌ์ค ์ด๊ฒ์ ์ด๋ฏธ ๊ตฌํ๋์ด ์์)์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค("์ด ์์ ํํ์์ด ์ฑ๊ณต์ ์ผ๋ก ํ๊ฐ๋จ" ํ์ ์) ์๋ช
์ ์ํด ์ฃผ์ด์ง ์ ์ฝ ์กฐ๊ฑด ์ ํธ์ถ์์๊ฒ where
ํ์ํฉ๋๋ค.
๋น์ ์ด ์ค๋ช
ํ๊ณ ์๋ ๋ค๋ฅธ ๋ชจ๋ ๊ฒ๋ค์ ๋๋ถ๋ถ์ ๊ณํ๋ ๊ฒ๊ณผ ๋น์ทํด ๋ณด์ด์ง๋ง("๊ตฌ๋ฌธ ํ๋ฑ"์ ํํ ํฌํจ), ์ฐ๋ฆฌ๋ "๋จํํ ์๊ฐ" ๊ฒ์ฌ๋ฅผ ์ํ์ง ์์ผ๋ฉฐ ๋์ ๋ฐฉ๋ฒ์ ๊ฐ์ง ์ ์์ต๋๋ค(์์์ ๋๋ where
์ )์ ์ฌ์ฉํ์ฌ "์ ์ฝ ์กฐ๊ฑด์ ์ธ์คํด์คํ๊ธฐ๋ก ์ ํ"ํ๊ณ ์ ์ฝ ์กฐ๊ฑด์ด "์ฌ์ ํ ๋๋ฌด ์ผ๋ฐ์ "์ธ ์ค๋ฅ(์ ์ง๋๋์ง ์ฌ๋ถ๋ฅผ ์ ์ ์์) ๋๋ ํ๊ฐํ ์ ์์ง๋ง ์ ์ง๋์ง ์๋ ๊ฒฝ์ฐ ์ค๋ฅ๋ฅผ ์์ฑํฉ๋๋ค.
๋น์ ์ด ์ค๋ช ํ๋ ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ ๋๋ถ๋ถ์ ๊ณํ๋ ๊ฒ๊ณผ ๋น์ทํด ๋ณด์ ๋๋ค.
@eddyb ์ด๋ฌํ ๊ณํ์ ๋ํด ๋ ผ์ํ๋ ์ฐธ์กฐ ๊ฒ์๋ฌผ์ ์๊ณ ์์ต๋๊น?
@flip111 ์๋ง๋ RFC ์ค @withoutboats ๊ฐ ๋ ์ ์ ์ ์์ต๋๋ค.
#51880 is done :tada: :tada:
@withoutboats @ OLI-OBK ๋น์ ๊ฐ์ ํํ์ ์ ์ ํ ํต์ผ ์ฐจ๋จ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ญ๋๊น N + 1
(์์์ [T; N + 1]
์์ ์์ง์ ์ธ ํ๊ฐ์ ๊ธฐ๋ณธ์ ์ธ ์์์ ์ป๊ธฐ์) miri
?
@varkor ๊ฐ ConstValue::{Infer,Param}
์ถ๊ฐํ ๋ ์ด๋ฅผ ์ธ์ฝ๋ฉํ๋ ๋ฉ์ปค๋์ฆ์ด ์ด๋ฏธ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ฅผ ์ฌ์ฉํ์ฌ "(์๊ฒ) ์ ํจํ์ง๋ง ์ ์ ์๋"(๊ธฐํธ) ๊ฐ์ ์ถ์ ํ ๋ค์ ๊ฐ(์ฃผ๋ก ์ ์) ์ฐ์ฐ ๋ฐ ๊ทธ ์์ ํธ์ถํฉ๋๋ค.
assert
์๋ ์ ์ด ํ๋ฆ ๊ฒฐ์ ์๋ ์ฌ์ ํ ์๋ ค์ง ๊ฐ์ด ํ์ํ์ง๋ง assert
์์ฒด๋ AssertThen(condition, assert message, success value)
๋ก ๊ตฌ์ฒดํ๋ ์ ์์ต๋๋ค.
( condition
๋ฐ success value
๋ชจ๋ ์์ง์ ์ผ ์ ์์ต๋๋ค!)
๊ธฐํธ ๊ฐ์ ty::Const
๋ก ๋ด๋ณด๋ผ ์ ์๋ค๋ ๊ฒ์ (๋๋ถ๋ถ?) ์์
์ ๋ถํฌ๋ช
ํ๊ฒ ์ฒ๋ฆฌํ์ฌ miri ์ธ๋ถ์ ์ผ๋ถ ํตํฉ์ ๊ตฌํํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
์ถ๋ก ๋ณ์๋ฅผ ๊ฐ์ ํ์ง ์๋๋ก ์ฃผ์ํด์ผ ํ์ง๋ง N + 1
๋ ๊ฐ์ Add(Param(N), Bits(1))
ํจ๊ป ํตํฉํ๋ ๊ฒ์ ์ง์ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@varkor ํต์ผ์ด ์๋ ๊ฒ์ผ๋ฅธ ์ ๊ทํ์ ํจ๊ป ์๋ํด์ผ ํ๋ค๊ณ ์๊ฐํ๋ ํ ์คํธ ์ฌ๋ก:
/*const*/ fn append<const N: usize, T>(xs: [T; N - 1], x: T) -> [T; N] {
let new = MaybeUninit::<[T; N]>::uninitialized();
unsafe {
let p = new.as_mut_ptr() as *mut T;
(p as *mut _).write(xs);
p.add(N - 1).write(x);
}
new.into_inner()
}
๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ์๋ํฉ๋๋ค.
N - 1
๋ ์ ํ ์์ค์์ ์ ํํ ํ ๋ฒ ๋ํ๋ฉ๋๋ค.type ArrayWithoutLast<T, const N: usize> = [T; N - 1];
)N
์ ๋ํ ๊ตฌ์ฒด์ ์ธ ๊ฐ์ ์ ๊ณตํ์ฌ WF์์ ์ฆ๋ช
ํ ์ ์์ต๋๋ค.ArrayWithoutLast
where
์ ์ ํฌํจ"์ด ํ์ํฉ๋๋ค(์: [T; N - 1]: Sized
where [T; N - 1]:
๋จ์ฉํ ์๋ ์์ต๋๋ค(์ค๋์ ๋ฌด์๋๋์? ์์ผ!)where ArrayWithoutLast<T, N>: ...
๋ค์ ํต์ผ ์ฐํ๋ฐ๋ผ์ ์ ๋ฐ์ ์ผ๋ก ์ฐ๋ฆฌ๋ WF ๊ท์น์ ์์กดํ์ฌ ์ฌ์ฉ์์๊ฒ const ํํ์์ "์ ํจ์ฑ ๊ฒ์ฌ"๋ฅผ ๊ฐ์ ํ ์ ์์ง๋ง ์ฌ์ ํ ๋ค๋ฅธ ์ฌํญ์ ๋ํ ํตํฉ์ ์ํ ๊ฒ์
๋๋ค( ArrayWithoutLast
์ ๊ฐ์ ํดํน์ด ํ์ํ์ง ์์ ํฌํจ).
์ธก์ ๋จ์์ ๋ํ ๋ ผ์ ์์ ๋น๋กฏ๋ ์์ ์ง๋ฌธ์ ๋๋ค. ์์์ ๋ํ ์ ๋ค๋ฆญ ์ ํ์ด ์ด์ ์ง์ ์ ์ผ๋ก ์์กดํ์ง ์๋ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น? ์๋ฅผ ๋ค์ด:
struct Foo<T, const N: usize> {
a: T,
// Will such array be "the way" to handle this problem?
// Or do we want some kind of `std:marker::PhantomConstData`? (which can be a simple
// type alias to the same array)
// Or maybe make `PhantomData` to accept constants?
_phantom: [(), N],
}
_ํฌํ : [(), ์],
๋๋ ๋น์ ์ด [(); N]
์ ์๋ฏธ usize
์์๋ง ์๋ํฉ๋๋ค.
๋ชจ๋ const
์ ํ์ ํ์ฉํ๋ ํน๋ณํ marker::PhantomConst
๋ฅผ ๊ฐ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
ํ ... ์ต์ ์๊ฒฌ์ ์ผ๋์ ๋๊ณ RFC๋ฅผ ๋ค์ ์ฝ์ผ๋ฉด์ ๊ถ๊ธํฉ๋๋ค. ์ด์ ๊ฐ์ ๊ฒ์ด ํ์ฉ๋ ๊น์?
struct Foo<T, const V: T> {
_phantom: PhantomConst<T, V>,
}
๋๋ ๊ทธ๊ฒ์ด ์ด๋์์๋ ๊ธ์ง๋๋ ๊ฒ์ ๋ณผ ์ ์์ง๋ง ์ต์ํ ์๋ฅผ ๋ค์ด์ผํ๋ค๊ณ ์๊ฐํ์ ๊ฒ์ ๋๋ค.
@Ekleog : ๋ด๊ฐ ์๋ ํ, const ๋งค๊ฐ๋ณ์ ์ ํ์ ์ฒ์์๋ ์ ํ ๋งค๊ฐ๋ณ์์ ์์กดํ์ง ์์ ์ ์์ต๋๋ค(ํ์ฅ์๋ ํ์คํ ์๋ฏธ๊ฐ ์์ง๋ง). (์ด๋ฅผ ํ์ฉํ๋ฉด ๊ตฌํ์ด ๋ ๊น๋ค๋ก์ฐ๋ฏ๋ก ๊ฐ์ฅ ๊ฐ๋จํ ๋ฒ์ ๋ถํฐ ์์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.)
์ด์ ๋ํ ์งํ ์ํฉ์ ์ด๋ป์ต๋๊น? ์ด๊ฒ์ด ์ผ๊ฐ์ ๋ฐ์ํด์ผ ํ๋ ๋๋ต์ ์ธ ์๊ฐ์ ์๊ณ ์์ต๋๊น?
@Zauberklavier ์ด pull ์์ฒญ ์ด ์๋ฃ๋๋ ์ฆ์. ๊ทธ๊ฒ์์ ์ธ์ฉํ๋ ค๋ฉด :
๊ฐ ๊ธธ์ด ๋ฉ๋ค
@newpavlov ํ๋์์ ์ฌ์ฉํ์ง ์๊ณ ์์ ๋งค๊ฐ๋ณ์๊ฐ ํ์ฉ๋ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ์ต๋๋ค.
์ ํ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ด์ ๋ ๋ถ์ฐ ๋๋ฌธ์ด์ง๋ง ์์์๋ ์ด ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
@eddyb ๊ทธ๊ฒ์ RFC ํ ๋ก ์์๋ ๊ธฐ์ต๋๋ ๊ฒ์ ๋๋ค.
@varkor ์ฆ, @cuviper ๊ฐ ์ ์ํ PhantomConst
๋ ์ด RFC์ ํ์ฌ ์ํ์์ ์กด์ฌํ ์ ์์ต๋๋ค. ๊ทธ๋ ์ฃ ? ์ต์ ์๊ฒฌ์ ์ด์จ๋ PhantomConst
๊ฐ ํ์ํ์ง ์๋ค๊ณ ์ง์ ํ๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค.
const ๋งค๊ฐ๋ณ์๋ ๊ด๋ จ๋ ์ ํ ๋งค๊ฐ๋ณ์์ ๋ถ์ฐ์ ์ํฅ์ ์ค๋๊น?
ํ์ฌ ๋๋ const ์ ๋ค๋ฆญ์ด ํด๋น ์ ํ์ ์ ํ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ง ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ์ด๊ฒ์ ์ฒซ ๋ฒ์งธ ์์ ๋ฒ์ ์ด ๋ฌด์์ ํ ์ ์์์ง ๋ช ํํ์ง ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ์ด ์ฃผ์์ ์ฝ๋๊ฐ ์ปดํ์ผ๋๋์ง ์ฌ๋ถ:
https://github.com/rust-lang/rfcs/pull/2581#discussion_r230043717
ํด๋น ์ฝ๋๊ฐ ์ปดํ์ผ๋๋ฉด ๊ตฌ๋ฌธ์ ์ป๊ธฐ ์ ์ ์์์ ๋ํ ์ ์ฝ ์กฐ๊ฑด์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ด ๋ ๊ฒ์ ๋๋ค.
@rodrimati1992 ์๋ง ๋ณ๋์ ํ์
์์ด (): IsTrue<{N < 128}>
๋ง ํ์
๋ ๋ฉ๋๋ค.
์ ์ฝ ์กฐ๊ฑด์ ์ฌ์ฌ์ฉํ๊ณ ์ค์ ๋ก ์๋ํ๋๋ก ํ์๊ฒ ์ต๋๊น? ( N < 128
ํํ์์ ๋ณต์ฌํ๋ฉด ์ฒ์์๋ ์๋ํ์ง ์๊ธฐ ๋๋ฌธ์)
trait Lt128<const N: usize> = IsTrue<{N < 128}>;
์ฌ์ฉํ ์ ์์ต๋๋ค.
where [(); 128 - N],
๋ผ๊ณ ์ฐ๋ ์ต์
๋ ์์ต๋๋ค.
@rodrimati1992 ์๋ง ๋ณ๋์ ํ์ ์์ด
(): IsTrue<{N < 128}>
๋ง ํ์ ๋ ๋ฉ๋๋ค.
์ ์ฝ ์กฐ๊ฑด์ ์ฌ์ฌ์ฉํ๊ณ ์ค์ ๋ก ์๋ํ๋๋ก ํ์๊ฒ ์ต๋๊น? (N < 128
ํํ์์ ๋ณต์ฌํ๋ฉด ์ฒ์์๋ ์๋ํ์ง ์๊ธฐ ๋๋ฌธ์)
trait Lt128<const N: usize> = IsTrue<{N < 128}>;
์ฌ์ฉํ ์ ์์ต๋๋ค.
where [(); 128 - N],
๋ผ๊ณ ์ฐ๋ ์ต์ ๋ ์์ต๋๋ค.
๋ฐ๋ผ์ ํน์ฑ ๋ณ์นญ์ ์ฌ์ฉํ์ฌ ๋ค์ ์์ฑํ ์ ์๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
trait AssertLessThan128<const N:usize>=
Assert<{N<=128}, (
Str<"uint cannot be constructed with a size larger than 128,the passed size is:",
Usize<N>>
) >;
Assert๋ฅผ ์ฌ์ฉํ ์์ด๋์ด
(Str<"uint cannot be constructed with a size larger than 128,the passed size is:",Usize<N>>)
์ปดํ์ผ ํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ด์ ๋ฅผ ์ค๋ฅ ๋ฉ์์ง์์ ์๋ ค์ฃผ๊ธฐ ๋๋ฌธ์ where [(); 128 - N],
๋ณด๋ค ๋ ๋์์ด ๋ ๊ฒ์ผ๋ก ๊ธฐ๋ํฉ๋๋ค.
์์์์ if !(N < 128) { panic!("...") }
๋ฅผ ์ํํ ์๋ ์์ต๋๋ค. ์ ์๊ฐ์๋?
const trait
์ ์ฝ ์กฐ๊ฑด(๋๋ ์ด์ ์ ์ฌํ ๊ฒ)์ด ๋์ฐฉํ ๋๊น์ง std::fmt ์ํคํ
์ฒ๊ฐ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
์ด๋ฅผ ํตํด ์ฌ๋ฌ ๊ฐ์ด ํฌํจ๋ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค(์ ํ์ ํฌํจ๋จ).
์คํ ๊ฐ๋ฅํ ์์ ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด ๋ ์ฌ์ธ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ const ์ ๋ค๋ฆญ์ด ์ด์ ๋ํด ์ด์ผ๊ธฐํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ด ๋ ๋์ ์๋ ์์ต๋๋ค.
@rodrimati1992 ์ฐธ์กฐ https://github.com/rust-lang/rfcs/blob/master/text/2345-const-panic.md , const panic!()
๋ฐ๊ธฐ ์ ์ ํน๋ณํ ๊ฒฝ์ฐ๊ฐ ์์ ๊ฒ์
๋๋ค. ๋ค๋ฅธ ๊ธฐ๋ฅ์ ํตํด ๊ฐ๋ฅํฉ๋๋ค(์ฒ์์๋ ๊ฐ์ ์ฌ์ฉ์ ์ง์ ํ์์ ํ์ฉํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค).
@rodrimati1992 ์,
์ด ์ํ๋ ์ด๋ป์ต๋๊น?
๋ค์ ๋จ๊ณ๋ ์ฌ์ ํ https://github.com/rust-lang/rust/pull/53645 AFAIK์ ๋๋ค.
์ด๊ฒ์ ๋ง์ต๋๋ค. PR #53645๋ฅผ ๋ฐ๋ฅด์ง ์๋ ์ฌ๋๋ค์ ์ํด ๋น ๋ฅธ ์ ๋ฐ์ดํธ๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด const ์ ๋ค๋ฆญ์ ์ต์ํ ํ๋์ ๊ฐ๋จํ ์ฌ์ฉ ์ฌ๋ก์์ ์ปดํ์ผ ๋ฐ ์๋ํฉ๋๋ค. ๋จ์ ์๋ ๊ฒ์ arrys์ const ์ ๋ค๋ฆญ๊ณผ ์ผ๋ถ ์ค๋ฅ ์ถ๋ ฅ ์ ๋ฆฌ๋ฅผ ํฌํจํ์ฌ ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก์ ๋ํ codegen์ ๋ง๋ฌด๋ฆฌํ๋ ๊ฒ์ ๋๋ค. ๊ทธ ํ, PR์ ๋ณํฉ ์ค๋น๊ฐ ๋์ด ์์ด์ผ ํ๊ณ ์ฌ๋๋ค์ ๊ทธ๊ฒ์ ๊ฐ์ง๊ณ ๋ ์ ์์ต๋๋ค.
์ฃผ์ ์์ ๋ฒ์ด๋ ์ ์์ง๋ง ์ฒญํฌ ๋ฐ ๊ด๋ จ ๋ฉ์๋์ ๋ณํ ๋๋ ํฌํฌ๊ฐ Item
์ฌ๋ผ์ด์ค ๋์ ์ปดํ์ผ ์๊ฐ ๊ณ ์ ํฌ๊ธฐ ๋ฐฐ์ด์ด ๋๋๋ก ํ์ฉํฉ๋๊น? ์ด๋ ๊ฒ ํ๋ฉด for
๋ฃจํ๊ฐ ํ์ฌ ์คํจํ๋ for (first, second) in arr.chunks(2)
์ ๊ฐ์ ๋ณ์์ ์ฒญํฌ์ ์์๋ฅผ ๋งคํํ๋ ๋ฐ๋ฐํ ์ ์๋ ํจํด์ผ๋ก ๊ตฌ์กฐํ/๋ฐ์ธ๋ฉํ ์ ์์ต๋๋ค. ๋ฌผ๋ก ) ํน์ ์ฌ์ฉ ์ฌ๋ก์์ ๋ ๋ง์ ์ต์ ํ๋ฅผ ํ์ฉํ ๊ฒ์
๋๋ค.
๋น์ ์ ์๊ฐ ๋ ์ @jeffvandyke ChunksExact ํนํ. ์ด๋ฌํ ๋ณ๊ฒฝ์ API ์ค๋จ์ด๋ฏ๋ก ์ํํ ์ ์์ต๋๋ค. ๋ฏธ๋์ ๋ฐฐ์ด ์ฐธ์กฐ๋ฅผ ์ ๊ณตํ๋ ์ API๋ฅผ ์ถ๊ฐํ ์ ์์ง๋ง ๊ธฐ์กด API๋ฅผ ์ค๋จํ ์๋ ์์ต๋๋ค.
๋น์ ์ ์๊ฐ ๋ ์ @jeffvandyke ChunksExact ํนํ. ์ด๋ฌํ ๋ณ๊ฒฝ์ API ์ค๋จ์ด๋ฏ๋ก ์ํํ ์ ์์ต๋๋ค. ๋ฏธ๋์ ๋ฐฐ์ด ์ฐธ์กฐ๋ฅผ ์ ๊ณตํ๋ ์ API๋ฅผ ์ถ๊ฐํ ์ ์์ง๋ง ๊ธฐ์กด API๋ฅผ ์ค๋จํ ์๋ ์์ต๋๋ค.
ChunksExact
๋ฐ ๊ทธ ๋ณํ ์ธ์๋ ์ด๋ฌํ API๋ฅผ ์ถ๊ฐํ๋ PR์ ์ ์ํ๊ธฐ ์ ์ ์ด๊ฒ์ด ๊ตฌํ๋๊ณ ์์ ํ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค. :)
๋ฐํ์ ๋ฐ ์ปดํ์ผ ์๊ฐ ๋ณํ์๋ ๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ผ๋ฏ๋ก ๋ฏธ๋ฆฌ ์ฒญํฌ ํฌ๊ธฐ๋ฅผ ์ ์๋ ์์ต๋๋ค. ์ต์ ํ์ ๊ด๋ จํ์ฌ ChunksExact
๋ฅผ ์์์ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋ด ํ
์คํธ์ ๋ฐ๋ฅด๋ฉด ๊ฑฐ์ ๋์ผํด์ผ ํฉ๋๋ค. ์ปดํ์ผ๋ฌ๋ ๋ชจ๋ ๊ฒฝ๊ณ ๊ฒ์ฌ๋ฅผ ์ต์ ํํ ์ ์์ต๋๋ค.
๊ตฌํ ๋ฐ ์์ ํ
์ด๋ฌํ API๋ ์์ ํ๋ฅผ ์ํด ์ด ๊ธฐ๋ฅ
impl
๋ธ๋ก์์๋ ์์ง ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์๋ฐ์? ๋๋ ์๋ํ๋ค
#![feature(const_generics)]
struct The<const Val: u64>();
impl<const Val: u64> The<Val> {
fn the() {
println!("{}", Val);
}
}
๊ทธ๋ฌ๋ ์ค์ ๋ก ๊ฒฝ๊ณ ํ๋ฏ์ด ์ปดํ์ผ๋ฌ๋ ๋ค์๊ณผ ๊ฐ์ด ์ถฉ๋ํ์ต๋๋ค.
thread 'rustc' panicked at 'slice index starts at 1 but ends at 0', src/libcore/slice/mod.rs:2419:5
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
stack backtrace:
0: std::sys::unix::backtrace::tracing::imp::unwind_backtrace
1: std::sys_common::backtrace::_print
2: std::panicking::default_hook::{{closure}}
3: std::panicking::default_hook
4: rustc::util::common::panic_hook
5: std::panicking::rust_panic_with_hook
6: std::panicking::continue_panic_fmt
7: rust_begin_unwind
8: core::panicking::panic_fmt
9: core::slice::slice_index_order_fail
10: rustc_resolve::Resolver::resolve_ident_in_lexical_scope
11: rustc_resolve::Resolver::resolve_path
12: rustc_resolve::Resolver::resolve_path_without_parent_scope
13: rustc_resolve::Resolver::smart_resolve_path_fragment
14: rustc_resolve::Resolver::smart_resolve_path
15: <rustc_resolve::Resolver<'a> as syntax::visit::Visitor<'tcx>>::visit_ty
16: syntax::visit::walk_generic_args
17: syntax::visit::walk_ty
18: rustc_resolve::Resolver::with_generic_param_rib
19: rustc_resolve::Resolver::resolve_item
20: rustc_resolve::Resolver::resolve_crate
21: rustc::util::common::time
22: rustc_interface::passes::configure_and_expand_inner
23: rustc_interface::passes::configure_and_expand::{{closure}}
24: <rustc_data_structures::box_region::PinnedGenerator<I, A, R>>::new
25: rustc_interface::passes::configure_and_expand
26: <rustc_interface::queries::Query<T>>::compute
27: <rustc_interface::queries::Query<T>>::compute
28: <rustc_interface::queries::Query<T>>::compute
29: rustc_interface::queries::<impl rustc_interface::interface::Compiler>::prepare_outputs
30: rustc_interface::interface::run_compiler_in_existing_thread_pool
31: <std::thread::local::LocalKey<T>>::with
32: <scoped_tls::ScopedKey<T>>::set
33: syntax::with_globals
์ด ์ค๋ฅ๋ impl<const Val: u64>
์ const
์ ๊ด๋ จ์ด ์์ต๋๋ค. ํด๋น ๋ถ๋ถ์ ์ ๊ฑฐํ๋ฉด ๋ค๋ฅธ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง๋ง ์ถฉ๋์ ๋ฐ์ํ์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค.
๊ทธ๋ฌ๋ ์ด ๊ธฐ๋ฅ์ ๊ณ ๋ คํ๋๋ผ๋ Rust์ ๋์์ด ๋ฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์๋ํ๋์ง ์ ํ ๋ชฐ๋์ง๋ง ๊ตฌ๋ฌธ์ด ์์ฐ์ค๋ฌ์ ๋ณด์๊ณ ๊ทธ๊ฒ์ ์ํด ๊ฐ๊ณ lo rustc๋ ๊ทธ๊ฒ์ด ์กด์ฌํ๋ค๊ณ ๋งํ์ต๋๋ค :)
๋๋ ์ด๊ฒ์ด ์๋ํ์ง ์๋๋ค๋ ์ฌ์ค์ ๋๋ผ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ๋งํ๋ ๋์ ์ด ๋จ๊ฒ๊ฒ ๊ธฐ๋๋๋ ๊ธฐ๋ฅ์ด ์ฌ์ ํ ์ปดํ์ผ๋ฌ๋ฅผ ํตํด ์ฐ๊ฒฐ๋๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ค(์: #59008 ๋ฐ #58581 ๋ฐ PR์ด ๋๋ฌด ์ปค์ ์ค๋จ๋ #53645์ ๋ํ ์ด์ ์์ ์ฐธ์กฐ). , ๊ทธ๋ฌ๋ ์งํ ์ํฉ์ ์๋ฆฌ๊ธฐ ์ํ ์ถ์ ๊ธฐ๋ก ๊ณ์ ์ด๋ ค ์์).
๊ทธ๋ฌ๋ ํ์ฌ ๊ตฌํ ์คํ ์์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์ฌ๋ผ์ด์ค ์ก์ธ์ค๋ฅผ ์์ํด์ผ ํ๋์ง ํ์คํ์ง ์์ต๋๋ค. @varkor @yodaldevoid , ๋ณผ ์ ์์ต๋๊น?
์, ๊ฒฝ๊ณ ๊ฐ ๋ง์ต๋๋ค. const ์ ๋ค๋ฆญ์ ์์ง ์ด๋ค ํํ๋ก๋ ์๋ํ์ง ์์ต๋๋ค. ๊ฐ์ง๊ณ ๋ ์ค๋น๊ฐ ๋๊ธฐ ์ ์ ์์ง ๋ช ๊ฐ์ง ํ ๋ฆฌํ์คํธ๊ฐ ๋ ์์ต๋๋ค.
์ง๋ฌธ์ ํ ์ ์๋ ์ ์ ํ ์ฅ์๊ฐ ์๋ ๊ฒฝ์ฐ ์ฃ์กํ์ง๋ง ์ด๋ณด๋ค ๋ ์ข์ ๊ณณ์ ์ฐพ์ ์ ์์์ต๋๋ค. ์ง๋ฌธ 2๊ฐ:
๋จ์ผ ํจ์๊ฐ ์กฐ๊ฑด๋ถ๋ก const์ผ ์ ์์ต๋๊น? ์๋ฅผ ๋ค์ด, ํจ์์๋ ๋ค์๊ณผ ๊ฐ์ 2๊ฐ์ ์๋ช ์ด ์์ ์ ์์ต๋๋ค.
const fn foo<A: const T>(x: T) // `A` const implements `T`
fn foo<A: T>(x: A) // `A` implements `T` normally
์ด ๊ฒฝ์ฐ foo
๋ const iff A: const T
. A
๊ฐ const ๊ตฌํ T
A
ํ์ง ์์ผ๋ฉด ์ฌ์ ํ ๊ฒฝ๊ณ๋ฅผ ์ถฉ์กฑํ์ง๋ง foo
๋ ๋ ์ด์ const๊ฐ ์๋๋๋ค. ์์ฑ์๊ฐ ๋ ๋ณต์กํ ์์ (์: where A::Output : Bar
)์ ๋ํ ์ผ๋ฐ ๊ฒฝ๊ณ๋ฅผ ์ง์ ํ ์ ์๋ ๊ฒ๋ ์ค์ํฉ๋๋ค. ์ด๊ฒ์ ์ข์ ์๋ ๊ฐ๋จํ ์ฐ์ ์
๋๋ค.
// This only accepts types that const implement `T`
const fn square_const<T: const Mul>(x: T) -> T {
x*x
}
// This accepts types that implement `T` any way, but it is not const
// This function behaves identically to `square_const`
// But has a different signature and needs a different name
fn square<T: Mul>(x: T) -> T {
square_const(x)
}
let a: u8 = 5;
let b: FooNumber = FooNumber::new();
square_const(a); // `u8` const implements Mul
square(b); // `FooNumber` implements `Mul` normally, so we need a separate function?
๋๋ ์ด๊ฒ์ ํ์คํ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ด์ผ ํ๋ค๊ณ ๊ฐํ๊ฒ ๋๋ผ๋ฉฐ, RFC์ ์ธ๊ธ๋์ง ์์๋ค๋ ์ฌ์ค์ ๋๋์ต๋๋ค(์ ๊ฐ ๋์น ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด?).
_[๋ ์ค์ํจ]:_ ์ฐ๋ฆฌ๊ฐ ์ปดํ์ผ ํ์์ ์คํ ์ค์ธ์ง ์คํ ํ์์ ์คํ ์ค์ธ์ง ์ฌ๋ถ๋ฅผ const ํจ์์ ๋ณธ๋ฌธ์์ ๊ฐ์งํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? ๋๋ฒ๊น
์ธ์ ๋ค๋ฅธ ์ด์ ๊ฐ ์๋ค๋ฉด cfg!()
์ ์ ์ฌํ ์ผ๋ถ ๋งคํฌ๋ก๊ฐ ์ ์ฉํ ํ์ฅ์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. cfg!()
๋ ํ์ฌ ์ด๋ฏธ ์ปดํ์ผ ํ์์ ํ๊ฐ๋๊ณ ์์ผ๋ฏ๋ก ๊ทธ ํจ์๊ฐ const๋ก ์ฌ์ฉ๋๋์ง ์๋๋ฉด ์ผ๋ฐ ํจ์๋ก ์ฌ์ฉ๋๋์ง ์ฌ๋ถ๋ ์ปดํ์ผ ์ ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์ ์ ์ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค(/์ถ์ธก). -์๊ฐ. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ฒซ ๋ฒ์งธ ์ง๋ฌธ๋ณด๋ค ๋ ์ค์ํฉ๋๋ค.
@์ฝ๋-256
@Coder-256 ์ด ๋ ์ง๋ฌธ์ ๋ชจ๋ const ์ ๋ค๋ฆญ์ด ์๋๋ผ const ํจ์์ ๊ด๋ จ์ด ์์ต๋๋ค. Const ์ ๋ค๋ฆญ์ ์ปดํ์ผ ํ์์ ์คํํ ์ ์๋ ํจ์๊ฐ ์๋๋ผ const(์: foo<2>()
)์ ๋ํ ์ ๋ค๋ฆญ์
๋๋ค. ์ด๊ฒ์ด RFC 2000์์ ๊ทํ์ ์ง๋ฌธ์ ๋ํ ๋ต๋ณ์ ์ฐพ์ง ๋ชปํ ์ด์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@rpjohnst ๊ฐ์ฌํฉ๋๋ค๋ง ์ ๊ฐ ๋ถ๋ช ํํ์ ์๋ ์์ต๋๋ค. ๋๋ ์ด๋ฏธ rust-lang/rfcs#2632์ rust-lang/rfcs#2000์ ๋ชจ๋ ๋ณด์์ง๋ง ์ด๋ ์ชฝ์์๋ ์ธ๊ธ๋์ง ์์๋ค๊ณ ํ์ ํฉ๋๋ค. (๊ทธ๋ฌ๋ ๋ด๊ฐ ํ๋ฆด ์ ์์ต๋๊น?) ๋ด๊ฐ ๋ฌป๋ ๊ฒ์ ์กฐ๊ฑด๋ถ๋ก const ํจ์์ ๋๋ค. ์ค๋ช ํ๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ์ ๊ฐ ์์ฑํ ์์ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
@yodaldevoid ์
๋งคํฌ๋ก ์ง๋ฌธ์ ๊ดํด์๋ ์ง๊ธ ์๊ฐํด๋ณด๋ฉด ๋ณ๋ก ์ธ๋ชจ๊ฐ ์๋ค๋ ๋ฐ ๋์ํฉ๋๋ค.
๋ด๊ฐ ๋ฌป๋ ๊ฒ์ ์กฐ๊ฑด๋ถ๋ก const ํจ์์ ๋๋ค. ์ค๋ช ํ๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ์ ๊ฐ ์์ฑํ ์์ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
square_const
์ ์๋ square
๋์ ์ฌ์ฉํ ์ ์์ต๋๋ค(์ฆ, ๋ฐํ์ ์ ๋๋ฑํ ์๋ช
์ด ์๋ ํจ์๋ก ๊ฐ์ ๋ณํ๋จ). ์ด ๋์์ ๋ํ ๋
ผ์๋ https://github.com/rust-lang/rfcs/pull/2632 ๋ฅผ ์ฐธ์กฐ const fn
์ ํน์ฑ ๊ฒฝ๊ณ ๊ฐ์ ์ํธ ์์ฉ์ ๋ํด ์ง๋ฌธํ๊ธฐ์ ์ ํฉํ ๊ณณ์
๋๋ค).
@varkor ๋๋ ๊ทธ๊ฒ์ด ์ฌ์ค์ธ์ง ํ์ ํ์ง
์ถฉ๋ ๋ณด๊ณ ์:
์ํธ:
#![feature(const_generics)]
use std::marker::PhantomData;
struct BoundedU32<const LOWER: u32, const UPPER: u32> {
value: u32,
_marker: PhantomData<(LOWER, UPPER)>,
}
์ปดํ์ผ๋ฌ:
thread 'rustc' panicked at 'slice index starts at 1 but ends at 0', src/libcore/slice/mod.rs:2419:5
note: Run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
error: internal compiler error: unexpected panic
note: the compiler unexpectedly panicked. this is a bug.
note: we would appreciate a bug report: https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.md#bug-reports
note: rustc 1.35.0-nightly (719b0d984 2019-03-13) running on x86_64-unknown-linux-gnu
note: compiler flags: -C codegen-units=1 -C debuginfo=2 --crate-type lib
note: some of the compiler flags provided by cargo are hidden
error: Could not compile `playground`.
To learn more, run the command again with --verbose.
@Jezza : const ์ ๋ค๋ฆญ์ ์์ง ์์ ํ ๊ตฌํ๋์ง ์์์ผ๋ฉฐ ์๋ํ์ง ์์ ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค. #![feature(const_generics)]
์คํ์ ์์ํ ๋๊ฐ ๋๋ฉด ์๋ ค๋๋ฆฌ๊ฒ ์ต๋๋ค(์ด ํธ๋ฅผ ๊ตฌ๋
ํ๋ฉด ์๋ฆผ์ ๋ฐ๊ฒ ๋ฉ๋๋ค).
@varkor ์ ์๋ง์, @Jezza ์ ์์ ์๋ _marker: PhantomData<(LOWER, UPPER)>
๊ฐ ์์ต๋๋ค. ๋ ๊ฐ์ const
๋งค๊ฐ๋ณ์๊ฐ ์ ํ์ผ๋ก ์ฌ์ฉ๋๋๋ฐ rustc_resolve
์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
์ข์ ์ : ๋๋ ์ด๊ฒ์ ์กฐ์ฌํ ๊ฒ์ด๋ค. ์ด๊ฒ์ #![feature(const_generics)]
์ ๋ฌธ์ ์ผ ๋ฟ์ด๋ฏ๋ก ์ค์ํ ๋ฌธ์ ๋ ์๋๋๋ค(์ผ๋ฐ์ด ์๋ consts๋ฅผ ์ฌ์ฉํ๋ฉด ์์๋๋ก ์ค๋ฅ๊ฐ ๋ฐ์ํจ). rustc_resolve
๋๋ฌํ์ง ์์ ์๋ ์์ต๋๋ค.
~ @eddyb : ์ด ICE๋ resolve_ident_in_lexical_scope
์์ ์ค๊ณ ์์ผ๋ฏ๋ก ์๋ง๋ https://github.com/rust-lang/rust/issues/58307 ๊ณผ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.~
ํธ์ง: ์ค์ ๋ก๋ ์๋ ์๋ ์์ต๋๋ค. macro_rules!
์๋ง ์ ์ฉ๋๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ต์ํ:
#![feature(const_generics)]
struct S<const C: u8>(C);
"์์๋ ์ ํ, ๋ฐ๊ฒฌ๋ ๊ฐ" ์ค๋ฅ ๋ฅผ ์์ฑ ๋ฅผ ํด๊ฒฐํ์ญ์์ค.
์ธ๋ฑ์ค๋ ์ฌ๊ธฐ์์ ๋ฒ์ด๋ฌ์ต๋๋ค.
https://github.com/rust-lang/rust/blob/master/src/librustc_resolve/lib.rs#L3919
ํ์ฌ ์ผ๊ฐ์ ๋ค์ ์ฝ๋์ ๋ํด " N
๋งค๊ฐ๋ณ์๊ฐ ์ฌ์ฉ๋์ง ์์"์ ์์ฑํฉ๋๋ค.
struct Foo<const N: usize> { }
์ด์ ํ ๋ก ์์ ๋๋ ์ปดํ์ผ์ด ์ด ์ฝ๋๋ฅผ ๋ฐ์๋ค์ฌ์ผ ํ๋ค๊ณ ์๊ฐํ์ต๋๋ค. ๋จ์ํ ๋ฏธ์์ฑ ๊ตฌํ์ ์ธ๊ณต๋ฌผ์ ๋๊น?
@newpavlov ์ผ๋ฐ ์ ํ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. PhantomData<n>
ํ ์ ์์ด์ผ ํฉ๋๊น?
์ด๋ฏธ PhantomData<[(); N]>
๊ฒ์ด ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํฉ๋๋ค. AFAIU PhantomData
์ ์์ ์ ๋ถ์ฐ์ ํ์ํ๋ ๊ฒ์ด๊ณ AFAIU์๋ ๋ถ์ฐ wrt์ ๋ํ ๊ฐ๋
์ด ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์ค์ ๋ก ์ํํ๊ณ ์ถ์ ๊ฒ์ธ์ง ํ์คํ์ง ์์ต๋๋ค. const ์ ๋ค๋ฆญ ๋งค๊ฐ๋ณ์.
N ์ด usize
์ ํ์ผ ๋๋ง ์๋ํฉ๋๋ค.
์ฐ๋ฆฌ๋ RFC ํ ๋ก ์ค์ const ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๋ค๊ณ ๊ฒฐ์ ํ์ผ๋ฉฐ ํ์ฌ ๊ตฌํ์ ๋ฒ๊ทธ์ ๋๋ค.
@withoutboats ๋ช ์๋ RFC์ ์์น๋ฅผ โโ์ง์ ํ ์ ์์ต๋๊น? ๋๋ ๊ทธ ํจ๊ณผ์ ๋ํ ๋ฌด์ธ๊ฐ๋ฅผ ์ฐพ์ผ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ๊ทธ๊ฒ์ ๋์ณค์ ๊ฒ์ ๋๋ค.
RFC ํ ์คํธ์ ํฌํจ๋์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@withoutboats ๋ ผ์๋ ๋ถ๋ถ์ ์ง์ ํด ์ฃผ์๊ฒ ์ต๋๊น? ๋๋ RFC PR์ ํตํด ํธ๋กค๋งํ์ง๋ง, ๊ทธ๊ฒ์ ๋์๊ฒ ํ์ด๋์ค์ง ์์๋ค.
@yodaldevoid ์ด ์๊ฒฌ์ ์ด์ ์ ์ฐธ์กฐ๋์์ต๋๋ค: https://github.com/rust-lang/rust/issues/44580#issuecomment -419576947 . ๊ทธ๋ฌ๋ RFC PR์ด ์๋๋ผ ์ด ๋ฌธ์ ์ ๊ดํ ๊ฒ์ ๋๋ค.
๋ช ๋ ์ ์ ๋๊ธ ๊ธฐ๋ก์ ํ์ด๋ณผ ์๋ ์์ง๋ง ์ค๋ช ํ ์ ์์ต๋๋ค. ์ ํ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋น ๋งค๊ฐ๋ณ์์ ๋ถ์ฐ์ ๋ํด ์๊ฐํ ์ ์์ต๋๋ค(IMO๋ ํ์ํ์ง ์์ผ๋ฉฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ณต๋ณ๋์ผ๋ก ์ค์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๋ณ๊ฐ์ ๋ฌธ์ ์ ๋๋ค). Const ๋งค๊ฐ๋ณ์๋ ๋ถ์ฐ๊ณผ ์ํธ ์์ฉํ์ง ์์ผ๋ฏ๋ก ๋๊ธฐ๊ฐ ์์ต๋๋ค.
@HadrienG2 ๊ด๋ จ ๋๊ธ์ ์ฐพ์์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
@withoutboats ๋๋ ๋น์ ์ด ์ด๊ฒ์ ๋ํ ๋ชจ๋ ์๋ ๊ฐ์ ์ฝ๋ฉํธ๋ฅผ ํธ๋กค๋งํ ๊ฒ์ด๋ผ๊ณ ์ ๋ง๋ก ๊ธฐ๋ํ์ง ์์์ต๋๋ค. ๋จ์ง ๋น์ ์ด ๊ทธ๊ฒ์ ์ด๋ฏธ ๊ฐ์ง๊ณ ์๊ธฐ๋ฅผ ํฌ๋งํ์ ๋ฟ์ ๋๋ค.
์ค๋ช ๊ฐ์ฌํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๋ฐฐ์ฐ๋ ค๊ณ ์๋ฌด๋ฆฌ ๋ ธ๋ ฅํด๋ ๋ถ์ฐ์ ๋ํด ๋ด ๋ง์์ ๊ฐ์ ์ ์๋ค๋ ๊ฒ์ ์ธ์ ํด์ผ ํฉ๋๋ค. ์ด ๋ฒ๊ทธ ์์ ์ FIXME ๋ชฉ๋ก์ ์ถ๊ฐํ๊ฒ ์ต๋๋ค.
๋ค์์ const ์ ๋ค๋ฆญ์ ๋ํ ์งํ ์ํฉ์ ์์ฝํ ๊ฒ์ ๋๋ค.
const ์ ๋ค๋ฆญ์ ๋ํ ์์ ์ด ์ ๋๋ก ์์๋๊ธฐ ์ ์ ์ํํด์ผ ํ ๋ช ๊ฐ์ง ๋ฆฌํฉํ ๋ง์ด ์์์ต๋๋ค. @jplatte ๋ https://github.com/rust-lang/rust/pull/45930 ์์ ์์ ์ ์ํํ์ต๋๋ค @jplatte ๋ const ์ ๋ค๋ฆญ์ ์ฃผ์ ๊ตฌํ ์์ ์
@yodaldevoid ์ ๋๋ @jplatte ๊ฐ ์ค๋จํ ๋ถ๋ถ์ ์ง์ด https://github.com/rust-lang/rust/pull/48149 , https://github.com/rust-lang/rust/pull /48452 , https://github.com/rust-lang/rust/pull/48523 , https://github.com/rust-lang/rust/pull/51880.
์ด๋ ๊ฒ ํ๋ฉด const ์ ๋ค๋ฆญ ๊ตฌํ์ด ๋ณธ๊ฒฉ์ ์ผ๋ก ์์๋ ์ ์์ต๋๋ค. ๊ทธ ์ดํ๋ก @yodaldevoid ์ ์ ๋ ๋๋ฆฌ์ง๋ง ํ์คํ const ์ ๋ค๋ฆญ์ ๋ํ ์ง์์ ์ ์ง์ ์ผ๋ก ์ถ๊ฐํ๊ณ ์์ต๋๋ค. https://github.com/rust-lang/rust/pull/58191 , https://github.com/rust-lang/rust /pull/58503 , https://github.com/rust-lang/rust/pull/58581 , https://github.com/rust-lang/rust/pull/58583 , https://github.com/rust -lang/rust/pull/59170 , https://github.com/rust-lang/rust/pull/59355 , https://github.com/rust-lang/rust/pull/59415 , https://github .com/rust-lang/rust/pull/60058 , https://github.com/rust-lang/rust/pull/60280 , https://github.com/rust-lang/rust/pull/60284 ๋ฐ ๋๋ถ๋ถ์ ์ต๊ทผ https://github.com/rust-lang/rust/pull/59008. (์ด๋ค์ ๋๋ถ๋ถ ์ฃผ์ const ์ ๋ค๋ฆญ ํ ์์ฒญ ์์ ๋ถ๋ฆฌ๋์์ต๋๋ค.)
์ง๊ธ ์ํ๋ ์ด๋ป์ต๋๊น? ์ผ๋ถ const ์ ๋ค๋ฆญ ํ
์คํธ๊ฐ ์ด์ ์๋ํฉ๋๋ค ๐๊ทธ๋ฌ๋ ์ฌ์ ํ ์๋ํ์ง ์๋ ํ
์คํธ๊ฐ ์์ผ๋ฉฐ ์ฝ๋ ์ ์ฒด์ ์ฌ์ ํ ํด๊ฒฐํด์ผ ํ๋ FIXME
๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์ด์ ๊ฐ๊น์์ง๊ณ ์์ผ๋ฉฐ ๋์์ ์ํ์ ๋ค๋ฉด ์ฝ๊ฐ์ ์ฑ๊ณผ๊ฐ ์์ ์ ์๋ ๋จ๊ณ์ ์์ต๋๋ค.
FIXME(const_generics)
ํฉ์ด์ ธ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ๋ค์ ํตํด ์์
ํ ๊ณํ์ด์ง๋ง @yodaldevoid ์ ์ ์๊ฒ๋ ์๊ฐ์ด ๋๋ฌด ๋ง์ต๋๋ค. ๋ฐ๋ผ์ ํ๋๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค๊ณ ์๊ฐ๋๋ฉด ๊ณ์ ์งํํ์ญ์์ค(๋น๋ก ๋๊ธ์ ๋ง์ด ๋จ๊ธฐ๊ณ ์ถ์ ์๋ ์์ผ๋ฏ๋ก ๊ทธ๋ ๊ฒ ํ์ง ์์ต๋๋ค. t ์ค๋ณต ๋
ธ๋ ฅ).๋๋ const ์ ๋ค๋ฆญ์ด ์ ์ ํ ํ ์คํธ๋ฅผ ์ํด ์ค๋น๋๊ธฐ ์ ์ ๋๋จธ์ง ๊ตฌํ ๋ฌธ์ ์ค ์ผ๋ถ์ ๋ํ ๊ฐ์๋ฅผ ์์ฑํ์ต๋๋ค.
์๊ฐ์ด ๊ฑธ๋ฆฌ๊ธด ํ์ง๋ง ์ฐ๋ฆฌ๋ ๊พธ์คํ ๋ฐ์ ํด ์์ผ๋ฉฐ ๊ทธ ์๋๋ฅผ ๋ฐ๋ผ๊ฐ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋ง์นจ๋ด ์ ์๋ฆฌ์ ๋จ์ด์ง๊ธฐ ์์ํ๋ ๊ฒ์ ๋ณด๋ ๊ฒ์ ๋๊ธฐ๋ฅผ ๋ถ์ฌํฉ๋๋ค!
์ด ๊ฒ์๋ฌผ @varkor์ ์ํด ๋ช ๋ฌ์ FIXME
์ค ํ๋๋ฅผ ๋ค๋ฃจ๊ณ ์ถ์ต๋๋ค.
@jplatte , @yodaldevoid ๋ฐ @varkor ์ถํํฉ๋๋ค. ์ด๊ฒ์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฌ์ฉ์ ์ ์ Array-like
ํน์ฑ์ ์ ๊ฑฐํ๋ ํฐ ๋จ๊ณ์
๋๋ค.
๊ต์ฐจ ๊ฒ์...
@varkor ํ ์คํธ์ ๊ด๋ จํ์ฌ ์์๋๋ ์์ ์ ์๋ ๊ฒ์ด ๋์์ด ๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด ์ด๊ฒ์ด ์๋ํ์ง ์๋๋ค๋ ์ฌ์ค์ ๋๋์ต๋๋ค. https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=d84ffd15226fcffe02c102edb8ae5cf1
๋ํ FIXME์ ๊ด์ฌ์ด ์๋ ๋ถ๋ค์ ์ํด https://oli-obk.github.io/fixmeh/
@mark-im {}
FOO
์ฃผ์์ ๋ฃ์ด๋ณด์ญ์์ค. ๊ทธ๋ ๊ฒํ๋ฉด ์๋ํฉ๋๋ค.
์ธ์ฉ https://github.com/rust-lang/rfcs/blob/master/text/2000-const-generics.md :
ID ํํ์์ด ์๋ const ๋งค๊ฐ๋ณ์(๋ฐฐ์ด ์ ์ธ)๋ก ํํ์์ ์ ์ฉํ๋ ๊ฒฝ์ฐ ํํ์์ด ๋ธ๋ก ๋ด์ ํฌํจ๋์ด์ผ ํฉ๋๋ค. ์ด ๊ตฌ๋ฌธ ์ ํ์ ์ ํ ๋ด๋ถ์ ํํ์์ ๊ตฌ๋ฌธ ๋ถ์ํ ๋ ๋ฌดํํ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ ํ์ํ์ง ์๋๋ก ํ๋ ๋ฐ ํ์ํฉ๋๋ค.
{expression}
๋ ํํ์์ด ์๋ณ์๋ ๋ฆฌํฐ๋ด์ด ์๋ ๊ฒฝ์ฐ์๋ง ํ์ํ๋ฉฐ ์ด๋ ๋ฒ๊ทธ์
๋๋ค.
๋์ผํ RFC ์ธ์ฉ:
์๋ณ ํํ์: ๋ฒ์ ๋ด์ ์ด๋ฆ์ผ๋ก ๋์ฒดํ๋ ๊ฒ ์ธ์๋ ๋ ์ด์ ํ๊ฐํ ์ ์๋ ํํ์์ ๋๋ค. ์ฌ๊ธฐ์๋ ๋ชจ๋ ๋ฆฌํฐ๋ด๊ณผ ๋ชจ๋ ID๊ฐ ํฌํจ๋ฉ๋๋ค(์: 3, "Hello, world", foo_bar).
:+1: ๊ฐ์ฌํฉ๋๋ค. ๋ฐฉ๊ธ https://github.com/rust-lang/rust/blob/ef9a876f8297e26859469b004047e0946ed10565/src/libsyntax/parse/parser.rs#L6056์ ์ฐพ์์ต๋๋ค.
@mark-im ์, ํ์ฌ ์ฒ์ ๊ตฌ๋ฌธ ๋ถ์ํ ๋ ์ ํ์ ident์ const์ ์ฐจ์ด์ ์ ๊ตฌ๋ถํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด ๋ชจ๋ ๊ฒ์ ๋ฏธ๋์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ฒฐ์ ์ ๋ด๋ฆฌ์ง ์์์ต๋๋ค. ์ง๊ธ์ด ๋ฏธ๋๊ฐ ์๋๊น ์ถ์ต๋๋ค.
์ฝ๊ฐ์ ๋ฐฐ๊ฒฝ ์ง์์ ์ํด ์ด ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ธฐ์ตํ ์ ์๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ํด ์ด์ผ๊ธฐํ์ต๋๋ค. ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ฌ๋๋ค์ด const ์ธ์๋ฅผ ํ์ํ๋๋ก ํ๋ ๊ฒ์
๋๋ค(๊ทธ ์์ const
๋ฅผ ์
๋ ฅํ๊ฑฐ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก). ์ด๊ฒ์ ์ธ์ฒด ๊ณตํ์ ์ธ ๊ด์ ์์๋ ์ข์ง ์์ง๋ง ๊ตฌ๋ฌธ ๋ถ์ ๊ด์ ์์๋ ์ฝ์ต๋๋ค. ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ๋์ค์ ์ปดํ์ผํ๋ ๋์ ์ผ๋ฐ ๋งค๊ฐ๋ณ์์ ํ์ด๋ง์ ์์ํ ๋๊น์ง ๋ชจ๋ ์ผ๋ฐ ์ธ์๋ฅผ ๋์ผํ๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ์๋ง๋ ์ฐ๋ฆฌ๊ฐ ์ทจํ๊ณ ์ ํ๋ ๋ฐฉ๋ฒ์ผ ๊ฒ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ์์
์ด ์ด๋ฏธ ์์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋จ์ง ๋ง์ง๋ง ๋์ฝ์ ํ์ง ์์์ ๋ฟ์
๋๋ค.
๋๋ผ์ด ์ํ. ๊ฐ๋ฅํ๋ค๋ฉด FIXME
์ ์ผ๋ถ๋ฅผ ์์ ํ์ฌ ๊ธฐ๊บผ์ด ๋์๋๋ฆฌ๊ฒ ์ต๋๋ค. ์ ๋ Rustc ์ฝ๋๋ฒ ์ด์ค์ ๋ํ ๊ฒฝํ์ด ๋ง์ง ์์ผ๋ฏ๋ก FIXME https://github.com/rust-lang/rust/blob/master/src/librustc_mir/monomorphize/item.rs# ์์ ์์ํ๊ฒ ์ต๋๋ค. ์ฌ์ธ ๊ฒ
๋ค์ ์ฝ๋๋ ์ด๋ป์ต๋๊น?
trait Foo {
const N: usize;
fn foo() -> [u8; Self::N];
}
ํ์ฌ "ํ์ฌ ๋ฒ์์์ Self
์ ํ์ ๋ํด N
์ด๋ผ๋ ๊ด๋ จ ํญ๋ชฉ์ ์ฐพ์ ์ ์์ต๋๋ค" ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด๋ฌํ ์ฝ๋๋ FIXME
๋ง์น ํ์ ํ์ฉ๋ฉ๋๊น, ์๋๋ฉด ๊ตฌํ์ ์ถ๊ฐ ๋
ธ๋ ฅ์ด ํ์ํฉ๋๊น?
@yodaldevoid
๋น ๋ฅธ ์ง๋ฌธ์ ๋๋ค. ์ด๋ฏธ ๋ ผ์๋ ๋ด์ฉ์ด๋ผ๋ฉด ์ฌ๊ณผ๋๋ฆฝ๋๋ค.
๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ๋์ค์ ์ปดํ์ผํ๋ ๋์ ์ผ๋ฐ ๋งค๊ฐ๋ณ์์ ํ์ด๋ง์ ์์ํ ๋๊น์ง ๋ชจ๋ ์ผ๋ฐ ์ธ์๋ฅผ ๋์ผํ๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ์๋ง๋ ์ฐ๋ฆฌ๊ฐ ์ทจํ๊ณ ์ ํ๋ ๋ฐฉ๋ฒ์ผ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ์์ ์ด ์ด๋ฏธ ์์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋จ์ง ๋ง์ง๋ง ๋์ฝ์ ํ์ง ์์์ ๋ฟ์ ๋๋ค.
์ด๊ฒ์ Rust๊ฐ ํจ์ ๊ตฌํ๊ณผ ๊ด๋ จ๋ ์ค๋ฅ๋ฅผ ์์ฑํ๋ ๊ฒ์ ํผํ๊ธฐ ์ํด ๋ช ์์ ์ผ๋ก ํจ์ ์๋ช ์ ๋ง๋๋ ์์น์ ๋ฐํ๋ ๊ฒ์ ๋๊น? ์๋ง๋ ๋๋ ์ด๊ฒ์ ์์ ํ ์คํดํ๊ณ ์์ผ๋ฉฐ ํจ์ ๋ณธ๋ฌธ ๋ด ์์ ์ผ๋ฐ ๋งค๊ฐ ๋ณ์๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค.
์ด๊ฒ์ Rust๊ฐ ํจ์ ๊ตฌํ๊ณผ ๊ด๋ จ๋ ์ค๋ฅ๋ฅผ ์์ฑํ๋ ๊ฒ์ ํผํ๊ธฐ ์ํด ๋ช ์์ ์ผ๋ก ํจ์ ์๋ช ์ ๋ง๋๋ ์์น์ ๋ฐํ๋ ๊ฒ์ ๋๊น? ์๋ง๋ ๋๋ ์ด๊ฒ์ ์์ ํ ์คํดํ๊ณ ์์ผ๋ฉฐ ํจ์ ๋ณธ๋ฌธ ๋ด์์ ์ผ๋ฐ ๋งค๊ฐ ๋ณ์๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค.
์ด๊ฒ์ ํจ์์ ์ผ๋ฐ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋ ์๋ณ์๊ฐ ์์์ธ์ง ์ ํ์ธ์ง๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ์ ๋๋ค.
์์:
fn greet<const NAME:&'static str>(){
println!("Hello, {}.",NAME);
}
const HIS_NAME:&'static str="John";
greet::<HIS_NAME>();
greet::<"Dave">();
ํจ์๋ฅผ ์ ์ํ ๋ NAME์ด ์์์์ ์ง์ ํด์ผ ํ์ง๋ง ํธ์ถํ ๋ HIS_NAME์ด ํฐ๋ณดํผ์ฌ ์ฐ์ฐ์( ::< >
) ๋ด์์ ์์๋ผ๊ณ ๋งํ ํ์๋ ์์ต๋๋ค.
@zesterer ์ด ์ ์๋ ์๋ฃจ์ ์ด ์ฌ์ฉ์์๊ฒ ํฌ๋ช ํ๊ฒ ๋ง๋ค์ด
@newpavlov ์ฝ๋๊ฐ ์๋ํ์ง ์๋๋ค๋ ์ฌ์ค์ ๋๋์ต๋๋ค. ๋ณ๋์ ๋ฌธ์ ๋ฅผ ์ ์ถํด ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
@yodaldevoid @robarnold
์, ๋น์ ์ ์ป์๋ค. ์ด๊ฒ์ด ์ ํ/ํจ์ ์๋ช ๊ณผ ๊ด๋ จ์ด ์๋ค๊ณ ์๋ชป ๊ฐ์ ํ์ต๋๋ค.
๋ด์ฅ ๋ฐฐ์ด ์ ํ์์ const ์ ๋ค๋ฆญ์ ์ฌ์ฉํ๊ธฐ ์ํด #60466์ ์ด์ด ์ด์ ๋ํ ๋ค๋ฅธ ์ฌ๋๋ค์ ์๊ฒฌ์ ํ์ธํ์ต๋๋ค.
์ํ ๋ธ๋ก์ ํ์ฌ ์์ ํ ๋ถ์์ง ๊ฒ ๊ฐ์ต๋๋ค. ์ด๊ฒ์ ๊ธฐ๋ฅ์ ํ์ฌ ์ํ์์ ์์๋๋ ๊ฒ์ ๋๊น, ์๋๋ฉด ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ์ด์ด์ผ ํฉ๋๊น?
์ํ ๋ธ๋ก์ ํ์ฌ ์์ ํ ๋ถ์์ง ๊ฒ ๊ฐ์ต๋๋ค. ์ด๊ฒ์ ๊ธฐ๋ฅ์ ํ์ฌ ์ํ์์ ์์๋๋ ๊ฒ์ ๋๊น, ์๋๋ฉด ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ์ด์ด์ผ ํฉ๋๊น?
N
, impl<const N: usize> Dummy<{N}> {}
์ฃผ์์ {}
๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
ํ์ง๋ง ์ ํ๋์ง ์์ ๋งค๊ฐ๋ณ์์ ๋ํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์, ๊ณ ๋ง์. ์ค๊ดํธ๋ฅผ ์์ด ๋ฒ๋ ธ์ต๋๋ค!
์ด๊ฒ์ด ํฌ๊ฒ ์ต์ํ๋ ํ ์คํธ ์ผ์ด์ค์๊ธฐ ๋๋ฌธ์ ์ผ๋จ ํด๊ฒฐ๋๋ฉด ์คํจํ๋ ๊ฒ์ด ๋๋์ง ์์ต๋๋ค.
...ํ์ง๋ง ์, ์ด๊ฒ์ ์๋ง๋ ์๋ํด์ผ ํฉ๋๋ค:
#![feature(const_generics)]
trait Dummy {}
struct Vector<const N: usize> {
data: [f32; N],
}
impl<const N: usize> Dummy for Vector<{N}> {}
... E0207์์๋ ์ฌ์ ํ ์คํจํฉ๋๋ค.
warning: the feature `const_generics` is incomplete and may cause the compiler to crash
--> src/lib.rs:1:12
|
1 | #![feature(const_generics)]
| ^^^^^^^^^^^^^^
error[E0207]: the const parameter `N` is not constrained by the impl trait, self type, or predicates
--> src/lib.rs:9:12
|
9 | impl<const N: usize> Dummy for Vector<{N}> {}
| ^ unconstrained const parameter
error: aborting due to previous error
For more information about this error, try `rustc --explain E0207`.
error: Could not compile `small-matrix`.
To learn more, run the command again with --verbose.
... ๊ทธ๋ฆฌ๊ณ ๋๋์ด # 60466์์ "consts ์ ๋ค๋ฆญ์ ๋ํ ๋ฐฐ์ด ์ฒ๋ฆฌ ๋ฌธ์ "์๋ฏธ @varkor ๊ฒ์ ๋๋ค ๊ฐ์ :
#![feature(const_generics)]
fn dummy<const N: usize>() -> [f32; N] {
[0.; N]
}
->
warning: the feature `const_generics` is incomplete and may cause the compiler to crash
--> src/lib.rs:1:12
|
1 | #![feature(const_generics)]
| ^^^^^^^^^^^^^^
error: internal compiler error: cat_expr Errd
--> src/lib.rs:3:44
|
3 | pub fn dummy<const N: usize>() -> [f32; N] {
| ____________________________________________^
4 | | [0.; N]
5 | | }
| |_^
error: internal compiler error: cat_expr Errd
--> src/lib.rs:4:5
|
4 | [0.; N]
| ^^^^^^^
error: internal compiler error: QualifyAndPromoteConstants: Mir had errors
--> src/lib.rs:3:1
|
3 | / pub fn dummy<const N: usize>() -> [f32; N] {
4 | | [0.; N]
5 | | }
| |_^
error: internal compiler error: broken MIR in DefId(0/0:3 ~ small_matrix[5b35]::dummy[0]) ("return type"): bad type [type error]
--> src/lib.rs:3:1
|
3 | / pub fn dummy<const N: usize>() -> [f32; N] {
4 | | [0.; N]
5 | | }
| |_^
error: internal compiler error: broken MIR in DefId(0/0:3 ~ small_matrix[5b35]::dummy[0]) (LocalDecl { mutability: Mut, is_user_variable: None, internal: false, is_block_tail: None, ty: [type error], user_ty: UserTypeProjections { contents: [] }, name: None, source_info: SourceInfo { span: src/lib.rs:3:1: 5:2, scope: scope[0] }, visibility_scope: scope[0] }): bad type [type error]
--> src/lib.rs:3:1
|
3 | / pub fn dummy<const N: usize>() -> [f32; N] {
4 | | [0.; N]
5 | | }
| |_^
thread 'rustc' panicked at 'no errors encountered even though `delay_span_bug` issued', src/librustc_errors/lib.rs:356:17
note: Run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
error: internal compiler error: unexpected panic
note: the compiler unexpectedly panicked. this is a bug.
note: we would appreciate a bug report: https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.md#bug-reports
note: rustc 1.36.0-nightly (cfdc84a00 2019-05-07) running on x86_64-unknown-linux-gnu
note: compiler flags: -C debuginfo=2 -C incremental --crate-type lib
note: some of the compiler flags provided by cargo are hidden
@HadrienG2
#60619 ๋ฐ #60632๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์ด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ด ๋น๋๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=e45b7b5e881732ad80b7015fc2d3795c
๊ทธ๋ฌ๋ ํ์ฌ ์ค๋ฅ:
error[E0119]: MyArray<_, _>
์ ํ์ ๋ํ std::convert::TryFrom<[type error]>
ํน์ฑ ๊ตฌํ ์ถฉ๋:
๋ถํํ๋ ๊ทธ๊ฒ์ Try{From,Into}
์ ์ ํ์ด๋ฉฐ const ์ ๋ค๋ฆญ๊ณผ ์๋ฌด ๊ด๋ จ์ด ์์ต๋๋ค. ๊ทธ๋ค์ ๋ง์ ๊ฒฝ์ฐ์ ์ผ๋ฐ์ ์ผ๋ก ๊ตฌํ ๋ ์ ์์ต๋๋ค ๋์ด ํ์
๊ทํ์ ์์์ @oberien , T
๋ ์ธ๋ ์ ํ์ด๋ฉฐ T: Into<Foo<T>>
๋ณด์ ์ฌ๋ถ๋ ์ ์ ์์ต๋๋ค.
๋ด ์์์๋ [T; N] ์ libcore์ ์ ์๋ ์ ํ์ด๊ณ #[fundamental]
(tbh ๋๋ ์ด๊ฒ์ด ๋ฌด์์ ์๋ฏธํ๋์ง์กฐ์ฐจ ๋ชจ๋ฆ
๋๋ค), ๊ทธ๋์ ๋๋ ํธ๋ ์ ๋ฆฌ์กธ๋ฒ๊ฐ ์ค์ ๋ก [T; N]: Into<MyArray<T, {N}>>
๊ฐ ์ ์ง๋์ง ์๋๋ค๋ ๊ฒ์ ์๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ถฉ๋ํ์ง ์์์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๊น?
[...]์ด๊ณ
#[fundamental]
[...]
์ด๊ฒ์ด ๋ฌธ์ ์
๋๋ค. fundamental
๋ ๋ค์ด์คํธ๋ฆผ ์ฌ์ฉ์๊ฐ ๊ธฐ๋ณธ ๋ํผ ์ ํ์์ ๋ก์ปฌ ์ ํ์ ๋ํํ ๋ ํน์ฑ ๊ตฌํ์ ์ ์ํ ์ ์๋๋ก ํ๋ ๊ฒ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค. ์ด ํ๋ ์ด๊ทธ๋ผ์ด๋ ์์ ๊ตฌํ from
์ ํ์ด fundamental
(ํจ์ฌ ๋ ๋์ ์ค๋ฅ ๋ฉ์์ง์ ํจ๊ป)๋ก ํ์๋๋ฉด ์คํจํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
@varkor @yodaldevoid ๊ทธ๋์ ์ ๋ S<{N == 0}>
( S
๊ฐ const bool
๋งค๊ฐ๋ณ์๋ฅผ ์ทจํ๊ณ N
a const usize
) ๋ ์ปดํ์ผ๋ฌ์ ๊ด์ ์์ S<{true}>
๋๋ S<{false}>
๊ฐ ์๋๋ฉฐ(๋ ์ค ํ๋์ ๋์ผํ ํน์ฑ์ ๊ตฌํํ์ง ์๋๋ค๋ ์๋ฏธ์์) ์ด๊ฒ์ด ๋ฒ๊ทธ์ธ์ง ์๋๋ฉด ํ์ฌ ํ๋กํ ํ์
์ ์์ ํ๊ณ. ํ์ฌ์ ํต์ผ ๋
ผ๋ฆฌ์ ๋ํด ๊ฐ๋จํ ๋ง์ํด ์ฃผ์๊ฒ ์ต๋๊น?
์ต์ํ๋ ์๋ก์, ์ด๊ฒ์ ...
// Machinery for type level if-then-else
struct Test<const B: bool>;
trait IfFn<S, Z> { type Out; }
impl<S, Z> IfFn<S, Z> for Test<{true }> { type Out = S; }
impl<S, Z> IfFn<S, Z> for Test<{false}> { type Out = Z; }
// Returns an u8 if B is true, else an u16
fn should_be_ok<const B: bool>() -> <Test<{B}> as IfFn<u8, u16>>::Out {
0
}
...๋ค์ ์ค๋ฅ๋ฅผ ์์ฑํฉ๋๋ค.
error[E0277]: the trait bound `Test<B>: IfFn<u8, u16>` is not satisfied
--> src/lib.rs:32:1
|
32 | / fn should_be_ok<const B: bool>() -> <Test<{B}> as IfFn<u8, u16>>::Out {
33 | | 0
34 | | }
| |_^ the trait `IfFn<u8, u16>` is not implemented for `Test<B>`
|
= help: the following implementations were found:
<Test<false> as IfFn<S, Z>>
<Test<true> as IfFn<S, Z>>
์ค์ ๋ก๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ๋ฌธ์ ๋ ์ปดํ์ผ๋ฌ๊ฐ 0
๋ฆฌํฐ๋ด์ด u8
์ธ์ง ๋๋ u16
์ธ์ง ๊ฒฐ์ ํ๋ ๋
ผ๋ฆฌ๊ฐ ์๋ค๋ ๊ฒ์
๋๋ค. . 0u8 as _
์ ๊ฐ์ด ์๋ํ์ญ์์ค.
๊ทธ๊ฒ ์๋๋ผ ์ค๋ฅ ๋ฉ์์ง๊ฐ ๋์ผํ๊ฒ ์ ์ง๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ์ ์ ์ ํ ์ถ๋ก ์ ํฌํจํ์ง ์๋ ๋ฒ์ ์ ์ํ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ๋ ์ด๋ฆฌ์์ ์ต์ํ๋ฅผ ์ํํ ์ ์์ต๋๋ค.
struct Test<const B: bool>;
trait Not { const B: bool; }
impl Not for Test<{true }> { const B: bool = false; }
impl Not for Test<{false}> { const B: bool = true; }
fn should_be_ok<const B: bool>() -> bool {
<Test<{B}> as Not>::B
}
Not
๊ตฌํํ์ง ์๋ Test<{B}>
๋ก ์ธํด ์ฌ์ ํ ์คํจํฉ๋๋ค.
์๋
ํ์ธ์ ! const ๊ฐ์ ๋ํ ํตํฉ์ด ์๋ํด์ผ ํ๋์ง ์ฌ๋ถ๋ ํ์คํ์ง ์์ง๋ง ์์
์ค์ด์ง๋ง ํ์ฌ Rustc์์ ์ฌ์ฉํ์ง ์๋ ์๋ก์ด ํตํฉ ์์คํ
("๋ถํ")์ด ์์
์ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ํํ๋ ค๋ ์์
์ ๋ถํ์ด ์ค๋น๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ _ํ ์ ์์ต๋๋ค_. ๊ทธ๋ฆฌ๊ณ ๊ทธ๋์๋ ๋ถํ๋ก ์๋ํ๊ฑฐ๋ ์๋ํด์ผํ๋์ง ํ์ ํ์ง ๋ชปํฉ๋๋ค.
์งํ ์ํฉ์ https://github.com/rust-lang/rust/issues/48049 ๋ฅผ ์ฐธ์กฐ
@HadrienG2 ์ด์ ๋ํด ๋ณ๋์ ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ ์ ์์ต๋๊น? ์ฐ๋ฆฌ๊ฐ ์กฐ์ฌํ๊ณ ์๋ ๋ช ๊ฐ์ง ๋ค๋ฅธ ๋ฌธ์ ๋ก ์ธํด ํ์ฌ ์๋ํ์ง ์๋ ๊ฒ์ด ์์ ํ ๋๋์ง๋ ์์ง๋ง ์ด๊ฒ์ ์๋ก์ด ์ฌ๋ก์ด๋ฉฐ ์ถ์ ํ๊ณ ์ถ์ต๋๋ค.
@carado ํตํฉ์
@HadrienG2 const ์ ๋ค๋ฆญ์ ๋ํ ์ ๋ฌธํ๊ฐ ์์ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
struct Test<const B: bool>;
trait Not { const B: bool; }
impl<const B: bool> Not for Test<B> { const B: bool = false; }
impl Not for Test<{false}> { const B: bool = true; }
fn should_be_ok<const B: bool>() -> bool {
<Test<{B}> as Not>::B
}
๋น์ ์ดํ๊ณ ์ถ์ ๊ฒ์ ํน์ฑ ์์คํ ์ผ๋ก ํ์ฅ ๋ ์ผ์น์ ๊ฐ์ ์ผ์ข ์ ์ฒ ์ ํ ๊ฒ์ฌ์ ๋๋ค. ์ด๋ค ์ค๋ ๋์์๋ ์ธ๊ธ๋๋์ง ๋ชจ๋ฆ ๋๋ค.
@yodaldevoid ํ์ผ ์ https://github.com/rust-lang/rust/issues/61537 ์ ๋๋ค.
@carado Chalk๋ ์ค์ "typesystem primitives"์ ๊ด๋ จ์ด ์์ผ๋ฉฐ ์ด๊ฒ์ด ๊ทธ ์ค ํ๋์
๋๋ค.
์ฆ, rustc
์ฌ์ ํ (Chalk๊ฐ ์ด๋ฏธ ๋ถ๋ถ์ ์ผ๋ก ํตํฉ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ค๋๋ ์๋) Chalk์ ๋ถํฌ๋ช
ํ ์ํฐํฐ(์: ๋ ๊ฐ์ ์๋ก ๋ค๋ฅธ ์์ ํํ์)๋ฅผ ์ฒ๋ฆฌํ๋ ํตํฉ ๋ถ๋ถ์ ๊ตฌํํด์ผ ํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ (์ฐ๋ฆฌ๊ฐ ์ด์จ๋ ์ ๋ํ ๊ฐ๊น์ด ์ฅ๋ ๊ณํ์ ๊ฐ์ง๊ณ ์์ง ์๋) ๊ฒ์ ๊ตฌํํ๋ ๊ฒฝ์ฐ, (๊ทธ ์ฃผ์ ๋ชฉ์ ์ด ์๋ ํต์ผ์
๋๋ค) ์ดํฌ๋ ํน์ฑ ์์คํ
์ ๋์ฒด ํ์๋ ๋ง์ด ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
์ค, ๊ทธ๋ผ ๋์! ์ ๊ฐ ๋ฌด์จ ๋ง์ ํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ๋ ๊ฒ ๊ฐ์์.
const ์ ๋ค๋ฆญ์ด ์ ๊ณตํ๋ ๋ฉ์ง ๊ฒ ์ค ํ๋๋ ์ปดํ์ผ ์๊ฐ์ผ๋ก ๊ณ์ฐ๋๋ ๊ฐ๋จํ ํจ์(์: factorial)์ ๋๋ค.
์์:
fn factorial<const X: i32>() -> Option<i32> {
match X {
i if i < 0 => None,
0 => Some(1),
1 => Some(1),
i => Some(factorial::<i - 1>().unwrap() + i)
}
}
๋ด๊ฐ ์ดํดํ๋ ํ ์ผ๊ฐ์ const ์ ๋ค๋ฆญ์ ๋ํ ์ง์์ด ์ ํ์ ์ ๋๊น? ๊ทธ๋ ๋ค๋ฉด ์ฌ์ฉ ๋ฐฉ๋ฒ๊ณผ ์ฌ๋ฃ๋ฅผ ์ฐพ์ ์ ์๋ ์ด ํธ๋ณด๋ค ๋ ์ ๋ฆฌ๋ ๊ณณ์ด ์์ต๋๊น?
@dancojocaru2000 const
ํจ์๋ ์ปดํ์ผ ํ์์ ๊ฐ ์์ค ๊ณ์ฐ์ ์ ํธ๋๋ ๋ฐฉ๋ฒ์ด์ด์ผ ํฉ๋๋ค(์: https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=4994b7ca9cda0bfc44f535948343137 ). ์์ง ์์ ํ ๊ตฌํ๋์ง ์์๊ธฐ ๋๋ฌธ์ ์๋ํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ ๋ค const
์ ๋ค๋ฆญ์ด ์๋๋๋ค.
match
๊ฐ const
์ธ์์ ๋ํด ์๋ํด์ผ ํ๋์ง ํ์คํ์ง ์๊ธฐ ๋๋ฌธ์ ์ค๋ํซ์ด ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค. ๋ํ ์ฝ๋์์ ๋ง์
๊ณผ ๊ณฑ์
์ ํผํฉํ์ง๋ง ๊ทธ๋ค์ง ์ค์ํ์ง ์์ต๋๋ค.
๋ค๋ฅธ ๊ธฐ๋ฅ ์ธ์ด์ ๋ํ ๋ฐ๋ชจ๋ก ์ข ์ข ํ์๋๋ Peano ์ธ์ฝ๋ฉ์ ์ฌ์ฉํ์ฌ ์ปดํ์ผ ํ์์ ํฉํ ๋ฆฌ์ผ์ ์ด๋ฏธ ์ํํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ปดํ์ผ ์๊ฐ ๊ณ์ฐ ๋จ์ ํจ์
๋ ์ ์ ํ ๊ธฐ๋ฅ์ const fn ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ด๋ก ์ ์ผ๋ก ์ฝ๋๋ ๊ฑฐ์ ๊ทธ๋๋ก ์๋ํฉ๋๋ค.
#![feature(const_generics)]
fn factorial<const X: i32>() -> Option<i32> {
match X {
i if i < 0 => None,
0 => Some(1),
1 => Some(1),
i => Some(factorial::<{X - 1}>().unwrap() + i)
}
}
fn main() {
println!("{:?}", factorial::<10>());
}
ํ์ง๋ง ๊ทธ๋ ์ง ์์ต๋๋ค:
warning: the feature `const_generics` is incomplete and may cause the compiler to crash
--> src/main.rs:1:12
|
1 | #![feature(const_generics)]
| ^^^^^^^^^^^^^^
error: internal compiler error: src/librustc_codegen_ssa/mir/operand.rs:79: unevaluated constant in `OperandRef::from_const`
์ค์ ๋ก unsigned ์ ํ์ ์ฌ์ฉํด์ผ ํ์ง๋ง:
#![feature(const_generics)]
fn factorial<const X: u32>() -> u32 {
match X {
0 => 1,
1 => 1,
_ => factorial::<{ X - 1 }>() + X,
}
}
fn main() {
println!("{:?}", factorial::<10>());
}
์ฌ์ฉ ๋ฐฉ๋ฒ๊ณผ ๋ฌผ๊ฑด์ ์ฐพ์ ์์๋์ด ๋ฌธ์ ๋ณด๋ค ๋ ์ ๋ฆฌ ๋ ๊ณณ์ด ์์ต๋๊น?
๊ทธ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ๋ถ์์ ํ ์ฑ ์ ์ํด ๋ค๋ฃจ์ด ์ง์ง๋ง ์ง๊ธ์ ๊ฑฐ๊ธฐ์ ์ ์ฉํ ๊ฒ์ด ์์ต๋๋ค. ๋นํธ๋ฅผ ๋ฐ๊ฒฌํ๋ฉด ๊ทธ์ ๋ํ ๋ด์ฉ์ ์ค์ผ์นํ๊ธฐ ์์ํ๋ ๊ฒ์ ๊ณ ๋ คํ ์ ์์ต๋๊น?
Peano ์ธ์ฝ๋ฉ์ ์ฌ์ฉํ์ฌ ์ปดํ์ผ ํ์์ ๊ณ์น,
์ด์ ๋ํ ์๋ typenum ํฌ๋ ์ดํธ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์ด๋ก ์ ์ผ๋ก ์ฝ๋๋ ๊ฑฐ์ ๊ทธ๋๋ก ์๋ํฉ๋๋ค.
factorial::<0>
ํธ์ถํ ๋ _ => factorial::<{X - 1}>() * X
๊ฐ ๋๋ฌด ์ฝ๋ ์์ฑ๋์ง ์์ต๋๊น? ๊ทธ๋ฌ๋ ๊ทธ๋ ๊ฒ ํ๋ ค๊ณ ํ๋ฉด ์ ์ ์ธ๋ํ๋ก๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ฏธ๋์ ์ด์ ๊ฐ์ ์ฝ๋๊ฐ ์ปดํ์ผ๋ ๊ฒ์ผ๋ก ๊ธฐ๋ํ ์ ์์ต๋๊น?
#![feature(const_generics)]
trait NeedsDrop<const B: bool> { }
impl<T> NeedsDrop<std::mem::needs_drop<T>()> for T { }
fn foo<D: NeedsDrop<false>>(d: D) { }
์ด๊ฒ์ ์ผ๋ถ์ ์ต๊ทผ์ ๊ตฌํ๊ณผ ๊ต์ฐจ๋์ด [T; N]
์ ๋ํ ๋ฐฐ์ด N <= 32
const๋ฅผ ์ ๋ค๋ฆญ์ผ๋กํ์ง๋ง, ๋ค์ ์ฝ๋๋ (์ต์ ์์ ์ปดํ์ผ๋์ง ์์ต๋๋ค 4bb6b4a5e 2019-07-11
๋ค์ํ ์ค๋ฅ์ ์ผ๊ฐ) the trait `std::array::LengthAtMost32` is not implemented for `[u64; _]`
#[derive(Copy, Clone, PartialEq, Eq)]
pub struct BigintRepresentation<
const N: usize
>(pub [u64; N])
where [u64; N]: std::array::LengthAtMost32,
[u64; N*2]: std::array::LengthAtMost32;
๋ค์์ด ์ํ๋์ง๋ง:
#[derive(Copy, Clone, PartialEq, Eq)]
pub struct BigintRepresentation<
const N: usize
>(pub [u64; N])
where [u64; N]: std::array::LengthAtMost32;
N*2
์ด ์ด๋ฌํ ์ ์ฝ ์กฐ๊ฑด์ ๋ํ ์ ํจํ const ๋๋ ํ์ ์๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
@shamatar N*2
๋ `[u64; {N*2}]
"๊ตฌํ๋์ง ์์ ํน์ฑ" ์ค๋ฅ๋ [u64; {N*2}]
๋ํ ๊ฒฝ๊ณ๋ฅผ ์ถ๊ฐํ์ง ์๋ ํ์ ๋งคํฌ๋ก์์ ๋ฐ์ํ๋ค๊ณ ์๊ฐํ์ง๋ง ํ์์ด ์ ๊ฑฐ๋๋ฉด ํ์ฌ ICE๊ฐ ์์ต๋๋ค.
```์ค๋ฅ: ๋ด๋ถ ์ปดํ์ผ๋ฌ ์ค๋ฅ: ์ ํ์ ์์์ ๋ฌด์๋ ์ค๋ฅ๊ฐ ์์ต๋๋ค: TooGeneric
--> src/main.rs:5:1
|
5 | / pub ๊ตฌ์กฐ์ฒด BigintRepresentation<
6 | | const N: ์ฌ์ฉ
7 | | >(ํ [u64; N])
8 | | ์ฌ๊ธฐ์ [u64; N]: ํ์ค::๋ฐฐ์ด::๊ธธ์ดAtMost32,
9 | | [u64; {N*2}]: ํ์ค::๋ฐฐ์ด::๊ธธ์ดAtMost32;
| |__________________________________________________________^
์ค๋ ๋ 'rustc'๊ฐ ' delay_span_bug
๋ฐํ๋์์ง๋ง ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์'์์ ํจ๋, src/librustc_errors/lib.rs:366:17
์ฐธ๊ณ : RUST_BACKTRACE=1
ํ๊ฒฝ ๋ณ์๋ก ์คํํ์ฌ ์ญ์ถ์ ์ ํ์ํฉ๋๋ค.
์ด ์ฝ๋๋ ์ปดํ์ผ๋์ง ์์ต๋๋ค.
#![feature(const_generics)]
struct Foo<const X: usize>([u8; X]);
impl<const X: usize> Foo<X> {
fn new() -> Self {
Self([0u8; X])
}
}
warning: the feature `const_generics` is incomplete and may cause the compiler to crash
--> src/lib.rs:1:12
|
1 | #![feature(const_generics)]
| ^^^^^^^^^^^^^^
error[E0573]: expected type, found const parameter `X`
--> src/lib.rs:5:26
|
5 | impl<const X: usize> Foo<X> {
| ^
| |
| not a type
| help: try using the variant's enum: `regex_syntax::ast::HexLiteralKind`
error[E0107]: wrong number of const arguments: expected 1, found 0
--> src/lib.rs:5:22
|
5 | impl<const X: usize> Foo<X> {
| ^^^^^^ expected 1 const argument
error[E0107]: wrong number of type arguments: expected 0, found 1
--> src/lib.rs:5:26
|
5 | impl<const X: usize> Foo<X> {
| ^ unexpected type argument
error: aborting due to 3 previous errors
@npmccallum ๋น์ ์ Foo<{X}>
@pengowen123 ์, derive
์์ด ์ปดํ์ผ( constant in type had an ignored error: TooGeneric
์ปดํ์ผ๋ฌ ์ถฉ๋)ํ์ง๋ง ์ด๋ฌํ "์ด์ค ์ ์ฝ ์กฐ๊ฑด"์ด ์ค์ ๋ก N <= 32
์ธ์ง ์ฌ๋ถ๋ ๋ณ๋์ ์ง๋ฌธ์ผ ์ ์์ต๋๋ค N <= 16
๋ ์ปดํ์ผ๋ฌ์์ ์ ์ฉ๋์ง ์์ต๋๋ค.
๋งค๊ฐ๋ณ์๋ฅผ ์ธ๊ธํ๋ ํํ์์ ์๋ง๋ ํ๋์ ๋ ์ด์ ์๋ํ์ง ์์ ๊ฒ์
๋๋ค. [T; N]
๋ฐ Foo<{N}>
๋ N
๊ฐ ์ธ๊ธ๋ ํํ์์ด ์๋ ํน์ํ ๊ฒฝ์ฐ์ด์ง๋ง ์คํ๋ ค ๋ ํฐ ๋ฌธ์ ๋ฅผ ์ฐํํ์ฌ N
๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ์ฐธ์กฐํ์ญ์์ค.
Self
ํ๋ฉด ์ถฉ๋์ด ๋ฐ์ํฉ๋๋ค.
Value<{C}>
๋ฐ๊ฟ๋ ์ฌ์ ํ ์ถฉ๋ํฉ๋๋ค.
#![feature(const_generics)]
struct Value<const C: usize>;
impl<const C: usize> Value<{C}> {
pub fn new() -> Self {
unimplemented!()
}
}
pub fn main() {
let value = Value::new();
}
ํ๋ ์ดํ์์ ์ค๋ํซ์ด ์ถฉ๋ํ์ง ์์ต๋๋ค: https://play.rust-lang.org/?version=nightly&mode=release&edition=2018&gist=d3fda06d2e8b3eb739afa99d5da84a33
#61338๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฌธ์ ์ ์์ธ์ ์ฆ๋ถ ์ปดํ์ผ์ ๋๋ค.
์ปดํ์ผ ์๊ฐ ๊ณ์ฐ ๋จ์ ํจ์
๋ ์ ์ ํ ๊ธฐ๋ฅ์ const fn ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ด๋ก ์ ์ผ๋ก ์ฝ๋๋ ๊ฑฐ์ ๊ทธ๋๋ก ์๋ํฉ๋๋ค.
#![feature(const_generics)] fn factorial<const X: i32>() -> Option<i32> { match X { i if i < 0 => None, 0 => Some(1), 1 => Some(1), i => Some(factorial::<{X - 1}>().unwrap() + i) } } fn main() { println!("{:?}", factorial::<10>()); }
ํ์ง๋ง ๊ทธ๋ ์ง ์์ต๋๋ค:
warning: the feature `const_generics` is incomplete and may cause the compiler to crash --> src/main.rs:1:12 | 1 | #![feature(const_generics)] | ^^^^^^^^^^^^^^ error: internal compiler error: src/librustc_codegen_ssa/mir/operand.rs:79: unevaluated constant in `OperandRef::from_const`
์ค์ ๋ก unsigned ์ ํ์ ์ฌ์ฉํด์ผ ํ์ง๋ง:
#![feature(const_generics)] fn factorial<const X: u32>() -> u32 { match X { 0 => 1, 1 => 1, _ => factorial::<{ X - 1 }>() + X, } } fn main() { println!("{:?}", factorial::<10>()); }
์ด ๊ธฐ๋ฅ์ ์ ์๊ฒ๋ ์ ์ฉํฉ๋๋ค. const fn
๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ์ฐจ์์ด 0์ธ ์ข
๋ฃ ์กฐ๊ฑด์ ๊ฐ์ง N์ฐจ์ ๋ฐฐ์ด์ ์ฌ์ฉํ๊ณ ์ถ์ต๋๋ค.
๊ตฌ์กฐ์ฒด๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
#![feature(const_generics)]
struct MyArray<T: Default, const len: usize> {
real_array: [T; len]
}
impl<T: Default, const len: usize> MyArray<T, {len}> {
fn new() -> Self {
return MyArray {
real_array: [Default::default(); len]
}
}
}
๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ๋ฐฐ์ด์ ์ค์ ๋ก ์ด๊ธฐํํ ์ ์๊ธฐ ๋๋ฌธ์ ์คํจํฉ๋๋ค.
error: array lengths can't depend on generic parameters
--> src/main.rs:9:46
|
9 | real_array: [Default::default(); len]
|
const ๊ฐ์ ์ผ๋ฐ ๊ฐ์ผ๋ก ์ค์ ํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ํ์ต๋๋ค.
์์ ์ค๋ฅ๋ฅผ ์ง๋์น์ง๋ง ์ปดํ์ผ๋ฌ๊ฐ ์ถฉ๋ํฉ๋๋ค.
error: internal compiler error: src/librustc/ty/subst.rs:597: const parameter `height/#0` (Const { ty: usize, val: Param(height/#0) }/0) out of range when substituting substs=[]
์ธ์ด๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ฐฐ์ด์ ๊ฐ ํฌ๊ธฐ์ ๋ํด ๊ฐ ํจ์๋ฅผ ์ ์ํ ํ์๊ฐ ์๋๋ก ๊ธฐ๋ณธ ์์ ์ ๋ค๋ฆญ์ด ์ ์คํ ํ์ํฉ๋๋ค. ์ด๊ฒ์ด ๋ด๊ฐ ๋
น์ ์ฌ์ฉํ์ง ์๋ ์ ์ผํ ์ด์ ์
๋๋ค. ํ๋ง ์์ ํ ์ปดํ์ผ ์๊ฐ ํจ์๊ฐ ์ ๋ง๋ก ํ์ํฉ๋๊น?
๋ด๊ฐ ํ๋ฆด ์๋ ์์ง๋ง ๊ฐ๋จํ ์ ์ ํํ์์ผ๋ก ์ถฉ๋ถํด์ผ ํ๋ฉฐ ์๋ฌด๋ ์๊ฐ์ ๋ญ๋นํ์ง ์๊ณ ์ด๋ฌํ ์ด์ํ ์์ ๊ฐ ์๋ํ๋์ง ํ์ธํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ธ์ด๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ฐฐ์ด์ ๊ฐ ํฌ๊ธฐ์ ๋ํด ๊ฐ ํจ์๋ฅผ ์ ์ํ ํ์๊ฐ ์๋๋ก ๊ธฐ๋ณธ ์์ ์ ๋ค๋ฆญ์ด ์ ์คํ ํ์ํฉ๋๋ค.
https://github.com/rust-lang/rust/issues/61415์ ์ด๋ฏธ ์ฝ๊ฐ์ ๋ ธ๋ ฅ์ด
์๋ฌด๋ ์๊ฐ์ ๋ญ๋นํ์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ด๋ค ์ฌ๋๋ค์ ๊ทธ๋ ๊ฒํ์ง๋ง ๋๋ ๊ทธ๊ฒ์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค ;)
์ด๊ฒ์ด ๋ด๊ฐ ๋ น์ ์ฌ์ฉํ์ง ์๋ ์ ์ผํ ์ด์ ์ ๋๋ค.
์ด๊ฒ์ ๋ด๊ฐ ๋ น์ ์ฌ์ฉํ์ง ์๋ ์ฌ๋์ ๋ํด ์ธ์ฉํ ๊ฒ์ ๋ณธ ์ ์ด ์๋ ๊ฐ์ฅ ํฅ๋ฏธ๋ก์ด ์ด์ ์ ๋๋ค. ๋น์ ์ด ์ง์ค์ ๋งํ๊ณ ์๋ค๊ณ ํ์ ํฉ๋๊น?
๊ทธ๋ฌ๋ ๊ฐ๋จํ ์ ์ ํํ์์ด๋ฉด ์ถฉ๋ถํฉ๋๋ค.
์ถ์๋ ๋ฒ์๋ฅผ ๋ง๋๋ ๊ฒ์กฐ์ฐจ ์์ฒญ๋๊ฒ ์ด๋ ต์ต๋๋ค. ํ ๋ฒ ์๋ํด ๋ณด์ธ์. ์ ๋ง ์ ๋ฅํ ์ฌ๋๋ค์ด ์ด๊ฒ์ ๋ง๋ค๊ณ ์๋๋ฐ ์ด๋ ๊ฒ ์ค๋ ๊ฑธ๋ฆฌ๋ ๋ฐ๋ ์ด์ ๊ฐ ์์ต๋๋ค.
๋ถํํ๋, ๋๋ ์ต๊ทผ์ const ์ ๋ค๋ฆญ ๋ฒ๊ทธ๋ฅผ ์์ ํ๋ ๋ฐ ๋ง์ ์๊ฐ์ ํ ์ ํ์ง ๋ชปํ์ต๋๋ค(๋๋ ๋ ์ผ๋ฐ์ ์ผ๋ก Rust์). ๋๊ตฌ๋ ์ง const ์ ๋ค๋ฆญ์ ์ถ์งํ๋ ๋ฐ ์ฐธ์ฌํ๊ณ ์ถ๋ค๋ฉด ๋ฏธํด๊ฒฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ๊ณ ๋ฒ๊ทธ ์์ ์ ๊ฒํ ํ๊ธฐ ์ํ ์กฐ์ธ์ ๊ธฐ๊บผ์ด ์ ๊ณตํ๊ฒ ์ต๋๋ค. ํ์ง๋ง ์ด ๋ฌธ์ ์ ๋ค์ ์ง์คํ๋ ค๋ฉด ์๊ฐ์ด ์กฐ๊ธ ๊ฑธ๋ฆด ๊ฒ์ ๋๋ค.
์๋ฌด๋ ์๊ฐ์ ๋ญ๋นํ์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์๋ฌด๋ ์์ต๋๋ค. miri
๋ ์ด๋ฏธ C++ constexpr
๋ณด๋ค ํจ์ฌ ๊ฐ๋ ฅํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ N = M
์์ N + 1 = M + 1
N = M
๋ฅผ ํ์์ํค๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฉ์ง ์์
์ ํ๋ ์ฌ๋์ ์์ต๋๋ค.
์ด๋ฌํ ๋ฒ๊ทธ์ ๋๋ถ๋ถ์ ํํ์์ ๊ดํ ๊ฒ์ด ์๋๋ผ ์ ํ ์์คํ
๋ฐ const
์ ๋ค๋ฆญ์ด ๋ค๋ฅธ ๋ชจ๋ ๊ธฐ๋ฅ๊ณผ ์ํธ ์์ฉํ๋ ๋ฐฉ์์ ๊ดํ ๊ฒ์
๋๋ค.
const
์ ๋ค๋ฆญ๊ณผ ์ ์ ๋ฆฌํฐ๋ด
Btw, [expr; N]
ํํ์์ ๋ํ "๋ฐฐ์ด ๊ธธ์ด๋ ์ผ๋ฐ ๋งค๊ฐ๋ณ์์ ์์กดํ ์ ์์ต๋๋ค" ์ค๋ฅ๊ฐ ํ์ํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. [T; N]
์ ํ์ ๋ํด ์ํํ๋ ๊ฒ๊ณผ ๋์ผํ ํธ๋ฆญ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. N
๋ฅผ ์์ผ๋ก ํ๊ฐํ์ง ์๊ณ ์ถ๋ ฅํฉ๋๋ค.
๋๋ ์ด๊ฒ์ ํ ๋ฒ ์ฐ๋ฌ๋ณด๊ณ ์ถ์ง๋ง ๋ด๊ฐ ์ฌ๋ฐ๋ฅธ ์ฌ๋์ธ์ง ํ์ ์ด ์์ง ์์ต๋๋ค. ๋๋ ๋ น์ ๊ฑฐ์ ์ฌ์ฉํ์ง ์์๊ณ ์ปดํ์ผ๋ฌ ์ด๋ก ์ ๊ฑฐ์ ์์ง ๋ชปํฉ๋๋ค. ์ฝ๊ฐ์ ์ฝ์นญ์ด ํ์ํ ์ ์์ง๋ง ํ์คํ ๊ธฐ๊บผ์ด ํฉ๋๋ค. ๐
ํธ์ง: ๋๋ ์ผ๋ฐ์ ์ผ๋ก ์ํํธ์จ์ด์ ๋ํ ์๋นํ ๊ฒฝํ์ด ์์ต๋๋ค.
@varkor , ์ ๋ rustc
์์ ํ ์ ์๋ ์ ์ฉํ ์ผ์ ์ฐพ๊ณ ์์๋๋ฐ ํ ๊ฑธ์ ๋ ๋์๊ฐ ๋์์ ๋๋ฆฌ๊ณ ์ถ์ต๋๋ค. ๋ํ ์๊ฐ์ ํ ์ ํ ์ ์๋ ๋ฅ๋ ฅ์ ๋ํด ์์งํ๊ฒ ๋ง์ํด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค!
@varkor , ์ค์ ๋ก ์์ ์๊ฒฌ์ ๋ฐ๋ฅด๊ณ ์์ผ๋ฏ๋ก ์กฐ์ธ์ด ์์ผ๋ฉด ๊ท๋ฅผ ๊ธฐ์ธ
์ง๊ธ ๋น์ฅ ํ ์ ์๋ ํ ๊ฐ์ง๋ Foo::<{...}>
/ [expr; ...]
ํํ์ ์ด ( ...
๋ถ๋ถ์์) ์ผ๋ฐ ๋งค๊ฐ๋ณ์๋ฅผ ์ฐธ์กฐํ๋๋ก ํ์ฉํ๋ ๊ฒ์
๋๋ค.
์ด๋ ํํ์์ด ๋ณธ๋ฌธ ๋ด ์ด๋๊ฐ์ ์ค์ฒฉ ๋์ด์ผ ํ๊ณ ์ํ ์ข ์์ฑ์ ๋ฐฉ์งํ๋ ๊ฒฝํฅ ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋ฌ๋ ์๋ช
์ ์๋ฅผ ๋ค์ด [(); [0; 1][0]]
๊ฐ ์์ผ๋ฉด ์์๋ ๊น ๊ฑฑ์ ๋ฉ๋๋ค. ๊ทธ๋์ ์ด์จ๋ ๋ถํ๊ตฌ๋ฅผ ํต๊ณผํด์ผ ํ ๊ฒ์
๋๋ค(์์ฆ์๋ ์์ํ ๊ฑธ๋ฆฝ๋๋ค).
const ์ ๋ค๋ฆญ์ ๋๋ ๋ฐ ๊ด์ฌ์ด ์๋ ์ฌ๋์ ์ํด ์ ์กฐ์ธ์ ๊ณต๊ฐ๋ const ์ ๋ค๋ฆญ ๋ฌธ์ ๋ชฉ๋ก์ ์ดํด๋ณด๊ณ ๊ด์ฌ ์๋ ํญ๋ชฉ์ ์กฐ์ฌํ๋ ๊ฒ์ ๋๋ค. ์ผ๋ถ๋ ์ด๋ฏธ ์กฐ์ฌ๋ฅผ ๋ฐ์์ผ๋ฉฐ ์ด๋ ์๊ฒฌ์ ๋์ ์์ด์ผ ํฉ๋๋ค. ๋๋ถ๋ถ์ ๋ฌธ์ ๋ ์ฝ๊ฐ์ ํ๊ณ ๊ฐ ํ์ํ ๊ฒ์ ๋๋ค. ์กฐ์ฌํ ๊ณํ์ด ์๋ ๊ฒฝ์ฐ ์๊ฒฌ์ ์์ฑํ๋ ๊ฒ์ด ๋์์ด ๋๋ฏ๋ก ์ค๋ณต๋๋ ๋ ธ๋ ฅ์ด ๋ฐ์ํ์ง ์์ต๋๋ค(๊ทธ๋ฌ๋ ํ๋์ ํ๋์ด ์์ผ๋ฉด ๋ฌธ์ ๋ด๋น์๋ฅผ ๋ฌด์ํ ์ ์์ต๋๋ค). ์ง๋ฌธ์ด ์๋ ๊ฒฝ์ฐ ์ด์ ๋๊ธ์ด๋ Discord ๋๋ Zulip์ ์ง๋ฌธํ ์ ์์ต๋๋ค. @eddyb , @yodaldevoid , @oli-obk ๋ฐ ์ ๋ ๋ง์ ๊ด๋ จ ๋ถ์ผ์ ์ต์ํ๋ฉฐ ์ข์ ์ฌ๋๋ค์๊ฒ ๋ฌผ์ด๋ณผ ์ ์์ต๋๋ค. ๋ชจ๋ ๊ด์ฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
cc @hameerabbasi , @ranweiler
const ์ ๋ค๋ฆญ์ ๋ํ ์ง๋ฌธ:
const
๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ์ด๋ค ์ ํ์ด ์์ต๋๊น?const
์ ๋ค๋ฆญ์ ์ด๋ค ์ค์ํ ๊ธฐ๋ฅ์ด ๊ตฌํ๋์ง ์์๊ฑฐ๋ ์ปดํ์ผ๋ฌ๊ฐ ์ถฉ๋ํฉ๋๊น?PS (๊ธฐ๊ณ ์:) ์ด ๊ธฐ๋ฅ์ ์์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
const-generics๋ ์์ง ๊ฐ๋ฐ ์ค์ด๋ฏ๋ก ์์ง ๊ณต์ ๋ฌธ์๊ฐ ์์ต๋๋ค. ๋ค๋ฅธ ๋ ์ง๋ฌธ์ ๋ํด์๋ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ด๊ฐ ๋ง์ง๋ง์ผ๋ก const-generics๋ฅผ ์ฌ์ฉํ์ ๋ ์ผ๋ถ const-generic ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํ์ ๋ ์ถฉ๋์ด ๋ฐ์ํ์ง๋ง ๋ง์ง๋ง์ผ๋ก ๋ฌด์์ด๋ ํ ์ง ๊ฑฐ์ ํ ๋ฌ์ด ์ง๋ฌ์ผ๋ฏ๋ก ๊ทธ ์ดํ๋ก ์ํฉ์ด ๋ณ๊ฒฝ๋์์ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ฌด๋
N = M
์์N + 1 = M + 1
N = M
๋ฅผ ํ์์ํค๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฉ์ง ์์ ์ ํ์ง ์์ต๋๋ค.
์ด๋ฌํ ์ ํ ์ ์ฝ ์กฐ๊ฑด์ ๋ํ ์๋ฒ๊ฐ ์์ผ๋ฉด ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด 2๊ฐ์ N๋นํธ ์ซ์์ธ ๊ฒฝ์ฐ ์ถ๊ฐ๋ฅผ ๊ตฌํํ ๋ ์ค๋ฒํ๋ก ๋นํธ๋ฅผ ์ค๋ช
ํ๋ ค๋ฉด ๋ฐํ ํฌ๊ธฐ๊ฐ (N + 1)์ด์ด์ผ ํฉ๋๋ค. (์๋ฅผ ๋ค์ด) ๋ ๊ฐ์ 5๋นํธ ์ซ์๊ฐ ์ฃผ์ด์ง๋ฉด ์๋ฒ๋ N + 1 = 6
ํ์ธํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ๊ฑด๋ ์ด๊ฒ์ ๋์ค์ const ์ ๋ค๋ฆญ์ ๋ณผํธ๋ก ๊ณ ์ ๋ ์ ์์ต๋๋ค. :)
@flip111 ๋ค, ๋์ค์ ์ถ๊ฐํ ์๊ฐ์ด์ง๋ง ์ด๋ฐ ์ข ๋ฅ์ ์ผ๋ฐ ํํ์ ์ ์ฝ ์กฐ๊ฑด์ ๋งค์ฐ ๋ณต์กํ๊ณ ๊ตฌํํ๊ธฐ ์ด๋ ต์ต๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ์ ์ด๋ ๋ช ๋ ๋์ ๊ทธ๋ค์ ๋ณผ ์ ์์ต๋๋ค.
์์งํ ๋งํด์ ์ด๋ฌํ ์ข ๋ฅ์ ์ ์ฝ ๊ธฐ๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ Prolog์ ์์ ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. ์ดํฌ ์์ง์ ํธ์นํ๋ ๊ฒ์ด ์ต์ ์ผ ์ ์์ต๋๊น? ๊ทธ๋๋ Afaik์ ํน์ฑ์ ํด๊ฒฐํฉ๋๋ค.
Btw ๋๋ ์ด ์ฃผ์ ์ ๋ํด ๋์์ ์ค ์ฌ์ ๊ฐ ์์ง๋ง ์ฃผ์ ๋ฅผ ์ข์ํฉ๋๋ค. ๋น์ ์ ์๊ฐ๊ณผ ํ์ ์ ๋ํด Const Generics์์ ์ผํ๋ ๋ชจ๋ ์ฌ๋์๊ฒ ๊ฐ์ฌํฉ๋๋ค. ๐
์์ ์ ๋ฐ์ดํธ: Rust ํธ๋ฆฌ๋ฅผ ์ฌ๋ผ๊ฐ๋ ์ค์ ๋๋ค. ๊ธฐ์ฌํ ๊ณํ์ ์์ง๋ง ๊ณผ๋ํ ์ฝ์นญ์ด ํ์ํ์ง ์์ ๊ณณ์์ ๋ ํํ๊ณ ์ถ์ต๋๋ค.
๊ตฌ์กฐ์ฒด๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
#![feature(const_generics)] struct MyArray<T: Default, const len: usize> { real_array: [T; len] } impl<T: Default, const len: usize> MyArray<T, {len}> { fn new() -> Self { return MyArray { real_array: [Default::default(); len] } } }
๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ๋ฐฐ์ด์ ์ค์ ๋ก ์ด๊ธฐํํ ์ ์๊ธฐ ๋๋ฌธ์ ์คํจํฉ๋๋ค.
error: array lengths can't depend on generic parameters --> src/main.rs:9:46 | 9 | real_array: [Default::default(); len] |
๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง๋ง
MaybeUninit
์ฌ์ฉํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ์์ต๋๋ค.
https://play.rust-lang.org/?version=nightly&mode=release&edition=2018&gist=3100d5f7a4efd844954a6fa5e8b8c526
๋ฐฐ์ด์ ์ ์ ํ๊ฒ ์ด๊ธฐํํ๋ ๊ฒ์ ๋ถ๋ช ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ ๋ฟ์ด์ง๋ง ์ ์ ํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ ๋๊น์ง๋ ์ด๊ฒ์ผ๋ก ์ถฉ๋ถํฉ๋๋ค.
์ฐธ๊ณ : ์ฝ๋๋ ํญ์ ์๋ํ ๋๋ก ์๋ํด์ผ ํ๋ค๊ณ ์๊ฐํ์ง๋ง ๋๊ตฐ๊ฐ๊ฐ unsafe ์ฌ์ฉ๊ณผ ๊ด๋ จ๋ ๋ฒ๊ทธ๋ฅผ ๋ฐ๊ฒฌํ๋ฉด ๊ธฐ๊บผ์ด ์์ ํ๊ฒ ์ต๋๋ค.
@raid =
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ์ด๊ธฐํ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด๊ธฐํํ ๋ ์ด๊ธฐํ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ญ์ ํ๊ณ ์์ต๋๋ค. ๋์ ์ด๋ ๊ฒ ํ์ธ์.
@KrishnaSannasi ๊ฐ์ฌํฉ๋๋ค, ์ข์ ์บ์น :D (๊ธฐ์ ์ ์ผ๋ก ๋๋
๊ธฐ์ ์ ์ผ๋ก ๋ถ๋ ์์์ ์ ์ญ์ ํ๋ ๊ฒ์ ์ ์๋์ง ์์์ง๋ง ์ง๊ธ์ ์ ์ฉํ ์ ์์ต๋๋ค.
๊ธฐ์ ์ ์ผ๋ก ๋ถ๋ ์์์ ์ ์ญ์ ํ๋ ๊ฒ์ ์ ์๋์ง ์์์ง๋ง ์ง๊ธ์ ์ ์ฉํ ์ ์์ต๋๋ค.
์ด๊ธฐํ๋์ง ์์ ๋ชจ๋ Copy
์ ํ์ ์ญ์ ํ๋ ๊ฒ์ ์๋ฌด ์์ฉ์ด ์์ ๊ฒ์ด๋ผ๊ณ ์์ํ์ต๋๋ค. ์๋ง๋ ๋ฐ๊ฟ ๊ฐ์น๊ฐ ์์ต๋๋ค.
๊ธฐ์ ์ ์ผ๋ก ๋ถ๋ ์์์ ์ ์ญ์ ํ๋ ๊ฒ์ ์ ์๋์ง ์์์ง๋ง ์ง๊ธ์ ์ ์ฉํ ์ ์์ต๋๋ค.
์ด๊ธฐํ๋์ง ์์ ๋ชจ๋
Copy
์ ํ์ ์ญ์ ํ๋ ๊ฒ์ ์๋ฌด ์์ฉ์ด ์์ ๊ฒ์ด๋ผ๊ณ ์์ํ์ต๋๋ค. ์๋ง๋ ๋ฐ๊ฟ ๊ฐ์น๊ฐ ์์ต๋๋ค.
์์ง ๊ธฐ์ ์ ์ผ๋ก UB์
๋๋ค. ์ ์๋ Copy
๊ฐ์ ์์ ํ๊ฒ ์ญ์ ํ๋ ๊ฒ์ ๊ธ๋ฌผ์ด์ง๋ง, ๋ชจ๋ ์ ํ์ ์ด๊ธฐํ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ญ์ ํ๋ ค๋ ๊ฒฝ์ฐ(์: ํด๋น ๊ฐ์ ๋ฟ์ ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ชจ๋ ์ฝ๋ ์ ๊ฑฐ) ์ปดํ์ผ๋ฌ์์ ์๊ธฐ์น ์์ ์ต์ ํ๋ฅผ ์ํํ ์ ์์ต๋๋ค. ๋ฌผ๊ฑด์ ๊นจ๋จ๋ฆด ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ด ๋์ ์ดํด์
๋๋ค.
๋ฌด๋กํ์ง๋ ์์ง๋ง ์ด ์ค๋ ๋์ ๋ํ ๋๊ธ์ ๋ํด 60๋ช ์ด์์ ์ฌ๋๋ค์ด ์๋ฆผ์ ๋ฐ์ผ๋ฏ๋ก ์ฃผ์ ์์ ๋ฒ์ด๋ ํ ๋ก ์ ์ต์ํ์ผ๋ก ์ ์งํด์ผ ํฉ๋๋ค. const ์ ๋ค๋ฆญ์ ๋ํ ์์ ์ ์กฐ์ ํ๊ธฐ ์ํด ์ด๊ฒ์ ์ฌ์ฉํฉ์๋ค. ๊ทธ๊ฒ์ด ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ์ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ค๋ฅธ ํฌ๋ ์ดํธ(์ข ์์ฑ)์์ const-param_์ผ๋ก ์ ํ์ ๊ฐ๋ฆฌํค๋ _aliases๋ฅผ ์ฌ์ฉํ๋ฉด ์ถฉ๋์ด ๋ฐ์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด:
ํ ์ ํ ๋ณ์นญ
ํ ๊ตฌ์กฐ์ฒด ๊ตฌ์กฐ์ฒด
- crate B
์ธ๋ถ ์์ crate_a;
์ฌ์ฉ crate_a::๋ณ์นญ;
pub fn inner_fn(v: ๋ณ์นญ
```
์ถฉ๋ ๋ก๊ทธ(44580).txt
@fzzr- #64730์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
๋ํ https://github.com/rust-lang/rust/issues/61624 ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
์ผ๋ถ ์ฝ๋๋ฅผ const ์ ๋ค๋ฆญ์ผ๋ก ์ ํํ๋๋ฐ ์ค์ ๋ก ๋ ๊ฐ์ง ์ฌ์ฉ ์ฌ๋ก๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๊ฒ๋ค์ ๋ณํฉํด์ผ ํ๋์ง ์๋๋ฉด ์ฌ์ฉ ์ฌ๋ก์ ๋ํด ๋ ๊ฐ์ง ๋ค๋ฅธ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋์์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
ํ์์ ๋ง์ ์ฌ์ฉ๋ฒ์ ์ค์ ๋ก ์์ ๊ฐ์ด ์ ํ์ ๊ฒฐ์ ํ๋ ์ญํ ์ ํ๋ ์ ํ์ด ์๋๋ผ ๋น const/literal ๊ฐ์ ๋ํด ์ ๊ธด ๊ธฐ๋ฅ์ ํ์ฉํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค(์: ์ผ์น ํจํด, ๊ทธ๋ฌ๋ ๊ถ๊ทน์ ์ผ๋ก ๊ทธ๋์ผ ํ ๊ฒ์ ๋๋ค).
IMHO ์ฐ๋ฆฌ๋ ๊ณต์์ ์ผ๋ก const ์ ๋ค๋ฆญ๊ณผ ํจ๊ป "const ์ธ์"๋ฅผ ๋ฐฐ์นํด์ผ ํ๋ฏ๋ก ์ฌ๋๋ค์ด ์ปดํ์ผ๋ฌ๊ฐ ํน์ ๋ณ์๋ฅผ ๋ฆฌํฐ๋ด/์์๋ก ํ๊ฐํ๋๋ก ํ๊ธฐ ์ํด ์์ฒ ๊ฐ์ "const ์ ๋ค๋ฆญ"(๊ฐ ์ธ์์ ํ๋์ฉ)์ ๋์ ํ๋ ๋์ฐ๋ณ์ด ์ฝ๋๋ฅผ ์์ฑํ์ง ์๋๋ก ํด์ผ ํฉ๋๋ค.
@mqudsi ์๋ฅผ ๋ค์ด ์ฃผ์๊ฒ ์ต๋๊น? const eval์ ๋์ฑ ๊ฐ๋ ฅํ๊ฒ ๋ง๋ค๊ธฐ ์ํ ๊ณํ๊ณผ ์ง์์ ์ธ ๊ธฐ์ด ์์ ์ด ์ด๋ฏธ ์งํ ์ค์ ๋๋ค. ๊ทธ๋ฌ๋ const ์ ๋ค๋ฆญ๊ณผ ์ง๊ตํฉ๋๋ค.
๋ด ๋ง์ ์ฌ์ฌ์ฉ์ ์ํด ๋ค์๊ณผ ๊ฐ์ ์ผ๋ฐ์ ์ธ ํ์ ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ๋ ค๋ ๊ฒฝ์ฐ์ ๋๋ค.
let mut result: u32 = 0;
let mut digits = 0;
while digits < max_digits && src.has_remaining() {
match src.get_u8() {
d<strong i="6">@b</strong>'0'..=b'9' => {
result = result*10 + (d - b'0') as u32;
digits += 1;
},
b'>' => match result {
0..=191 => break, // valid range
_ => return Err(DecoderError::OutOfRange),
},
_ => return Err(DecoderError::Malformed)
}
}
ํจํด ์ผ์น์ ์ฌ์ฉ๋๋ ํน์ ๊ฐ์ด ๋ณ์๊ฐ ๋์๊ธฐ ๋๋ฌธ์ ๋ค์์ด ์๋ํ์ง ์๋๋ค๋ ์ ์ ์ ์ธํ๊ณ ์ผ๋ฐ์ ์ผ๋ก ํจ์๋ก ์ด๋ํฉ๋๋ค.
#[inline(always)]
fn read_str_digits<B: bytes::buf::Buf>(src: &mut B, stop_word: u8,
max_digits: u8, min_value: u32, max_value: u32) -> Result<u32, DecoderError> {
let mut result: u32 = 0;
let mut digits = 0;
while digits < max_digits && src.has_remaining() {
match src.get_u8() {
d<strong i="10">@b</strong>'0'..=b'9' => {
result = result*10 + (d - b'0') as u32;
digits += 1;
},
stop_word => match result {
min_value..=max_value => break, // valid range
_ => return Err(DecoderError::OutOfRange),
},
_ => return Err(DecoderError::Malformed)
}
}
...
}
const ์ ๋ค๋ฆญ์ด const ์ธ์๋ณด๋ค ๋จผ์ ๋์ค๋ฉด ๊ฐ์๊ธฐ ๋ค์์ ์๊ฐํด๋ด๊ธฐ ์ํด const ์ ๋ค๋ฆญ์ ๋จ์ฉํ ์ ์์ต๋๋ค.
#[inline(always)]
fn read_str_digits<const MinValue: u32, const MaxValue: u32, const StopWord: u8, B: bytes::buf::Buf>
(src: &mut B, max_digits: u8) -> Result<u32, DecoderError> {
let mut result: u32 = 0;
let mut digits = 0;
while digits < max_digits && src.has_remaining() {
match src.get_u8() {
d<strong i="14">@b</strong>'0'..=b'9' => {
result = result*10 + (d - b'0') as u32;
digits += 1;
},
StopWord => match result {
MinValue..=MaxValue => break, // valid range
_ => return Err(DecoderError::OutOfRange),
},
_ => return Err(DecoderError::Malformed)
}
}
...
}
ํ์ฌ๋ก์๋ ์ปดํ์ผ๋ฌ๊ฐ const ์ผ๋ฐ ๊ฐ์ ํจํด์์ ์ฌ์ฉํ๊ธฐ์ ์ ํจํ ์์๋ก ๊ฐ์งํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์ด ์ฝ๋๋ ์๋ํ์ง ์์ต๋๋ค. ์คํดํ์ง ๋ง์ธ์. ์ ๋ ๋ช ๋
๋์ ์ผ๋ฐ ์์๋ฅผ ์ํด ์ธ์์๊ณ 12๊ฐ์ ์ฃผ์ ์์๋ฅผ ์ป์ ์ค๋น๊ฐ ๋ PR์ ๊ฐ์ง๊ณ ์์ต๋๋ค( chrono
์ ์๊ฐ๋๋ฅผ const ์ผ๋ฐ ๋ฐ ๋ค์ํ DateTime
์ ํ์ ๋ชจ๋ ํตํฉ)ํ์ง๋ง const ์ ๋ค๋ฆญ์ ๊ฐ์ง const ์ธ์์ ๋จ์ฉํ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ง๋ค๋ฉด(์ฌ๊ธฐ์ "const"๋ ์ฐ๋ฆฌ๊ฐ ์ค์ ๋ก ์๋ฏธํ๋ ๊ฒ์ด "๋ฆฌํฐ๋ด"์) ๋๋ฆฌ ํผ์ง ๊ฒ์ ๋ณด๊ฒ ๋ ๊ฒ์
๋๋ค. ๊ทธ ๋จ์ฉ.
๊ทธ๊ฒ์ด ๋ฐ๋์ ์ธ์์ ๋์ ์๋์ง๋ง, ๊ทธ๊ฒ์ ๋ํด ๋๋ฌด ๊น์ด ํ๊ณ ๋ค์ง ์๊ณ ์๋ ์ ์ ํ๊ณ ์์ ํ const ์ ๋ค๋ฆญ ๊ตฌํ์ด ์ด์จ๋ const ์ธ์์ ๋ํ ๋ชจ๋ ๋ฐฐ๊ด์ ํ์ฐ์ ์ผ๋ก ํฌํจํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฏ๋ก ์ถ๊ฐ ์๊ฐ์ ๋ค์ด๋ ๊ฒ์ด ์ข์ต๋๋ค. const ์ธ์์ ๋ํ ๊ตฌ๋ฌธ/ux/story๋ฅผ ์๋ฃํ๊ณ ์ฝ๋ ์ ์ทจ์ ๋ถํํ ์๋๋ฅผ ํผํ๊ธฐ ์ํด. ์, ์์ ์์ ์ ์ฌ์ ํ โโ๋งคํฌ๋ก๋ก ์ํํ ์ ์์ง๋ง const ์ ๋ค๋ฆญ์ ์ธ์ฒด ๊ณตํ์ ์ฒ ๋ฐฐ ๋ ์ฝ์ต๋๋ค.
fwiw, ์ด๊ฒ์ด ๋ด๊ฐ const ์ธ์ ๋ฒ์ ์ด ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ ๊ฒ์ด๋ผ๊ณ ์์ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
#[inline(always)]
fn read_str_digits<B: Bytes>(src: &mut B, min_value: const u32,
max_value: const u32, stop_word: const u8, max_digits: u8) -> Result<u32, ()> {
let mut result: u32 = 0;
let mut digits = 0;
while digits < max_digits && src.has_remaining() {
match src.get_u8() {
d<strong i="23">@b</strong>'0'..=b'9' => {
result = result*10 + (d - b'0') as u32;
digits += 1;
},
stop_word => match result {
min_value..=max_value => break, // valid range
_ => return Err(()),
},
_ => return Err(())
}
}
...
}
const ์ ๋ค๋ฆญ๊ณผ ์ค์ง์ ์ผ๋ก ๋์ผํ์ง๋ง ์๋ฏธ๋ก ์ ๋ํ ๊ฒ์ ๋๋ค.
ํจํด ์ผ์น์ ์ฌ์ฉ๋๋ ํน์ ๊ฐ์ด ๋ณ์๊ฐ ๋์๊ธฐ ๋๋ฌธ์ ๋ค์์ด ์๋ํ์ง ์๋๋ค๋ ์ ์ ์ ์ธํ๊ณ ์ผ๋ฐ์ ์ผ๋ก ํจ์๋ก ์ด๋ํฉ๋๋ค.
์ด๊ฒ์ ๋ช ๊ฐ์ง ์๋ก์ด ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ํจํด(๋จ์ํ const๊ฐ ์๋)์์ ๋ฐ์ธ๋ฉ๋ ๋ณ์์ ๊ฐ์ ์ฌ์ฉํ ์ ์๋๋ก ํจ์ผ๋ก์จ ๋ณด๋ค ์ฝ๊ฒ โโํด๊ฒฐ๋๋ ์ฌ์ฉ ์ฌ๋ก์ฒ๋ผ ๋ณด์ ๋๋ค. ํ์ฌ ํจํด์์ const๊ฐ ํ์ฉ๋๋ค๋ ์ฌ์ค์ ์ง๊ด์ ์ด์ง ์์ผ๋ฉฐ ๋ด๊ฐ ์๋ ํ ์ญ์ฌ์ ์ ๋๋ค.
@mqudsi ์ด๋ฆฌ์์ ์ง๋ฌธ์ด๋ผ๋ฉด ์ฉ์ํ์ญ์์ค. ๊ทธ๋ฌ๋ ๊ทํ๊ฐ ์ ๊ณตํ ์์ ๋ํด ์๋ชป๋ ์ ์ ์์ต๋๋ค. ๋ด๊ฐ ๋ณด๊ธฐ์ const ์ ๋ค๋ฆญ์ ๋ํ ์๋ฒฝํ๊ฒ ์ ํจํ ์ฌ์ฉ ์ฌ๋ก์ฒ๋ผ ๋ณด์ ๋๋ค. ๋๋ const ์ ๋ค๋ฆญ๋ณด๋ค const ์ธ์์ ์ด์ ์ ์ค์ ๋ก ๋ณด์ง ๋ชปํฉ๋๋ค. ๊ทธ๋ค์ ๋์ ๋๋ฑํด ๋ณด์ธ๋ค. ์ฆ, const ์ธ์๋ const ์ ๋ค๋ฆญ์ ๋ํ ๋์๊ฐ๋ง์ผ๋ก ๊ตฌํ๋ ์ ์์ต๋๋ค. ์ด ๋์์ธ ํจํด์ ๋ฌธ์ ์ ์ ๋ํด ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
๋ค์ ์ ๋ง์ง๋ง ์ ๋ฐ์ดํธ ์ดํ
๋ํ ์ปดํ์ผ๋ฌ์ ๋ํ ๋ค๋ฅธ ์์ ์ผ๋ก const ์ ๋ค๋ฆญ๊ณผ ๊ด๋ จ๋ ๋ค๋ฅธ ๋ฌธ์ ์ค ์ผ๋ถ๊ฐ ์์ ๋์์ต๋๋ค.
๋ํ ์ปดํ์ผ๋ฌ ์์ฒด ๋ด์์ const ์ ๋ค๋ฆญ์ ์ฌ์ฉํ๊ธฐ ์์ํ์ต๋๋ค. @crlf0710 ๋ฐ @scottmcm (https://github.com/rust-lang/rust/pull/60466, https://github.com/rust-lang/rust/pull/60466, https://github.com/rust-lang/rust/pull/60466, https://github.com/rust-lang/rust/pull/60466, https://github.com/rust-lang/rust/pull/60466, https://github.com/rust-lang/rust/pull/60466, https://github.com/rust-lang/rust/pull/60466 ://github.com/rust-lang/rust/pull/62435), ์ด๋ ์ฑ๋ฅ ํฅ์์ผ๋ก ์ด์ด์ก๊ณ , ์ด๋ ๋ํ ๋ฏธ๋์ ๋ฐฐ์ด ํน์ฑ ๊ตฌํ ์ @Centril ์ VecDeque
๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ๋์ผํ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ์ต๋๋ค(https://github.com/rust-lang/rust/pull/63061).
const ์ ๋ค๋ฆญ๊ณผ ๊ด๋ จ๋ ํนํ ์ผ๋ฐ์ ์ธ ๋ฒ๊ทธ ์ค ๋ง์ ๋ถ๋ถ์ด ์ง๋ ๋ช ๋ฌ ๋์ ์์ ๋์์ต๋๋ค. @nikomatsakis ๋ ๋๋จธ์ง ๋ฌธ์ ์ ํธ์คํธ๋ฅผ ์์ ํด์ผ ํ๋ ์ง์ฐ ์ ๊ทํ๋ฅผ ์กฐ์ฌํ๊ณ ์์ผ๋ฉฐ @jplatte ๋ ์ ํ ๋งค๊ฐ ๋ณ์ ์์ ๋ช
ํ์ฑ ์ ์์ ํ๋ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ ์ด์ {X}
๋ฅผ ์
๋ ฅํ ํ์๊ฐ ์์ต๋๋ค. const ์ธ์).
๋ํ ๊ฐ๋ฐ ์ ๋ฐ์ ๊ฑธ์ณ const ์ ๋ค๋ฆญ์ ๋ํ ๋ชจ๋ ๋ฉํ ๋ง๊ณผ ๊ฒํ ์ ๋ํด @eddyb ์๊ฒ ๊ฐ์ฌ์ ์ถ์ต๋๋ค . ์ด๋ ๋งค์ฐ ์ค์ํฉ๋๋ค.
์์ง ํด๊ฒฐํด์ผ ํ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ๋ง์ด ์์ผ๋ฉฐ ์ด์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ๋ฅํ ๋ชจ๋ ๋์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋๋จธ์ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๊ด์ฌ์ด ์์ผ์๋ฉด ์ธ์ ๋ ์ง ํด๋น ๋ฌธ์ ์ ๋ํด ์ ์๊ฒ ํ์ ๋ณด๋ด๊ฑฐ๋ ์์์ ๋ํ ํฌ์ธํฐ๋ Discord ๋๋ Zulip์ ๋๋ค.
@mqudsi @mark-im ํ์ฌ์ ์ ๋ค๋ฆญ ๊ตฌ๋ฌธ ๋์์ธ ์ธ์ ์์น์ impl Trait
๋ฅผ const ์ ๋ค๋ฆญ์ผ๋ก ํ์ฅํ๋ ๊ฒ์ด ์ ์ ํ ๊น์? ์ด๊ฒ์ ์ด ์ฌ์ฉ ์ฌ๋ก์ ๋ํด ์ ์๋ ๊ตฌ๋ฌธ @mqudsi ์
๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ์ด๊ฒ์ ์ด๋ฌํ ์ฌ์ฉ ์ฌ๋ก์ ๊ฐ๋
์ฑ์ ํฅ์์ํฌ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ํ ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ผ๋ฐ ์ ๋ค๋ฆญ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ฏ๋ก ์ธ์์ ๋ฐ์ธ๋ฉ๋ฉ๋๋ค. ์ด๊ฒ์ const ์ ๋ค๋ฆญ์ ๊ฒฝ์ฐ๊ฐ ์๋๋ฏ๋ก ์ด๋ป๊ฒ ์ ๋ฌํฉ๋๊น? ๊ทธ๋ค์ด ๋
ผ์์ธ ์ฒ?
์ธ์ ์์น์ impl Trait
์๋ ๊ฒฝ์ฐ์๋ turbofish ๊ตฌ๋ฌธ๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค. const
์ธ์์ ๊ฒฝ์ฐ ๋ฐ๋์
๋๋ค. ํผ๋์ค๋ฌ์ธ ์ ์์ต๋๋ค.
์ด์ ์ด ์ฌ๊ธฐ์ "์ด์ํจ"์ ๋ฅ๊ฐํ๋์ง ํ์คํ์ง ์์ง๋ง ์ด์จ๋ ์ ์๊ฐ์ ๊ณต์ ํ๊ณ ์ถ์์ต๋๋ค.
์ด์ ์ ์ด์ ๋ํ ๋ ผ์๊ฐ ์ด๋ ดํ์ด ๋ ์ฌ๋๋ค๊ฐ ์ด์ ์ฐพ์์ต๋๋ค. https://internals.rust-lang.org/t/pre-rfc-const-function-arguments/6709
@ PvdBerg1998 ๊ทธ๊ฒ์ ๋งค์ฐ ๋์ ์๊ฐ์ฒ๋ผ ๋ณด์
๋๋ค. <โฆ>
๊ฐ ์ฝ๊ธฐ _์ด๋ ค์ด ๊ตฌ๋ฌธ_์ด๋ผ๋ ์๊ฐ์ด ์ ๋ง ์ดํด๊ฐ ๋์ง ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ๋ ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
where
์ ์ ๋๋ ๊ฒ์ด ํด๊ฒฐ์ฑ
์ด ๋ ๊น์?์ด์ ์์ ๋งํฌ๋ pre-RFC์ ๋น๊ตํ์ญ์์ค. ํจ์ ์ธ์์ ์์น์ _tag_(์ ํ ์์คํ ์ ์๋ฏธ์์)๋ฅผ ์ง์ ๋์ ํ๋ ๊ฒ์ ๋๋ค. ์ฆ, ํจ์ ๋ณธ๋ฌธ์ ๋ํ ๋ณ์ ๋ฐ์ธ๋ฉ์ ๋๋ค.
๋ค์ ๋งํด์ ๋งค์ฐ ํผ๋์ค๋ฝ๊ณ ์ฌ๋ฌ ์ฌ๋๋ค์ด arg ์์น์ impl Trait์ ๋ํด ์ธ๊ธํ๋ฏ์ด ํ์ํ์ง ์์ต๋๋ค. ๊ฐ์น๊ฐ ์๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ ์ํด ๊ฐ์ ์ค์๋ฅผ ๋ ๋ฒ ํ์ง ๋ง์ญ์์ค. ํนํ "๊ทธ๋ค์ด ๋ ผ์์ธ ์ฒ"ํ๋ ๊ฒฝ์ฐ. Rust๋ ์ฌ๊ธฐ์ ์๋ชป๋ ๋ฐฉํฅ์ผ๋ก ๊ฐ๊ณ ์์ต๋๋ค. ๊ตฌ๋ฌธ์ ๋ ๊ฐ๋ฒผ์์ผ ํ์ง๋ง ๋ ํผ๋์ค๋ฌ์์๋ ์ ๋ฉ๋๋ค. ์ค์งํ์ญ์์ค.
@phaazon
๋๋ ๊ฐ์ธ์ ์ผ๋ก ์ธ์ ์์น์ ์์๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ์ธ์ฒด๊ณตํ์ ํฅ์์ ๋งค์ฐ ์ข์ ๊ฒ์ด๋ผ๋ ์ฐ๊ฒฐ๋ ์ ์์ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. ์ด๊ฒ์ ํจ์ ์๋ช
์ ๊ดํ ๊ฒ์ผ ๋ฟ๋ง ์๋๋ผ( where
์ ์ ๋ฌธ์ ๋ฅผ ์ ํ "ํด๊ฒฐ"ํ์ง ๋ชปํ์ง๋ง ํ ๊ณณ์ด ์๋ 3๊ณณ์ ๊ตฌ๋ฌธ ๋ถ์ํด์ผ ํ๋ฏ๋ก ์๋ช
์ ์ดํดํ๊ธฐ ๋ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค.) ๊ทธ ๊ธฐ๋ฅ์ด ์ด๋ป๊ฒ ์ฌ์ฉ๋ ์ง. ๋น๊ตํ๋ค:
let r = _mm_blend_ps::<{2 * C}>(a, b);
let r = _mm_blend_ps(a, b, 2 * C);
์ ์๊ฐ์๋ ๋ ๋ฒ์งธ ๋ผ์ธ์ด ๋ ๋ฒ์งธ ๋ผ์ธ๋ณด๋ค ํจ์ฌ ๋ ์์ฐ์ค๋ฝ์ต๋๋ค. ๋ ๋ค๋ฅธ ์๋ ํ๋ ฌ ์์ฑ์
๋๋ค: MatrixF32::new(3, 3)
vs. MatrixF32::new::<3, 3>()
. ๋๋ ์ด ๊ธฐ๋ฅ์ด "ํผ๋์ค๋ฝ๋ค"๋ ๋ฐ ๊ฐ๋ ฅํ ๋์ํ์ง ์์ต๋๋ค. ์ฌ์ฉ์์ ๊ฒฝ์ฐ ํจ์ ์ธ์์ ๋ํ ์ถ๊ฐ ์๊ตฌ ์ฌํญ์ ๋ถ๊ณผํฉ๋๋ค. ์ด๋ฏธ ๋งคํฌ๋ก๋ฅผ ํตํด const ์ธ์๋ฅผ ์๋ฎฌ๋ ์ดํธํ ์ ์์ง๋ง( std
๋ด๋ถ์ SIMD ๋ด์ฅ ํจ์ ์ฐธ์กฐ), ์๋นํ ์ถํ๊ณ ๋นํจ์จ์ ์
๋๋ค.
impl Trait
๋
ผ์ฆ ์
์ฅ์์ ์ ๋ ์ฒ์์๋ ์ด ๊ธฐ๋ฅ์ ๋ฐ๋ํ์ง๋ง ์๊ฐ์ด ์ง๋๋ฉด์ ์๊ฐ์ด ๋ฐ๋์๊ณ ๊ฒฐ๊ตญ ์ํ ๊ฒฐ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํ์ฌ ๋ถ์์ ํ ๋ถ๋ถ์ Turbofish๋ฅผ ํตํด ์ ๊ณต๋๋ ๋ช
์์ ์ ํ ๋งค๊ฐ๋ณ์์์ ์ํธ ์์ฉ์
๋๋ค. ์ข์ ํด๊ฒฐ์ฑ
์ Turbofish์ ๋ํด impl Trait
์ธ์๋ฅผ ๋ณด์ด์ง ์๊ฒ ํ๋ ๊ฒ์
๋๋ค. ์ฆ, ์ฌ์ฉ์๋ ๋ช
์์ ์ ํ ๋ช
ํํ๊ฐ ํ์ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ํ์ ํ ๋ ์ด๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ผ๋ถ ์๋๋ฆฌ์ค์์ Turbofish ๋ด๋ถ์ ํ์ํ _
๋ฅผ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค.
const ์ธ์์ ๋ํ ๋ ผ์๋ ์ฌ๊ธฐ์์ ์ฃผ์ ๋ฅผ ๋ฒ์ด๋๋ฏ๋ก ์ฌ๊ธฐ์ ๊ณ์ํด์๋ ์ ๋ฉ๋๋ค.
๋ถ๋ฆฌ ํ ๊ฐ์ง const
์์ ์ธ์๋ฅผ impl Trait
(PvdBerg1998 @ ์ธ๊ธ) ์ธ์๋ ๊ทธ ์ ํ์ ์ถ๋ก ์์ํ ์๋ฏธํ๋ ๋ชจ๋ ์ผ๋ก, ์ธ์ ์๋ค๋ ๊ฒ์
๋๋ค.
๋น์ ์ ์ธ์๋ก ์ ํ ์์ฒด๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค,ํ์ง๋ง ๋น์ ์ ๊ฐ์ ์ ๋ฌํ ์ ์์ผ๋ฉฐ, ์ ์ ๊ดํธ ์ธ์์์์ const๋ฅผ ์ผ๋ฐ์ ์ธ ์ธ์ ์ถ๋ก ๊ธฐ๋ฅ์์ํค๋ ๊ฒ์ ์์ ํ ํฉ๋ฆฌ์ ์ด๋ค.
์ด๊ฒ์ C++์์ ๋งค์ฐ ์ผ๋ฐ์ ์ ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
template <typename T, size_t N>
size_t length(T (&array)[N]) {
return N;
}
์ด๊ฒ์ ๋จ์ํ CONST ๋งค๊ฐ ๋ณ์๋ฅผ ์์ฉํ๊ณ CONST ์ผ๋ฐ์ ์ธ ๋งค๊ฐ ๋ณ์์ desugaring์์ ๋ฏธ๋ฌํ๊ฒ ๋ค๋ฅด๋ค ( fn foo(const N: usize)
-> fn foo<const N: usize>()
). const ์ผ๋ฐ ๋งค๊ฐ ๋ณ์๋ก ๋งค๊ฐ ๋ณ์๋ฅผ ์ ํํ ๋ค์ ์ธ์์์ ํด๋น const ์ผ๋ฐ ์ธ์๋ฅผ ์ ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ ๊ฐ๊น์ต๋๋ค. ๋ฐ๋ผ์ ์์ ํ๋ ฌ ์๋ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค.
impl<const W: usize, const H: usize> MatrixF32<W, H> {
fn new(w: usize<W>, h: usize<H>) -> Self { .. }
}
...์ฌ๊ธฐ์ usize<X>
๋ " X
๊ฐ์ ๊ฐ์ง usize
"์ ๋ํ ๊ตฌ์ฑ๋ ๊ตฌ๋ฌธ์
๋๋ค. (์ ์ฌํ๊ฒ NonZero
์ผ๋ฐํ์ ๋งฅ๋ฝ์์ ๋
ผ์๋ ๋ฒ์ํ ์ ํ์ ๋ํด usize<X..Y>
๋ฅผ ์ํ ์ ์์ต๋๋ค.)
์๊ฑฐ๋ฆฌ ์ ํ์์ ๋กํ์ ํผํ๊ณ ์ถ๋ค๋ฉด ์ฝ๊ฐ์ ๋ฒ์ ์กฐ์ ๊ณผ ํจ๊ป ๋งค๊ฐ๋ณ์๋ฅผ ์ ํ์์ ์ง์ ์ฌ์ฉํ ์ ์๋ ์ข ์ ์ ํ ์ธ์ด๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
fn new(const W: usize, const H: usize) -> MatrixF32<W, H> { .. }
๊ทธ๋ค์ ์ฃผ์ฅ์ด ์๋๋๋ค . ๊ทธ๊ฒ๋ค์ ์ ๋ค๋ฆญ ์ ๋๋ค. ์ ํ ์์คํ ์์ค์์ ์ด๋ _values_๊ฐ ์ปดํ์ผ ํ์์ ์คํ๋๋ ๋ฐ๋ฉด ํจ์ ์ธ์์ ๊ฐ์ ๋ฐํ์์ ์คํ๋จ์ ์๋ฏธํฉ๋๋ค. ๋ ๊ฐ์ง๋ฅผ ํผํฉํ๋ ๊ฒ์ ๋งค์ฐ ์คํด์ ์์ง๊ฐ ์์ต๋๋ค.
๋ด๊ฐ ์ ํ ์์คํ
์ ๊ด์ฌ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ์ด ์ ์์ ์ ์ ์ ์ด๊ณ ๊ฑด์ ํ ์์น์ ์๋ฐฐ๋ฉ๋๋ค. ๊ฐ๊ณผ ์ ํ์ ํผํฉํ๊ณ ์ถ์ง ์์ต๋๋ค. ์๋ํ๋ฉด, ์, N
( usize
๋ผ๊ณ ๋งํ์ง ์์์์ ์ฃผ์, N
๋ผ๊ณ ๋งํ์ต๋๋ค), ๋น๋ก ๋น์ ์ด ๊ทธ๊ฒ์ด ๊ฐ์ด๋ผ๊ณ ์๊ฐํ๋๋ผ๋, ์ ํ์ ๋ ๊ฐ๊น์ต๋๋ค. ๊ฐ๋ณด๋ค. ์ด๋ก ์ ์ผ๋ก Haskell์๋ const ์ ๋ค๋ฆญ์ด ์์ง๋ง DataKinds
๊ฐ ์์ด ์ผ๋ฐ ๋ฐ์ดํฐ ์์ฑ์๋ฅผ ์ ํ์ผ๋ก ๋ค์ด ์ฌ๋ฆด ์ ์์ต๋๋ค.
foo :: Integer -> Integer
foo 0 -- 0 has type Integer
-- but
data P (a :: Integer)
type MyP = P 10 -- 10 has kind Integer, which โvalueโ is the 10 type
๊ทธ๋์:
fn foo<const X:ย usize>()
์ฌ๊ธฐ์ X
๋ ๊ฐ๋ณด๋ค ์ ํ์ ๋ ๊ฐ๊น์ต๋๋ค.
๋ํ, ๋๋ monomorphization์ ๊ด์ฌ์ด ์์ต๋๋ค. ๋ด๊ฐ ์ด๊ฒ์ ์ฝ๋๋ค๋ฉด :
let x = foo(12, "Hello, world!", None);
๊ทํ์ ์ ์์ผ๋ก foo
์ ์ ์๋ฅผ ์กฐํํ๋ฉด ์ด๋ค ์ธ์๊ฐ foo
๋ฅผ ๋จ์ผํํ ์ง ์๊ธฐ ์ด๋ ต์ต๋๋ค. const ์ ๋ค๋ฆญ์ ๋ํด ๋ค๋ฅธ ๊ฐ์ ์ ๋ฌํ ๋๋ง๋ค ์์ ํ ์๋ก์ด ํจ์๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์
๋๋ค.
_๋น์ ๊ณผ _๋น์ ์ ์ด์ _์ ๋ํด ๋ ์ง๊ด์ ์ผ๋ก ๋๊ปด์ง ์๋ ์์ง๋ง, ์ ํ ์ ํ์ฑ ์ธก๋ฉด์์ ์ ํ ์ง๊ด์ ์ด์ง ์๋ค๊ณ ๋งํ ์ด์ ๋ ์์ต๋๋ค. ๊ทธ๋ค์ด ์ธ์๋ผ๊ณ ๋งํ๋ ๊ฒ์ ์ํ์์ ๋งค๊ฐ๋ณ์๊ฐ ์๋ ํจ์์ ๋งค๊ฐ๋ณ์ ์ธ์๊ฐ ์๋ค๊ณ ๋งํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ๋งค๊ฐ๋ณ์์ ์ธ์๋ฅผ ํผ๋ํ์ฌ ๊ทธ ์์ด๋์ด๊ฐ ์ผ๋ง๋ ๋์์ง ๋ณด์ฌ์ค๋๋ค.
์ ๋ฅผ ์๋ชป ์ฝ์์ ์๋ ์์ต๋๋ค. ์ ๋ ํนํ " const
์ ๋ค๋ฆญ"์ด ์๋๋ผ " const
arguments ... are arguments "๋ผ๊ณ ๋งํ์ต๋๋ค. ๋ด ์ฒซ ๋ฒ์งธ Rust ์์ ๋ DataKinds์ ์ ํํ ๋์ผํฉ๋๋ค( usize<N>
๋ N
์ ์ ํ ์์ค ๋ฒ์ ์
๋๋ค). ์ฌ๊ธฐ์ ์ ํ ์ ํ์ฑ ์ธก๋ฉด์์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ง๊ด ์ธก๋ฉด์์ ์ฃผ์ฅํ๋ ๊ฒ์ด ์๋๋ผ ๊ธฐ์กด, ํ๋ฆฝ๋, ์ฌ์ด๋ ์ ํ ์์คํ
์ ๋ํ ์ ์ถ๋ก ์ฃผ์ฅํ๋ ๊ฒ์
๋๋ค.
๋จํํ์ ๋ํ ์ฐ๋ ค๋ ์ค๋๋ ๊ณผ ๋ค๋ฅด์ง ์์ต๋๋ค! ๋ชจ๋ ์ธ์๋ ์ ์ฌ์ ์ผ๋ก ์๋ก์ด ๋จํํ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค. ๋๋ ๋ํ ์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ด ๊ฐ๋ฅํ๋ฉด const ์ ๋ค๋ฆญ์ ๋ฐํ์ ๊ฐ์ผ๋ก ๋ณํํ๋ ๊ฒ์ ํฌํจํ์ฌ ์ธ์คํด์ค ๊ฐ์ ๋น์ข ์์ ์ธ ์ฝ๋๋ฅผ ๊ณต์ ํ์ฌ ๋ชจ๋ ์ ๋ค๋ฆญ์ ๋น์ฉ์ ์ค์ด๋ ๊ฒ์ด๋ผ๊ณ ๋ง๋ถ์์ต๋๋ค.
(๊ทธ๋ฆฌ๊ณ ๋ด๊ฐ ๋งค๊ฐ๋ณ์์ ์ธ์๋ฅผ ํผ๋ํ๊ณ ์๋ค๋ ๊ทํ์ ์ฃผ์ฅ์ ์์ ํ ์์ํดํ์ต๋๋ค. ์กฐ์ฌ์ค๋ฝ๊ฒ ๊ตฌ๋ถํ์ต๋๋ค.)
๋ฌด์จ ๋ง์ธ์ง ์ดํด๋ ํ์ง๋ง ์ฌ์ ํ ๋งค์ฐ ๊ฑฑ์ ๋ฉ๋๋ค. _argument_์ _const_ ํ๊ทธ๊ฐ ์ง์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ฐํ์์ _a value_ ์ ๋ฌํ ์ ์์์ ์๋ฏธํฉ๋๋ค. _const generic_์ ๋งคํ๋๋ _constant ๊ฐ_์ ์ ๋ฌํด์ผ ํฉ๋๋ค. ๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ์ฌ๊ธฐ์์ ์ธ๊ธํ์ง ์์์ง๋ง 10
๋ฅผ ์ ํ์ผ๋ก ๊ณ ๋ คํ๋ค๋ฉด ๊ทธ๊ฒ์ _์ฑ๊ธํค ์ ํ_์ ์์ฉ ํ๋ก๊ทธ๋จ์ผ ๋ฟ์
๋๋ค. ๊ฐ๋ฅํ ๋จ์ผ ๊ฐ์ 10
์
๋๋ค.
๋ด๊ฐ arg ์์น์์ impl Trait์ ๋ฐ๋ํ๊ธฐ ๋๋ฌธ์ ์ ๋ ๋ฐ๋ํฉ๋๋ค(์ฌ๊ธฐ์์ ๋น๊ตํ ์ ์๋ ์ด์ ๋ฅผ ์๊ฒ ๋ ๊ฒ์ ๋๋ค). ๋ช ๊ฐ์ง ์ฌํญ:
<โฆ>
๊ฐ (โฆ)
๋ณด๋ค ๋ ์ด๋ ต๋ค๊ณ ์๊ฐํ๋์ง ์ ๋ง ์๊ณ ์ถ์ต๋๋ค. ํนํ struct
๋ fn
๊ณ ๋ คํ ๋ ๊ทธ๋ ์ต๋๋ค. ํ์ฌ struct
์๋ <โฆ>
์๊ณ fn
์๋ ๋ ๋ค ๋งค๊ฐ๋ณ์๋ฅผ ์ค์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ ๋ค ์์ต๋๋ค.foo<A, B>
๋ฅผ ์ฝ์ ๋ ํจ์ ์ ์์ ๊ตฌํ์ ์์ฑํ๋ ๋ ๊ฐ์ ๋งค๊ฐ๋ณ์๊ฐ ์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.๋๋ ๋น์ ์ด ์ฌ๊ธฐ์ ๋ฌด์์ ํ๊ณ ์ถ์์ง ๋๋๋๋ค. foo(1, 3)
๊ฐ foo<3>(1)
๋ณด๋ค๋ ๋น์ ์๊ฒ ๋ ์ข๊ฒ ๋๊ปด์ง์ง๋ง ์ ๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ๊ทธ ์ด์ ๋ foo(1, 3)
๊ฐ ๋ฐํ์ ๊ธฐ๋ฐ์ ๋ ๋ฒ์งธ ์ธ์๋ฅผ ์๋ฝํด์ผ ํ๊ณ ์ ์ํ ์ ์์์ ์ด๋ฅผ ๊ธ์งํ๊ธฐ ๋๋ฌธ์
๋๋ค. ํนํ ์ด๋ ์ด์์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ณผ ์ ์์ง๋ง ํ์ฌ๋ก์๋ ๊ทธ ๋ชจ์์ด ๋ง์์ ๋ค์ง ์์ต๋๋ค. "์ธ์๊ฐ const
์ด๋ฉด ์ ํ ๋ณ์ / const ์ ๋ค๋ฆญ์ ์ ์ถํ ์ ์์ต๋๋ค.
fn foo<const N: usize>(a: usize, b: usize | N);
์ด๊ฒ์ ์ ์์ ์ ์ค๋ช
ํ๊ธฐ ์ํด ์๊ฐํด๋ธ ๊ฐ์์ ๊ตฌ๋ฌธ์
๋๋ค. b
๋ฅผ const ๊ฐ์ผ๋ก ์ ๋ฌํ๋ฉด N = b
๋ฉ์ง ๊ตฌ๋ฌธ์ผ๋ก ๋๋ฉ๋๋ค.
foo(1, 3)
b
๊ฐ const ๊ฐ์ด ์๋ ๊ฒฝ์ฐ N
๋ช
์์ ์ผ๋ก ์ ๋ฌํด์ผ ํฉ๋๋ค.
foo<3>(1, x)
๋ํ ๊ทํ์ ์ ์๊ณผ ํจ๊ป ์ด์ ๋ํ ๊ตฌ๋ฌธ์ ๋ฌด์์ ๋๊น?
fn foo<const N: usize>(x: [f32; N]);
fn new(const W: usize, const H: usize) -> MatrixF32<W, H> { .. }
์ด๊ฒ์ ์ฐ๊ด๋ ํญ๋ชฉ์ ๋ํ ์ง๋ฌธ์ผ๋ก ์ด์ด์ง๋๋ค. ๊ฐ๋จํ ๋งํด์
new()
๋ ์ฐ๊ด ๊ธฐ๋ฅ์ด๋ฉฐ ๊ตฌ์ฒด์ ์ธ ์ ํ๊ณผ ์ฐ๊ด๋์ด์ผ ํฉ๋๋ค. const ์ ๋ค๋ฆญ ํญ๋ชฉ์ "์ด ๋งค๊ฐ๋ณ์๊ฐ ์๋ ์ ํ...", ์ฆ ์ข ์ ์ ํ๊ณผ ๊ฐ์ ์๋ฏธ๋ฅผ ๊ฐ์ต๋๋ค. ๋ฐ๋ผ์ ์ปจํ ์คํธ์new()
์๋ ์ธ์๊ฐ ์์ด์ผ ํฉ๋๋ค. ๋ช ์์ ์ฌ์ฉ์Type<32>::new()
์ ๊ฐ์์ผ ํฉ๋๋ค. ๋ฌผ๋ก ๋ชจ๋ const ์ ๋ค๋ฆญ ์ธ์๋ ์๋ต ๊ฐ๋ฅํด์ผ ํฉ๋๋ค.
๋๋ ๋น์ ์ด ์ฌ๊ธฐ์ ๋ฌด์์ ํ๊ณ ์ถ์์ง ๋๋๋๋ค. foo(1, 3)๋ foo<3>(1)๋ณด๋ค ๋น์ ์๊ฒ ๋ ๋์ ๋๋์ ์ฃผ์ง๋ง ๋๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ๊ทธ ์ด์ ๋ foo(1, 3)๊ฐ ๋ฐํ์ ๊ธฐ๋ฐ์ ๋ ๋ฒ์งธ ์ธ์๋ฅผ ์๋ฝํด์ผ ํ๊ณ ์ ์ํ ์ ์์์ ์ด๋ฅผ ๊ธ์งํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๊ฒ์ ๋ด ๋๊ธฐ๋ ์๋๋ ์๋๋๋ค. "๋๋์ด ๋ ์ข์" ๊ฒ์ ๋ํด ๋งํ๋ ๊ฒ์ด ์๋๋ฉฐ ์ปดํ์ผ/๋ฐํ์ ๊ตฌ๋ถ์ ์ ํ/๊ฐ ์์ค ๊ตฌ๋ถ๊ณผ ํตํฉํด์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๋์ ์ด๋ฏธ ๋ถ๋ฆฌ๋์ด ์์ต๋๋ค. const
ํญ๋ชฉ(๊ฐ ๋๋ fn)์ ํ์คํ ์ ํ์ด ์๋๋๋ค!
๋ด๊ฐ ์ป๊ณ ์๋ ๊ฒ์ ์ ํ ์ถ๋ก ์ด ๊ฐ ์์ค ๋งค๊ฐ๋ณ์์ ์ ํ ์์ค ๋งค๊ฐ๋ณ์ ๊ฐ์ ๊ทธ๋ฆฌ๋ ์๋ฏธ๋ก ์ ์ฐ๊ฒฐ๋ฟ์
๋๋ค. impl Trait
์ ์๋ฌด ๊ด๋ จ์ด ์์ต๋๋ค. ๋ค์ ๋งํ์ง๋ง ๋ด ์์ ์ const ์ธ์๋ฅผ impl Trait
์ ๊ตฌ๋ณ ํ์ฌ ์ด๋ฌํ ์ข
๋ฅ์ ๋น์์ฐ์ ์ธ ๋ถ์์ ์ ํํ ๋ฐฉ์งํ๋ ๊ฒ์
๋๋ค.
๋ํ ๊ทํ์ ์ ์๊ณผ ํจ๊ป ์ด์ ๋ํ ๊ตฌ๋ฌธ์ ๋ฌด์์ ๋๊น?
fn foo<const N: usize>(x: [f32; N]);
๊ทธ ๊ตฌ๋ฌธ์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค! ๋๋ ์ฐ๋ฆฌ๊ฐ ์ ํ ์์ค์์ const ๋งค๊ฐ๋ณ์๋ฅผ ์ ๊ฑฐํ์๊ณ ์ ์ํ๋ ๊ฒ์ด ์๋๋ผ(๊ตฌ๋ฌธ์ ์ผ๋ก๋ ์๋ฏธ์ ์ผ๋ก), ๋จ์ง ๋ถ๋ถ์ ์ผ๋ก ์ ํ ์์ค์ ์ถ๋ก ์ ๋๊ธฐ ์ํด ๊ฐ ์์ค์ ์ถ๊ฐํ๋ค๋ ๊ฒ์ ๋๋ค.
cppcon์์ constexpr ํจ์ ๋งค๊ฐ๋ณ์์ ๋ํ ์ด์ผ๊ธฐ๊ฐ ์์๋๋ฐ, @PvdBerg1998 ์ด ๋งํ๋ ๊ฒ๊ณผ ์ ์ฌํ๊ณ @mark-im์ด ๋งํฌํ ๋ด๋ถ ์ค๋ ๋์ฒ๋ผ ๋ณด์ ๋๋ค. ๊ฑฐ๊ธฐ์ ํธ์์ด ์ข์ ๊ฒ ๊ฐ๋ค.
์ข์ ์๊ฐ์ธ ๊ฒ ๊ฐ์ง๋ง const-generics์ ๋ํ ์ด๊ธฐ ๊ตฌํ์ด ์๋ฃ๋ ํ์ ํด๊ฒฐํด์ผ ํฉ๋๋ค.
ํธ์ง: ์ด๊ฒ์ ํด๋น ์ค๋ ๋์์ ์ธ๊ธ๋์์ต๋๋ค. ์ฌ๊ธฐ์ constexpr ํจ์ ๋งค๊ฐ๋ณ์์ ๋ํ ๊ด๋ จ ๋ฌธ์๊ฐ ์์ต๋๋ค.
https://github.com/davidstone/isocpp/blob/master/constexpr-parameters.md
๋ด๋ถ ์ค๋ ๋ ๋๋ RFC ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋ฌธ์ (๋๋ PR ์์ )์ ๋ํ ์ค์ํ ๊ตฌ๋ฌธ ๋ณ๊ฒฝ์ ๋ํ ๋ ผ์๋ฅผ ์์ฝํด ๋ฌ๋ผ๊ณ ์์ฒญํ๊ณ ์ถ์ต๋๋ค. ์ด ๋ฌธ์ ์ ์ฃผ์ ์น์ ์ ์ด๋ฏธ ์๋นํ ๊ธธ๋ฉฐ ๋ฌธ์ ์ ๊ตฌ๋ฌธ์ const ์ ๋ค๋ฆญ์ ์ฌ์ฉ ๊ฐ๋ฅํ MVP์ ๋ถํ์ํ ๊ฒ ๊ฐ์ต๋๋ค.
๋๊ธ์ ์ฎ๊ธธ ์ ์๋ค๋ฉด ์๋ง ๊ทธ๋ ๊ฒ ํ ๊ฒ์ ๋๋ค. @rust-lang ํ ๊ตฌ์ฑ์์๊ฒ ๋ฌธ์ ๋ฅผ ์ ๊ทธ๊ณ ์ฃผ์ ๊ฐ ์๋ ๋ชจ๋ ๋๊ธ์ ์จ๊ธฐ๊ณ ์ถ์ต๋๊น?
๋ชจ๋ ์ค๊ณ ๋ ผ์๋ RFC ๋ฆฌํฌ์งํ ๋ฆฌ์์ ์ด๋ฃจ์ด์ ธ์ผ ํ๋ฉฐ ๋ชจ๋ ๋ฒ๊ทธ ๋ณด๊ณ ์๋ ๋ณ๋์ ๋ฌธ์ ์ ์์ด์ผ ํฉ๋๋ค.
cc @rust-lang/moderation ์ด๋ ๊ฒ ํ๋ ์ ๋ก๊ฐ ์์ต๋๊น?
๋๊ธ์ ๋ฌธ์ ๋ก _๋ณํ_ํ ์ ์์ง๋ง ๋๊ธ์ ์ด๋ํ ์๋ ์์ต๋๋ค. ์ ๊ธ์ ๊ด์ฐฎ๊ณ ์ฃผ์ ๋๊ธ์ ์จ๊ธฐ๊ฒ ์ต๋๋ค.
์ํด๊ฐ ์์๋๋ฉด์ ํ์ฌ const ์ ๋ค๋ฆญ์ด ์๋ ์์น์ ๋ํ ๋ ๋ค๋ฅธ ์ ๋ฐ์ดํธ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ์ข์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค. const ์ ๋ค๋ฆญ RFC ๊ฐ ๋ฐ์๋ค์ฌ์ง ์ง 2๋ ์ด ์กฐ๊ธ ๋์์ต๋๋ค. ์ฒซํด(์ฝ 2018๋ )์ ์ปดํ์ผ๋ฌ ์ ์ฒด์์ ์ผ๋ฐ์ ์ผ๋ก ์ ๋ค๋ฆญ ๋งค๊ฐ๋ณ์ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ ํ์ฌ const ์ ๋ค๋ฆญ์ ์ฉ์ดํ๊ฒ ํ๊ธฐ ์ํด ์ผ๋ จ์ ๋๊ท๋ชจ ๋ฆฌํฉํ ๋ง ๋ ธ๋ ฅ์ด ์ฐฉ์๋์์ต๋๋ค. ๋ ๋ฒ์งธ ํด(์ฝ 2019๋ )์ const ์ ๋ค๋ฆญ ์์ฒด๋ฅผ ๊ตฌํํ๋ ์์ ์ด ์์๋์์ต๋๋ค. ๋จผ์ ์ต์ํ์ ์์ ์ ์ํํ ๋ค์ ๊ธฐ๋ฅ์ ๋ฌด๊ฒฐ์ฑ์ ๋๋ฆฌ๊ฒ ๊ฐ์ ํ๋ ๊ฒ์ ๋๋ค. ์ฌ๋๋ค์ ๋ํ ์ปดํ์ผ๋ฌ ์์ฒด์์ const ์ ๋ค๋ฆญ์ ์ฌ์ฉํ๋ ์คํ์ ์์ํ์ต๋๋ค. ์ด๋ฌํ ๋ ธ๋ ฅ์ ๋ํ ์์ธํ ์ค๋ช ์ ์ฒ์ ๋ ๊ฐ์ ์ ๋ฐ์ดํธ ๊ฒ์๋ฌผ [1] , [2] ์ ์์ต๋๋ค.
๋ง์ง๋ง ์ ๋ฐ์ดํธ ์ดํ ์ง๋ ๋ช ๋ฌ ๋์ ์ข์ ์ง์ ์ด ์์์ต๋๋ค.
{}
๋ก ๋ํํ ํ์๊ฐ ์๋๋ก type ๋ฐ const ๋งค๊ฐ๋ณ์์ ๋ช
ํ์ฑ์ ๊ตฌํํ์ต๋๋ค(https://github.com/rust-lang/rust/pull/66104).structural_match
๊ฒ์ฌ๋ฅผ ๊ตฌํํ์ต๋๋ค(https://github.com/rust-lang/rust/pull/65627).const ์ ๋ค๋ฆญ์ ๋์์ฃผ์ ๋ชจ๋ ๋ถ๋ค๊ป ์ง์ฌ์ผ๋ก ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
๋ฌด์ ํฅํ ๊ณํ? ํ์ฌ const ์ ๋ค๋ฆญ์ ๋ํ ๊ฐ์ฅ ํฐ ์ฐจ๋จ๊ธฐ๋ ์ง์ฐ ์ ๊ทํ ์ด๋ฉฐ, ์ด๋ ํน์ ์ข ๋ฅ์ const ์ ๋ค๋ฆญ ๊ฒฝ๊ณ(์: arrays )์ ํ์ํฉ๋๋ค. @skinny121 ์ ํ์ฌ ์ง์ฐ ์ ๊ทํ๋ฅผ ์์ ๊ธฐ ์ํ ํ์์ ์ธ ๋ ธ๋ ฅ์ ๊ณ์ํ๊ณ ์์ต๋๋ค. ์ด๊ฒ์ const ์ ๋ค๋ฆญ๊ณผ ๊ด๋ จ๋ ๋ง์ ํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒ์ ๋๋ค.
๊ฒ์ผ๋ฅธ ์ ๊ทํ๋ ์ ์ณ๋๊ณ , ์ฐ๋ฆฌ๊ฐ ํด๊ฒฐํ๊ณ ์ถ์ ๋ฒ๊ทธ์ ํ์ดํผ์ปท ์ด ์ฌ์ ํ ์๋นํฉ๋๋ค. ๋๋จธ์ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๊ด์ฌ์ด ์๋ค๋ฉด ํด๋น ๋ฌธ์ ์ ๋ํด ์ ์๊ฒ ํ์ ๋ณด๋ด๊ฑฐ๋ Discord ๋๋ Zulip์์ ์์์ ๋ํ ํฌ์ธํฐ๋ฅผ ์ป์ผ์ญ์์ค. ๋๋ ์ฐ๋ฆฌ๊ฐ 2020๋ ์ ์ข์ ์ง์ ์ ์ด๋ฃฐ ์ ์๊ณ ์์ ํ๊ฐ ์คํ ๊ฐ๋ฅํ ํ ๋ก ์ด ๋๋ ์ง์ ์ ๋๋ฌํ ์ ์๋ค๊ณ ํ์ ํฉ๋๋ค!
์ง์ฐ ์ ๊ทํ์ ๋๋ฌํ์ง ์๊ณ ๋ฒ๊ทธ์ ํ์ดํผ์ปท์ด ๋ง์ง ์์ง๋ง ์ ์ฉํ ์ฝ๋๋ฅผ ๋ง์ด ํํํ ์ ์๋ const ์ ๋ค๋ฆญ์ ํ์ ์งํฉ์ด ์์ต๋๊น? ๋ฐฐ์ด์ ๋ํ ๋ง์ ํน์ฑ์ ๋ํ std์ impls๊ฐ ์ ๋๋ก ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ ๋ฉ์ง ๊ธฐ๋ฅ์ ๋ชจ๋ ์ง์ํ์ง ์๋๋ผ๋ ๋ค๋ฅธ ํฌ๋ ์ดํธ๊ฐ ๊ณ ์ ํ ํน์ฑ์ ๋ํด ํ์ค์ ์๋ ์ข ๋ฅ์ impl์ ์์ฑํ ์ ์๋๋ก ํ๋ ์ถ์๊ฐ ์์ ์ ์์ต๋๊น?
์ด์ ํ ํด์ ์ ๋ฐ์ด ์ง๋ฌ์ผ๋ฏ๋ก ์งํ ์ค์ธ ์์ ์ ๊ฐ๋ตํ๊ฒ ์์ฝํ๊ฒ ์ต๋๋ค. ์ง๋ 6๊ฐ์ ๋์ const ์ ๋ค๋ฆญ ์ง์ ๊ฐ์ ์ ๊ด๋ จ๋ ๋ง์ ์ฌ๋๋ค์ด ์์์ต๋๋ค. ๊ทธ๋์ ์ด๋ค ์์ผ๋ก๋ ๋์์ ์ฃผ์ ๋ชจ๋ ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค! ํนํ ์์์ ๋ํ ์ง์ฐ ์ ๊ทํ ์ ๋ฉ์๋ ํธ์ถ์์ const ์ธ์ ์ง์ , ์๋ง์ ์ด๋ ค์ด ๋ฒ๊ทธ๋ฅผ ์์ ํ๋ ๋ฑ const ์ ๋ค๋ฆญ์ด ํ๋์ ๋ถ์กฑํ๋ ๋ช ๊ฐ์ง ํฐ ๊ธฐ๋ฅ์ ์ฒ๋ฆฌํ @skinny121 ๋ฐ @lcnr ์๊ฒ ํนํ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๊ทธ๋ค์ ๋ ธ๋ ฅ์ ์๋ ์์ฝ์์ ๋ถ๋ช ํฉ๋๋ค.
CONST ์ ๋ค๋ฆญ ์ด์ ์ปดํ์ผ๋ฌ๋ฅผ ํตํด ์ฌ๋ฌ ๊ณณ์์ ์ฌ์ฉ๋๊ณ ์์ผ๋ฉฐ, ์คํ์ ํน์ฑ๊ณผ ๊ธฐ๋ฅ์ ์๋ฅผ ๋ค์ด, CONST ์ ๋ค๋ฆญ์ ํ์ฉํ์ฌ ์ด๋ฏธ ๊ฑฐ๊ธฐ์ slice::array_chunks
๋ฐ IntoIterator
๋ฐ FromIterator
์ ๋ํด [T; N]
(https://github.com/rust-lang/rust/pull/65819, https://github.com/rust-lang/rust/pull/69985). ๋ฐฐ์ด ํน์ฑ ๊ตฌํ์ ์ํ ๊ธธ์ด 32 ์ ํ๋ ๋ง์นจ๋ด ์ ๊ฑฐ ๋
์ฐ๋ฆฌ๋ ํ์ฌ ๊ด๋ฒ์ํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ค๋ฃจ์ด์ผ ํ๋ const ์ ๋ค๋ฆญ ์
unused_braces
๋ํ ๋ฆฐํธ ์ถ๊ฐ(https://github.com/rust-lang/rust/pull/70081)dyn Trait
๊ธ์ง(https://github.com/rust-lang/rust/pull/71038)const ์ ๋ค๋ฆญ์ ์ด๋ฏธ ๋จผ ๊ธธ์ ์์ง๋ง ์ฌ์ ํ ๋ฒ๊ทธ์ ๋ ์นด๋ก์ด ๋ชจ์๋ฆฌ๊ฐ ์์ต๋๋ค. ๋๋จธ์ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๊ด์ฌ์ด ์๋ ๊ฒฝ์ฐ ํด๋น ๋ฌธ์ ์ ๋ํด @lcnr ๋๋ @eddyb ๋๋
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ค์์ const ์ ๋ค๋ฆญ์ ๋ํ ์งํ ์ํฉ์ ์์ฝํ ๊ฒ์ ๋๋ค.
const ์ ๋ค๋ฆญ์ ๋ํ ์์ ์ด ์ ๋๋ก ์์๋๊ธฐ ์ ์ ์ํํด์ผ ํ ๋ช ๊ฐ์ง ๋ฆฌํฉํ ๋ง์ด ์์์ต๋๋ค. @jplatte ๋ https://github.com/rust-lang/rust/pull/45930 ์์ ์์ ์ ์ํํ์ต๋๋ค @jplatte ๋ const ์ ๋ค๋ฆญ์ ์ฃผ์ ๊ตฌํ ์์ ์
@yodaldevoid ์ ๋๋ @jplatte ๊ฐ ์ค๋จํ ๋ถ๋ถ์ ์ง์ด https://github.com/rust-lang/rust/pull/48149 , https://github.com/rust-lang/rust/pull /48452 , https://github.com/rust-lang/rust/pull/48523 , https://github.com/rust-lang/rust/pull/51880.
์ด๋ ๊ฒ ํ๋ฉด const ์ ๋ค๋ฆญ ๊ตฌํ์ด ๋ณธ๊ฒฉ์ ์ผ๋ก ์์๋ ์ ์์ต๋๋ค. ๊ทธ ์ดํ๋ก @yodaldevoid ์ ์ ๋ ๋๋ฆฌ์ง๋ง ํ์คํ const ์ ๋ค๋ฆญ์ ๋ํ ์ง์์ ์ ์ง์ ์ผ๋ก ์ถ๊ฐํ๊ณ ์์ต๋๋ค. https://github.com/rust-lang/rust/pull/58191 , https://github.com/rust-lang/rust /pull/58503 , https://github.com/rust-lang/rust/pull/58581 , https://github.com/rust-lang/rust/pull/58583 , https://github.com/rust -lang/rust/pull/59170 , https://github.com/rust-lang/rust/pull/59355 , https://github.com/rust-lang/rust/pull/59415 , https://github .com/rust-lang/rust/pull/60058 , https://github.com/rust-lang/rust/pull/60280 , https://github.com/rust-lang/rust/pull/60284 ๋ฐ ๋๋ถ๋ถ์ ์ต๊ทผ https://github.com/rust-lang/rust/pull/59008. (์ด๋ค์ ๋๋ถ๋ถ ์ฃผ์ const ์ ๋ค๋ฆญ ํ ์์ฒญ ์์ ๋ถ๋ฆฌ๋์์ต๋๋ค.)
์ง๊ธ ์ํ๋ ์ด๋ป์ต๋๊น? ์ผ๋ถ const ์ ๋ค๋ฆญ ํ ์คํธ๊ฐ ์ด์ ์๋ํฉ๋๋ค ๐๊ทธ๋ฌ๋ ์ฌ์ ํ ์๋ํ์ง ์๋ ํ ์คํธ๊ฐ ์์ผ๋ฉฐ ์ฝ๋ ์ ์ฒด์ ์ฌ์ ํ ํด๊ฒฐํด์ผ ํ๋
FIXME
๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์ด์ ๊ฐ๊น์์ง๊ณ ์์ผ๋ฉฐ ๋์์ ์ํ์ ๋ค๋ฉด ์ฝ๊ฐ์ ์ฑ๊ณผ๊ฐ ์์ ์ ์๋ ๋จ๊ณ์ ์์ต๋๋ค.FIXME(const_generics)
ํฉ์ด์ ธ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ๋ค์ ํตํด ์์ ํ ๊ณํ์ด์ง๋ง @yodaldevoid ์ ์ ์๊ฒ๋ ์๊ฐ์ด ๋๋ฌด ๋ง์ต๋๋ค. ๋ฐ๋ผ์ ํ๋๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค๊ณ ์๊ฐ๋๋ฉด ๊ณ์ ์งํํ์ญ์์ค(๋น๋ก ๋๊ธ์ ๋ง์ด ๋จ๊ธฐ๊ณ ์ถ์ ์๋ ์์ผ๋ฏ๋ก ๊ทธ๋ ๊ฒ ํ์ง ์์ต๋๋ค. t ์ค๋ณต ๋ ธ๋ ฅ).๋๋ const ์ ๋ค๋ฆญ์ด ์ ์ ํ ํ ์คํธ๋ฅผ ์ํด ์ค๋น๋๊ธฐ ์ ์ ๋๋จธ์ง ๊ตฌํ ๋ฌธ์ ์ค ์ผ๋ถ์ ๋ํ ๊ฐ์๋ฅผ ์์ฑํ์ต๋๋ค.
์๊ฐ์ด ๊ฑธ๋ฆฌ๊ธด ํ์ง๋ง ์ฐ๋ฆฌ๋ ๊พธ์คํ ๋ฐ์ ํด ์์ผ๋ฉฐ ๊ทธ ์๋๋ฅผ ๋ฐ๋ผ๊ฐ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋ง์นจ๋ด ์ ์๋ฆฌ์ ๋จ์ด์ง๊ธฐ ์์ํ๋ ๊ฒ์ ๋ณด๋ ๊ฒ์ ๋๊ธฐ๋ฅผ ๋ถ์ฌํฉ๋๋ค!