Rust: const ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ์ถ”์  ๋ฌธ์ œ(RFC 2000)

์— ๋งŒ๋“  2017๋…„ 09์›” 15์ผ  ยท  202์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: rust-lang/rust

Rust-lang/rfc#2000์— ๋Œ€ํ•œ ์ถ”์  ๋ฌธ์ œ

์—…๋ฐ์ดํŠธ:

๋„์›€์„ ์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด open const ์ œ๋„ค๋ฆญ ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ณ  @varkor , @eddyb , @yodaldevoid , @oli-obk ๋˜๋Š” @lcnr ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์š”์ฒญํ•˜์‹ญ์‹œ์˜ค.


๋ธ”๋กœํ‚น ์•ˆ์ •ํ™”:

  • [ ] ์„ค๊ณ„:

    • [ ] ๊ธฐ๋ณธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ const ๋ฐ type ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ˆœ์„œ ํ•ด๊ฒฐ

    • [ ] ์ถ”์ƒ์ ์ธ const ํ‘œํ˜„์‹์„ ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์ƒ์˜ UX/๊ตฌํ˜„ ๋น„์šฉ ๊ท ํ˜•์ด ๋ฌด์—‡์ธ์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

    • [ ] const ํ‘œํ˜„์‹์˜ ์˜ฌ๋ฐ”๋ฅธ ๊ตฌ์„ฑ์„ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•.

  • [x] ๊ตฌํ˜„
  • [ ] ๋ฌธ์„œ

    • [ ] Rustc ๊ฐ€์ด๋“œ


๋‚˜๋จธ์ง€ ๊ตฌํ˜„ ๋ฌธ์ œ:

  • [ ] ๋‹ค์–‘ํ•œ FIXME(const_generics) ๋Œ“๊ธ€์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  • [ ] ์ •๊ทœํ™”/์ง€์—ฐ ์ •๊ทœํ™”์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  • [ ] ํŒจํ„ด์—์„œ const ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ฒ˜๋ฆฌ๋ฅผ ์กฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
  • [ ] ๋” ๋งŽ์€ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • [ ] const ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๊ธฐ๋ณธ๊ฐ’์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค( FIXME(const_generics:defaults) ).
  • [ ] ๊ธฐํƒ€ A-const-generics ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •
  • [ ] has_infer_types ์‚ฌ์šฉ ๊ฐ์‚ฌ
  • [x] ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•˜๋Š” const ์ธ์ˆ˜์— ๋Œ€ํ•ด ๋ณต์žกํ•œ ํ‘œํ˜„์‹์„ ๊ธˆ์ง€ํ•ฉ๋‹ˆ๋‹ค(ํ˜„์žฌ๋กœ์„œ๋Š” {X * 2} .
  • [ ] ๊ฐ์‚ฌ ์ง„๋‹จ(์˜ˆ: https://github.com/rust-lang/rust/pull/76401#discussion_r484819320).
A-const-fn A-const-generics A-typesystem B-RFC-approved C-tracking-issue F-const_generics T-compiler T-lang requires-nightly

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‹ค์Œ์€ 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 ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์ด์ œ ๊ฐ€๊นŒ์›Œ์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๋„์›€์„ ์›ํ•˜์‹ ๋‹ค๋ฉด ์•ฝ๊ฐ„์˜ ์„ฑ๊ณผ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ๋‹จ๊ณ„์— ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ฒซ์งธ, ๋” ๋งŽ์€ ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ const ์ œ๋„ค๋ฆญ ํ…Œ์ŠคํŠธ ๋Š” ์†Œ์ˆ˜์— ๋ถˆ๊ณผํ•˜์ง€๋งŒ ๋” ๋งŽ์€ ๊ฒƒ์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ๋กœ์„œ๋Š” ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋ฅผ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ„๊ทธ ๋ณด๊ณ ์„œ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์ƒ๊ฐ๋‚˜๋ฉด(๊ทธ๋ฆฌ๊ณ  ๊ธฐ์กด ํ…Œ์ŠคํŠธ์™€ ๋„ˆ๋ฌด ์œ ์‚ฌํ•ด ๋ณด์ด์ง€ ์•Š์Œ) ์ž์œ ๋กญ๊ฒŒ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์—ด์–ด ์ถ”๊ฐ€ํ•˜์„ธ์š”.
  • ๋‘˜์งธ, ์–ธ๊ธ‰ํ•œ ๋ฐ”์™€ ๊ฐ™์ด ์ฝ”๋“œ ์ „์ฒด์— FIXME(const_generics) ํฉ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ๋“ค์„ ํ†ตํ•ด ์ž‘์—…ํ•  ๊ณ„ํš์ด์ง€๋งŒ @yodaldevoid ์™€ ์ €์—๊ฒŒ๋Š” ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•˜๋‚˜๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด ๊ณ„์† ์ง„ํ–‰ํ•˜์‹ญ์‹œ์˜ค(๋น„๋ก ๋Œ“๊ธ€์„ ๋งŽ์ด ๋‚จ๊ธฐ๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. t ์ค‘๋ณต ๋…ธ๋ ฅ).

๋‚˜๋Š” const ์ œ๋„ค๋ฆญ์ด ์ ์ ˆํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์ค€๋น„๋˜๊ธฐ ์ „์— ๋‚˜๋จธ์ง€ ๊ตฌํ˜„ ๋ฌธ์ œ ์ค‘ ์ผ๋ถ€์— ๋Œ€ํ•œ ๊ฐœ์š”๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๊ธด ํ–ˆ์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ๊พธ์ค€ํžˆ ๋ฐœ์ „ํ•ด ์™”์œผ๋ฉฐ ๊ทธ ์†๋„๋ฅผ ๋”ฐ๋ผ๊ฐˆ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋งˆ์นจ๋‚ด ์ œ์ž๋ฆฌ์— ๋–จ์–ด์ง€๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์€ ๋™๊ธฐ๋ฅผ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค!

๋ชจ๋“  202 ๋Œ“๊ธ€

44275 ConstEvaluatable ์ˆ ์–ด๋ฅผ ์ถ”๊ฐ€ํ–ˆ๊ณ  expr ๊ฐ€ ๋Š๋ฆฌ๊ฒŒ ํ‰๊ฐ€๋˜๊ธฐ ๋•Œ๋ฌธ์— WF([T; expr]) ์—๋Š” ์ด์ œ ConstEvaluatable(expr) ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค(์ •์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด์ผ์ง€๋ผ๋„). ์ด ์ˆ ์–ด๋ฅผ ์ถฉ์กฑํ•˜๋ ค๋ฉด ํ‘œํ˜„์‹์ด ์„ฑ๊ณต์ ์œผ๋กœ ํ‰๊ฐ€๋˜์–ด์•ผ ํ•˜์ง€๋งŒ ์ •๊ทœํ™”๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ์ฐพ์€ Unevaluated ํ‘œํ˜„์‹์„ ๊ทธ๋Œ€๋กœ ๋‘ก๋‹ˆ๋‹ค. ์ด๋Š” ๊ด€๋ จ ์œ ํ˜• ํ”„๋กœ์ ์…˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ์‹œ์Šคํ…œ์ด const ์ œ๋„ค๋ฆญ์œผ๋กœ ํ™•์žฅ๋  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

@EpicatSupercell ์€ ์ด ์ž‘์—…์— ๊ด€์‹ฌ์„ ํ‘œ๋ช…ํ–ˆ์œผ๋ฉฐ ์ดˆ๊ธฐ ๊ตฌํ˜„์„ ํ†ตํ•ด ๋ฉ˜ํ† ๋งํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ #44275์— ์„ค๋ช…๋œ ์ œํ•œ ์‚ฌํ•ญ ๋•Œ๋ฌธ์— ๋„ˆ๋ฌด ๋ฉ€๋ฆฌ ๊ฐˆ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์ฆ‰, ์šฐ๋ฆฌ๋Š” @nikomatsakis ์˜ ์ง€์—ฐ ์ •๊ทœํ™”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜•์— ํฌํ•จ๋œ ์ƒ์ˆ˜ ํ‘œํ˜„์‹์ด ์ ˆ๋ฐ˜์˜ ์ˆœํ™˜ ์ข…์†์„ฑ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ๋ฒ”์œ„(ํ•จ์ˆ˜/์œ ํ˜• ์ •์˜/impl ๋“ฑ ํ•ญ๋ชฉ์—์„œ) ๋ฒ”์œ„์˜ ๊ฒฝ๊ณ„๋ฅผ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌํ˜„ ์›จ์ดํฌ์ธํŠธ(๋ณด๋‹ค ์ง์ ‘์ ์ธ ๋ฉ˜ํ† ๋ง์„ ์›ํ•˜๋ฉด Gitter์—์„œ @eddyb ๋˜๋Š” IRC์—์„œ eddyb ):

  • ์„ ์–ธ/๊ตฌ๋ฌธ:

    • ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ: AST ๋ฐ HIR - ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ํ•จ๊ป˜ const ๋งค๊ฐœ๋ณ€์ˆ˜ ์ถ”๊ฐ€

    • ๊ตฌ๋ฌธ ๋ถ„์„: parse_generic_params - const IDENT: Type ๊ตฌ๋ฌธ ๋ถ„์„

    • ๊ธฐํƒ€: ๋ฐฉ๋ฌธ( AST , HIR ), ์ ‘๊ธฐ( AST ), ๋‚ฎ์ถ”๊ธฐ( HIR ), HIR ๋งต , DefId ์ˆ˜์ง‘๊ธฐ

  • ์„ ์–ธ / ์˜๋ฏธ๋ก 

    • ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ: ty::Generics - ์œ ํ˜• 1๊ณผ ํ•จ๊ป˜ const ๋งค๊ฐœ๋ณ€์ˆ˜ ์ถ”๊ฐ€

    • HIR์—์„œ ๋ณ€ํ™˜: generics_of - ty::ConstParameterDef ์—์„œ hir::ConstParam

  • ์‚ฌ์šฉ/์ด๋ฆ„ ํ™•์ธ

    • ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ: Def - const ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋ณ€ํ˜• ์ถ”๊ฐ€

    • ์ด๋ฆ„ ํ™•์ธ ํŒจ์Šค: with_type_parameter_rib - ์œ ํ˜• ๋ฐ const ์ œ๋„ค๋ฆญ ๋ชจ๋‘ ์ง€์›

  • ์‚ฌ์šฉ / ์˜๋ฏธ

    • ConstVal - ty::TyParam ์™€ ์œ ์‚ฌํ•œ Param ๋ณ€ํ˜• ์ถ”๊ฐ€

    • HIR์—์„œ ๋ณ€ํ™˜ : 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๊ฐ€ ์–ธ์ œ์ธ์ง€ ์•„์‹ญ๋‹ˆ๊นŒ? :-)

๊ฑด๋ฐฐ, @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 ์ ˆ์— ์žˆ์Šต๋‹ˆ๊นŒ?)์™€ ๊ฐ™์€ ๋ฐฉ์ •์‹์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ์ •์‹์€ ๋“ฑ์‹ ๊ฒ€์‚ฌ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ผ๋ถ€ ํ˜•ํƒœ์˜ ์ผ์น˜ ์ข…๋ฃŒ ์‚ฌ์šฉ). ์ด๋Ÿฌํ•œ ์ œ๊ณต๋œ ๋ฐฉ์ •์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ์ •์˜๋Š” ๊ฑฐ๋ถ€๋ฉ๋‹ˆ๋‹ค.
  • monomorphic ํ™•์žฅ ์ง€์ ์—์„œ ๋ชจ๋“  ๋ฐฉ์ •์‹์€ ๋” ์ด์ƒ ์ถ”์ƒ์ ์ด์ง€ ์•Š์€ const expr์„ ์‹ค์ œ๋กœ ๊ณ„์‚ฐํ•˜์—ฌ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋””์ž์ธ ์„ ํƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฉ์ •์‹์ด 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]; )

  • ์„œ๋ช… ๋‚ด์˜ ์ธ์ˆ˜ ์œ„์น˜์— ์žˆ์Šต๋‹ˆ๋‹ค.

    • (๋ฐ˜ํ™˜ ์œ„์น˜๋„ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ธฐ์–ตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. @nikomatsakis?)

    • ํ˜ธ์ถœ์ž๋Š” N ์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ๊ฐ’์„ ์ œ๊ณตํ•˜์—ฌ WF์ž„์„ ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • WF ์š”๊ตฌ ์‚ฌํ•ญ "๋ฒ„๋ธ”๋ง ์—…" ํ†ตํ•ฉ ํ•„์š” / ArrayWithoutLast

    • ๋‹ค๋ฅธ ์šฉ๋„์—๋Š” " where ์ ˆ์— ํฌํ•จ"์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: [T; N - 1]: Sized



      • where [T; N - 1]: ๋‚จ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ค๋Š˜์€ ๋ฌด์‹œ๋˜๋‚˜์š”? ์•„์•ผ!)


      • where ArrayWithoutLast<T, N>: ... ๋‹ค์‹œ ํ†ต์ผ ์šฐํšŒ



๋”ฐ๋ผ์„œ ์ „๋ฐ˜์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” WF ๊ทœ์น™์— ์˜์กดํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ const ํ‘œํ˜„์‹์˜ "์œ ํšจ์„ฑ ๊ฒ€์‚ฌ"๋ฅผ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋‹ค๋ฅธ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ํ†ตํ•ฉ์„ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค( ArrayWithoutLast ์™€ ๊ฐ™์€ ํ•ดํ‚น์ด ํ•„์š”ํ•˜์ง€ ์•Š์Œ ํฌํ•จ).

53645

์ธก์ • ๋‹จ์œ„์— ๋Œ€ํ•œ ๋…ผ์˜ ์—์„œ ๋น„๋กฏ๋œ ์ž‘์€ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ƒ์ˆ˜์— ๋Œ€ํ•œ ์ œ๋„ค๋ฆญ ์œ ํ˜•์ด ์ด์— ์ง์ ‘์ ์œผ๋กœ ์˜์กดํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด:

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๋ฅผ ์‚ฌ์šฉํ•œ ์•„์ด๋””์–ดํŠน์„ฑ์€ ์œ ํ˜• ์˜ค๋ฅ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํ˜•์— ํฌํ•จ๋œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค. AssertLessThan128์˜ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

(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๊ฐœ:

  1. ๋‹จ์ผ ํ•จ์ˆ˜๊ฐ€ ์กฐ๊ฑด๋ถ€๋กœ 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์— ์–ธ๊ธ‰๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ์‚ฌ์‹ค์— ๋†€๋ž์Šต๋‹ˆ๋‹ค(์ œ๊ฐ€ ๋†“์นœ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด?).

  2. _[๋œ ์ค‘์š”ํ•จ]:_ ์šฐ๋ฆฌ๊ฐ€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์‹คํ–‰ ์ค‘์ธ์ง€ ์‹คํ–‰ ํƒ€์ž„์— ์‹คํ–‰ ์ค‘์ธ์ง€ ์—ฌ๋ถ€๋ฅผ const ํ•จ์ˆ˜์˜ ๋ณธ๋ฌธ์—์„œ ๊ฐ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋””๋ฒ„๊น… ์™ธ์— ๋‹ค๋ฅธ ์ด์œ ๊ฐ€ ์—†๋‹ค๋ฉด cfg!() ์™€ ์œ ์‚ฌํ•œ ์ผ๋ถ€ ๋งคํฌ๋กœ๊ฐ€ ์œ ์šฉํ•œ ํ™•์žฅ์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. cfg!() ๋Š” ํ˜„์žฌ ์ด๋ฏธ ์ปดํŒŒ์ผ ํƒ€์ž„์— ํ‰๊ฐ€๋˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๊ทธ ํ•จ์ˆ˜๊ฐ€ const๋กœ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์•„๋‹ˆ๋ฉด ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์—ฌ๋ถ€๋„ ์ปดํŒŒ์ผ ์‹œ ๊ฒฐ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— ์•Œ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(/์ถ”์ธก). -์‹œ๊ฐ. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์ฒซ ๋ฒˆ์งธ ์งˆ๋ฌธ๋ณด๋‹ค ๋œ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

@์ฝ”๋”-256

  1. ์˜ˆ, https://github.com/rust-lang/rfcs/pull/2632๋ฅผ ์ฐธ์กฐ
  2. ๊ทธ๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์œ„์˜ ๋‚ด์šฉ์„ ๊ฐ์•ˆํ•  ๋•Œ ๊ทธ๊ฒƒ์ด ํ•„์š”ํ•œ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@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 ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์ด์ œ ๊ฐ€๊นŒ์›Œ์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๋„์›€์„ ์›ํ•˜์‹ ๋‹ค๋ฉด ์•ฝ๊ฐ„์˜ ์„ฑ๊ณผ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ๋‹จ๊ณ„์— ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ฒซ์งธ, ๋” ๋งŽ์€ ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ const ์ œ๋„ค๋ฆญ ํ…Œ์ŠคํŠธ ๋Š” ์†Œ์ˆ˜์— ๋ถˆ๊ณผํ•˜์ง€๋งŒ ๋” ๋งŽ์€ ๊ฒƒ์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ๋กœ์„œ๋Š” ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋ฅผ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ„๊ทธ ๋ณด๊ณ ์„œ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์ƒ๊ฐ๋‚˜๋ฉด(๊ทธ๋ฆฌ๊ณ  ๊ธฐ์กด ํ…Œ์ŠคํŠธ์™€ ๋„ˆ๋ฌด ์œ ์‚ฌํ•ด ๋ณด์ด์ง€ ์•Š์Œ) ์ž์œ ๋กญ๊ฒŒ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์—ด์–ด ์ถ”๊ฐ€ํ•˜์„ธ์š”.
  • ๋‘˜์งธ, ์–ธ๊ธ‰ํ•œ ๋ฐ”์™€ ๊ฐ™์ด ์ฝ”๋“œ ์ „์ฒด์— 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 ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ์งˆ๋ฌธ:

  1. ๋ฌธ์„œ๋Š” ์–ด๋””์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ(์—ฌ๊ธฐ์„œ ์งˆ๋ฌธํ•  ํ•„์š”๊ฐ€ ์—†๋„๋ก)
  2. ํ˜„์žฌ ์ž„์˜ ์œ ํ˜•์˜ const ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์–ด๋–ค ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๊นŒ?
  3. 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 = ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์ด๋ ‡๊ฒŒ ํ•˜์„ธ์š”.

https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=5d962ce7c553e850030240244608ec00

@KrishnaSannasi ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, ์ข‹์€ ์บ์น˜ :D (๊ธฐ์ˆ ์ ์œผ๋กœ ๋‚˜๋Š”

๊ธฐ์ˆ ์ ์œผ๋กœ ๋ถ€๋™ ์†Œ์ˆ˜์ ์„ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์€ ์ •์˜๋˜์ง€ ์•Š์•˜์ง€๋งŒ ์ง€๊ธˆ์€ ์•…์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ธฐ์ˆ ์ ์œผ๋กœ ๋ถ€๋™ ์†Œ์ˆ˜์ ์„ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์€ ์ •์˜๋˜์ง€ ์•Š์•˜์ง€๋งŒ ์ง€๊ธˆ์€ ์•…์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ชจ๋“  Copy ์œ ํ˜•์„ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์€ ์•„๋ฌด ์†Œ์šฉ์ด ์—†์„ ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋ฐ”๊ฟ€ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์ˆ ์ ์œผ๋กœ ๋ถ€๋™ ์†Œ์ˆ˜์ ์„ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์€ ์ •์˜๋˜์ง€ ์•Š์•˜์ง€๋งŒ ์ง€๊ธˆ์€ ์•…์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ชจ๋“  Copy ์œ ํ˜•์„ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์€ ์•„๋ฌด ์†Œ์šฉ์ด ์—†์„ ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋ฐ”๊ฟ€ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„์ง ๊ธฐ์ˆ ์ ์œผ๋กœ UB์ž…๋‹ˆ๋‹ค. ์ •์˜๋œ Copy ๊ฐ’์„ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์€ ๊ธˆ๋ฌผ์ด์ง€๋งŒ, ๋ชจ๋“  ์œ ํ˜•์˜ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ญ์ œํ•˜๋ ค๋Š” ๊ฒฝ์šฐ(์˜ˆ: ํ•ด๋‹น ๊ฐ’์— ๋‹ฟ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๋ชจ๋“  ์ฝ”๋“œ ์ œ๊ฑฐ) ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๊ฑด์„ ๊นจ๋œจ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋‚˜์˜ ์ดํ•ด์ž…๋‹ˆ๋‹ค.

๋ฌด๋ก€ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์ด ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ๋Œ“๊ธ€์— ๋Œ€ํ•ด 60๋ช… ์ด์ƒ์˜ ์‚ฌ๋žŒ๋“ค์ด ์•Œ๋ฆผ์„ ๋ฐ›์œผ๋ฏ€๋กœ ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚œ ํ† ๋ก ์„ ์ตœ์†Œํ•œ์œผ๋กœ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. const ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ์ž‘์—…์„ ์กฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•ฉ์‹œ๋‹ค. ๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ํฌ๋ ˆ์ดํŠธ(์ข…์†์„ฑ)์—์„œ const-param_์œผ๋กœ ์œ ํ˜•์„ ๊ฐ€๋ฆฌํ‚ค๋Š” _aliases๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด:

  • ํฌ๋ ˆ์ดํŠธ A, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    ```#![crate_type = "lib"]

    ![๊ธฐ๋Šฅ(const_generics)]

ํŽ ์œ ํ˜• ๋ณ„์นญ= ๊ตฌ์กฐ์ฒด;
ํŽ ๊ตฌ์กฐ์ฒด ๊ตฌ์กฐ์ฒด(NS);

- 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 ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ๋””์Šˆ๊ฐ€๋ง์œผ๋กœ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋””์ž์ธ ํŒจํ„ด์˜ ๋ฌธ์ œ์ ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋‹ค์Œ ์€ ๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ ์ดํ›„


  • @skinny121 ์€ ์ง€๋‚œ ๋‹ฌ์— const ์ œ๋„ค๋ฆญ๊ณผ ๊ด€๋ จ๋œ ๋‹ค์–‘ํ•œ ๋ฏธํ•ด๊ฒฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ํ™˜์ƒ์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

    • ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ ํ™•์žฅ(https://github.com/rust-lang/rust/pull/60550)

    • ์œ ํ˜• ์ถ”๋ก  ๋ฌธ์ œ ์ˆ˜์ •(https://github.com/rust-lang/rust/pull/64679, https://github.com/rust-lang/rust/pull/65579)

    • ๋ฌธ์ž์—ด ๋ฐ ์Šฌ๋ผ์ด์Šค(https://github.com/rust-lang/rust/pull/64858) ๋ฐ ํฌ์ธํ„ฐ(https://github.com/rust-lang/rust/pull/64986)๋ฅผ ํฌํ•จํ•˜์—ฌ const ์ œ๋„ค๋ฆญ์—์„œ ๋” ๋งŽ์€ ์œ ํ˜• ์ง€์› ) ( ์›๋ž˜ RFC ์—์„œ ์ง€์›๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋จธ์ง€ const ์ œ๋„ค๋ฆญ๊ณผ ํ•จ๊ป˜ ์ฆ‰์‹œ ์•ˆ์ •ํ™”๋˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Œ)

    • const ์ œ๋„ค๋ฆญ ์ง„๋‹จ ๋ฌธ์ œ ์ˆ˜์ •(https://github.com/rust-lang/rust/pull/65154, https://github.com/rust-lang/rust/pull/65579)

    • const ์ œ๋„ค๋ฆญ ํฌ๋กœ์Šค ํฌ๋ ˆ์ดํŠธ ์‚ฌ์šฉ๊ณผ ๊ด€๋ จ๋œ ์—ฌ๋Ÿฌ ๋ฌธ์ œ ์ˆ˜์ •(https://github.com/rust-lang/rust/pull/65365)

  • @eddyb๋Š” const ์ œ๋„ค๋ฆญ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” const ํ‰๊ฐ€์™€ ๊ด€๋ จ๋œ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค(https://github.com/rust-lang/rust/pull/63497).
  • @matthewjasper ๋Š” ๋งคํฌ๋กœ์—์„œ const ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋Š”
  • @davidtwco ๋Š” const ์ œ๋„ค๋ฆญ ๋ฐ ์ƒ์„ฑ์ž์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค(https://github.com/rust-lang/rust/pull/60839).
  • @GuillaumeGomez ๋Š” Rustdoc์—์„œ const ์ œ๋„ค๋ฆญ ํ‘œ์‹œ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค(https://github.com/rust-lang/rust/pull/61605).
  • @varkor๋Š” ์ผ๋ถ€ ์œ ํ˜• ์ถ”๋ก  ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค(https://github.com/rust-lang/rust/pull/61570, https://github.com/rust-lang/rust/pull/60742, https://github. com/rust-lang/rust/pull/60508), const ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๋ฅผ ์ œํ•œํ•˜๋Š” ๋ฌธ์ œ(https://github.com/rust-lang/rust/pull/60717) ๋ฐ ๋‹ค์–‘ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ์ถฉ๋Œ(https:/ /github.com/rust-lang/rust/pull/61380, https://github.com/rust-lang/rust/pull/61333, https://github.com/rust-lang/rust/pull/60710 )

๋˜ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์ž‘์—…์œผ๋กœ 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 ๊ทธ๊ฒƒ์€ ๋งค์šฐ ๋‚˜์œ ์ƒ๊ฐ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. <โ€ฆ> ๊ฐ€ ์ฝ๊ธฐ _์–ด๋ ค์šด ๊ตฌ๋ฌธ_์ด๋ผ๋Š” ์ƒ๊ฐ์ด ์ •๋ง ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋‘ ๊ฐ€์ง€ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋‹น์‹ ์€ ๋‚ด๊ฐ€ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ๊ฒฝ๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ ๋„ ์ฝ๊ธฐ๊ฐ€ ์–ด๋ ต์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
  2. ์ฝ๊ธฐ ์–ด๋ ต๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒฝ์šฐ 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์— ๋ฐ˜๋Œ€ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ €๋„ ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค(์—ฌ๊ธฐ์—์„œ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋ฅผ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค). ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ:

  1. _const generics_๊ฐ€ ๋งŽ์€ ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋™์•ˆ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
  2. ์œ ํ˜•๊ณผ ์œ ์‚ฌํ•˜๋ฏ€๋กœ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ์œ„์น˜๊ฐ€ ์•„๋‹ˆ๋ผ ์œ ํ˜•์ด ์žˆ๋Š” ์œ„์น˜์— ์†ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  3. ์™œ ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ <โ€ฆ> ๊ฐ€ (โ€ฆ) ๋ณด๋‹ค ๋” ์–ด๋ ต๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š”์ง€ ์ •๋ง ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ struct ๋Œ€ fn ๊ณ ๋ คํ•  ๋•Œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ struct ์—๋Š” <โ€ฆ> ์žˆ๊ณ  fn ์—๋Š” ๋‘˜ ๋‹ค ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‘˜ ๋‹ค ์žˆ์Šต๋‹ˆ๋‹ค.
  4. arg ์œ„์น˜์— ์žˆ๋Š” impl Trait์—์„œ ๋‚ด๊ฐ€ ์ •๋ง ์‹ซ์–ดํ•˜๋Š” ๊ฒƒ์€ ํ•จ์ˆ˜๊ฐ€ ์‹ค์ œ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์ด ๋” ์–ด๋ ต๋‹ค๋Š” ์‚ฌ์‹ค์ด์—ˆ์Šต๋‹ˆ๋‹ค. 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์— ๋Œ€ํ•œ ์ดˆ๊ธฐ ๊ตฌํ˜„์ด ์™„๋ฃŒ๋œ ํ›„์— ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

CppCon 2019: David Stone - C++์—์„œ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ œ๊ฑฐ, N์˜ 1๋ถ€: constexpr ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜

ํŽธ์ง‘: ์ด๊ฒƒ์€ ํ•ด๋‹น ์Šค๋ ˆ๋“œ์—์„œ ์–ธ๊ธ‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— 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] ์— ์žˆ์Šต๋‹ˆ๋‹ค.


๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ ์ดํ›„ ์ง€๋‚œ ๋ช‡ ๋‹ฌ ๋™์•ˆ ์ข‹์€ ์ง„์ „์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • @skinny121 :

    • ์ฆ๋ถ„ ์ปดํŒŒ์ผ ๋ฐ ํฌ๋ ˆ์ดํŠธ ๊ฐ„์— const ์ œ๋„ค๋ฆญ์„ ๊นจ๋Š” ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค(https://github.com/rust-lang/rust/pull/65652).

    • ์ง„๋‹จ์—์„œ const ์ œ๋„ค๋ฆญ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ์œ ํ˜• ์ถ”๋ก  ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค(https://github.com/rust-lang/rust/pull/65579).

    • const ํ‰๊ฐ€๋ฅผ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ๋ฆฌํŒฉํ† ๋ง(https://github.com/rust-lang/rust/pull/66877)

  • @yodaldevoid ๋Š” const ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋” ์ด์ƒ {} ๋กœ ๋ž˜ํ•‘ํ•  ํ•„์š”๊ฐ€ ์—†๋„๋ก type ๋ฐ const ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋ช…ํ™•์„ฑ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค(https://github.com/rust-lang/rust/pull/66104).
  • @eddyb ๋Š” ์ง€์—ฐ ์ •๊ทœํ™” ๊ฐ€ ๊ตฌํ˜„๋˜๋ฉด ๋ฐฐ์—ด ๊ธธ์ด๋กœ const ์ œ๋„ค๋ฆญ ์‚ฌ์šฉ์„ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค(https://github.com/rust-lang/rust/pull/66883).
  • @varkor :

    • ์‚ฌ์šฉ์ž ์ •์˜ ๋™๋“ฑ์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ์žˆ๋Š” ์œ ํ˜•์ด const ์ œ๋„ค๋ฆญ์œผ๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋„๋ก ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด structural_match ๊ฒ€์‚ฌ๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค(https://github.com/rust-lang/rust/pull/65627).

    • const ์ œ๋„ค๋ฆญ์„ ๊ณ ๋ คํ•˜๋„๋ก ์ผ๋ถ€ ์ง„๋‹จ์„ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค(https://github.com/rust-lang/rust/pull/65614).

    • ๋‹ค์–‘ํ•œ ๋ฆฌํŒฉํ† ๋ง ๋ฐ ์œ ํ˜• ์ถ”๋ก  ์ˆ˜์ •(https://github.com/rust-lang/rust/pull/65643, https://github.com/rust-lang/rust/pull/65660, https://github.com)์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. com/rust-lang/rust/pull/65696)

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 ์ œ๋„ค๋ฆญ ์˜


  • @skinny121 :

    • ์ง€์—ฐ ์ •๊ทœํ™”์˜ ์ฒซ ๋ฒˆ์งธ ๋ฒ„์ „์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค(https://github.com/rust-lang/rust/pull/68505, https://github.com/rust-lang/rust/pull/69181, https://github. com/rust-lang/rust/pull/67717, https://github.com/rust-lang/rust/pull/67890)

    • ์„ฑ๋Šฅ ํ–ฅ์ƒ(https://github.com/rust-lang/rust/pull/68118)

    • ๋‹ค์–‘ํ•œ ์˜ค๋ฅ˜ ์ˆ˜์ • (https://github.com/rust-lang/rust/pull/68143)

  • @lcnr :

    • ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ํ˜•์‹ ์ธ์ˆ˜์—์„œ ๋ช…์‹œ์  const ์ œ๋„ค๋ฆญ ์ง€์› ์ถ”๊ฐ€(https://github.com/rust-lang/rust/pull/74113)

    • @skinny121๋กœ ์ƒ์ˆ˜์— ๋Œ€ํ•œ ์ง€์—ฐ ์ •๊ทœํ™”์˜ ์ฒซ ๋ฒˆ์งธ ๊ตฌํ˜„์„ ์™„๋ฃŒํ–ˆ์Šต๋‹ˆ๋‹ค(https://github.com/rust-lang/rust/pull/71973).

    • unused_braces ๋Œ€ํ•œ ๋ฆฐํŠธ ์ถ”๊ฐ€(https://github.com/rust-lang/rust/pull/70081)

    • ํŒจํ„ด์˜ const ์ œ๋„ค๋ฆญ ๋ฌธ์ œ ์ˆ˜์ •(https://github.com/rust-lang/rust/pull/70562)

    • const ์ผ๋ฐ˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•ด dyn Trait ๊ธˆ์ง€(https://github.com/rust-lang/rust/pull/71038)

    • ์˜ˆ์œ ํ”„๋ฆฐํŒ… ๊ฐœ์„  (https://github.com/rust-lang/rust/pull/72052)

    • ๋‹ค์–‘ํ•œ ์˜ค๋ฅ˜ ์ˆ˜์ • (https://github.com/rust-lang/rust/pull/70032, https://github.com/rust-lang/rust/pull/70107, https://github.com/rust- lang/rust/pull/70223, https://github.com/rust-lang/rust/pull/70249, https://github.com/rust-lang/rust/pull/70284, https://github. com/rust-lang/rust/pull/70319, https://github.com/rust-lang/rust/pull/70541, https://github.com/rust-lang/rust/pull/72066, https: //github.com/rust-lang/rust/pull/74159)

    • ๋ฆฌํŒฉํ† ๋ง (https://github.com/rust-lang/rust/pull/70478)

    • ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€(https://github.com/rust-lang/rust/pull/74392, https://github.com/rust-lang/rust/pull/74445)

  • @eddyb :

    • ๋ฐฐ์—ด ๊ธธ์ด์˜ const ์ œ๋„ค๋ฆญ ๋ฌธ์ œ ์ˆ˜์ •(https://github.com/rust-lang/rust/pull/70452)

    • ์˜ˆ์œ ํ”„๋ฆฐํŒ… ๊ฐœ์„  (https://github.com/rust-lang/rust/pull/71232)

    • ํ–ฅ์ƒ๋œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ (https://github.com/rust-lang/rust/pull/71049)

    • ๋ฆฌํŒฉํ† ๋ง (https://github.com/rust-lang/rust/pull/70164)

  • @Aaron1011 : cross-crate const ์ œ๋„ค๋ฆญ ์‚ฌ์šฉ ์˜ค๋ฅ˜ ์ˆ˜์ • (https://github.com/rust-lang/rust/pull/72600)
  • @petrochenkov : ์ด๋ฆ„ ํ™•์ธ ๋ฐ const ์ œ๋„ค๋ฆญ ๋ฌธ์ œ ์ˆ˜์ •(https://github.com/rust-lang/rust/pull/70006)
  • @yodaldevoid : const ์ผ๋ฐ˜ ๋งค๊ฐœ๋ณ€์ˆ˜์—์„œ ํ‰์ƒ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค(https://github.com/rust-lang/rust/pull/74051).
  • @contrun : ICE ์ˆ˜์ • (https://github.com/rust-lang/rust/pull/69859)
  • @oli-obk: ๋ฆฌํŒฉํ† ๋ง (https://github.com/rust-lang/rust/pull/69981)
  • @Centril : ํ–ฅ์ƒ๋œ ์ง„๋‹จ ๊ธฐ๋Šฅ (https://github.com/rust-lang/rust/pull/70261)
  • @DutchGhost : ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ (https://github.com/rust-lang/rust/pull/70539)
  • @varkor :

    • ์˜ˆ์œ ํ”„๋ฆฐํŒ… ๊ฐœ์„  (https://github.com/rust-lang/rust/pull/67909, https://github.com/rust-lang/rust/pull/68111)

    • ๋‹ค์–‘ํ•œ ์˜ค๋ฅ˜ ์ˆ˜์ • (https://github.com/rust-lang/rust/pull/67906, https://github.com/rust-lang/rust/pull/68388, https://github.com/rust- lang/rust/pull/68434)

    • ํ–ฅ์ƒ๋œ ์ง„๋‹จ ๊ธฐ๋Šฅ(https://github.com/rust-lang/rust/pull/70845)

    • ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€(https://github.com/rust-lang/rust/pull/68312, https://github.com/rust-lang/rust/pull/70939)


const ์ œ๋„ค๋ฆญ์€ ์ด๋ฏธ ๋จผ ๊ธธ์„ ์™”์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ฒ„๊ทธ์™€ ๋‚ ์นด๋กœ์šด ๋ชจ์„œ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๋ฌธ์ œ์— ๋Œ€ํ•ด @lcnr ๋˜๋Š” @eddyb ๋˜๋Š”

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰