Rust: ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с отслСТиваниСм макросов 1.1 (RFC # 1681)

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 22 Π°Π²Π³. 2016  Β·  268ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: rust-lang/rust

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с отслСТиваниСм для rust-lang / rfcs # 1681.

cc @alexcrichton

Бтабилизация TODO

ЛакмусовыС тСсты:

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ:

  • Имя ящика, Π² настоящСС врСмя proc_macro
  • Π’ΠΈΠΏ ящика, Π² настоящСС врСмя proc-macro
  • Атрибут #[proc_macro_derive(Foo)]
  • Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ящиков proc-macro с -L ΠΈ #[macro_use] для ΠΈΡ… Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ
  • Π·Π°Ρ‚Π΅Π½Π΅Π½ΠΈΠ΅ это ошибка
  • Π±Π΅Π· Π³ΠΈΠ³ΠΈΠ΅Π½Ρ‹
  • ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² для всСй структуры ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ всСго этого ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ
  • Атрибут Π³Ρ€ΡƒΠ·ΠΎΠ²ΠΎΠ³ΠΎ манифСста, Π² настоящСС врСмя proc-macro = true

Π˜Π·Π²Π΅ΡΡ‚Π½Ρ‹Π΅ ошибки:

  • [] - Паника ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ - # 36935
  • [] - ΠΏΠΎΡ‚ΠΎΠΊΠΈ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² с mod foo fail - # 36691
  • [] - Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π½Π΅ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΡŽΡ‚ΡΡ для proc_macro - # 38749
  • [x] - Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ для Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ€Π΅ΠΆΠΈΠΌΠΎΠ² слоТно - https://github.com/rust-lang/rust/issues/35900#issuecomment -252499766
  • [x] - ошибка Cargo тСст для Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ макросов proc - # 37480
  • [x] - порядок ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ - https://github.com/rust-lang/rust/issues/35900#issuecomment -252430957 (исправлСно https://github.com/rust-lang/rust/pull/37067)
  • [x] - НСвозмоТно Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ящики с макросами rustc - https://github.com/rust-lang/rust/issues/36820 (исправлСно Π² # 36847)
  • [x] - Cargo пСрСстраиваСтся слишком часто - https://github.com/rust-lang/rust/issues/36625 (исправлСно Π² https://github.com/rust-lang/rust/pull/36776)
  • [x] - Атрибуты, сгСнСрированныС компилятором, ΡƒΡΠ»ΠΎΠΆΠ½ΡΡŽΡ‚ Тизнь Π°Π²Ρ‚ΠΎΡ€Π°ΠΌ настраиваСмых ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… - https://github.com/rust-lang/rust/issues/35900#issuecomment -245978831

    • [x] - Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ порядок Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ Π½Π° «сначала ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈΒ» - https://github.com/rust-lang/rust/issues/35900#issuecomment -246840357 (исправлСно Π² https://github.com/rust-lang/rust) / pull / 36782)

      РСализация TODO

  • [x] - Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ящик rustc_macro

    • [x] - ΠΈΠΌΠ΅Ρ‚ΡŒ ссылку librustc_macro Π½Π° libsyntax . Зависит ΠΎΡ‚ librustc_macro Π² librustc_driver
    • [x] - ΠžΡ‚ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅ rustc_macro ΠΊΠ°ΠΊ Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ нашСго стандартного Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° .
    • [x] - Волько Ρ‚Π΅Π³ rustc_macro с #![crate_type = "rlib"] , Π½Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π΄ΠΈΠ»ΠΈΠ±.
    • [x] - Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ API rustc_macro ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ libsyntax TokenStream Π²Π½ΡƒΡ‚Ρ€ΠΈ
    • [x] - ΠΏΠΎΠΌΠ΅Ρ‚ΡŒΡ‚Π΅ rustc_macro элСмСнтом TokenStream lang, Ρ‡Ρ‚ΠΎΠ±Ρ‹ компилятор Π·Π½Π°Π» ΠΎΠ± этом.
  • [x] - Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ rustc_macro_derive

    • [x] - ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Ρ‚ΠΎΡ‡Π½ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ foo(bar) , Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² / Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ²

    • [x] - ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ примСняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ функциям

    • [x] - ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ примСняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ функциям Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅

    • [x] - ΡΠ²Π΅Ρ€ΠΈΡ‚ΡŒ подпись с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ элСмСнта TokenStream lang, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅

    • [x] - ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ символы с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ rustc_macro_derive Π² ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ вмСстС с Ρ€Π΅ΠΆΠΈΠΌΠΎΠΌ получСния, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ.

  • [x] - Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ ящика rustc-macro для Π΄Ρ€ΡƒΠ³ΠΈΡ… ящиков

    • [x] - ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ для создания Π΄ΠΈΠ»ΠΈΠ±Π°

    • [x] - ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ dylib ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅

    • [x] - ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ rustc-macro crates Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ связаны ΠΊΠ°ΠΊ dylibs.

    • [x] - ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π½Π΅Ρ‚ _reachable_ элСмСнтов, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚Π΅Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ ΠΊΠ°ΠΊ #[rustc_macro_derive]

    • [x] - Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ cfg(rustc_macro) ΠΊΠ°ΠΊ Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ cfg , ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Π΅ для Ρ‚ΠΈΠΏΠ° ящика rustc-macro

    • [x] - ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ rustc-macro ящики динамичСски ΡΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ΡΡ с libsytnax

  • [x] - Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ #[macro_use] ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ для rustc-macro ящиков

    • [x] - Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ rustc-macro ящиков ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ dylib / rlib, отслСТиваСмых сСгодня ΠΏΡ€ΠΈ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ящиков

    • [x] - ΠΠ½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ для ящиков rustc-macro Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎ сочСтаниях символов ΠΈ Ρ€Π΅ΠΆΠΈΠΌΠΎΠ² Π²Ρ‹Π²ΠΎΠ΄Π°.

    • [x] - dlopen Π΄ΠΈΠ»ΠΈΠ±

    • [x] - Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Ссли ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Ρ€Π΅ΠΆΠΈΠΌ Π²Ρ‹Π²ΠΎΠ΄Π° затСняСт любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ.

  • [x] - Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡŽ Π³Ρ€ΡƒΠ·Π°

    • [x] - Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Ρ‚ΡŒ rustc-macro ΠΏΠΎΡ…ΠΎΠΆΠ΅Π΅ Π½Π° plugin = true

    • [x] - ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ --crate-type=rustc-macro зависимости ΠΎΡ‚ этого

    • [x] - ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρƒ ΠΆΠ΅ Π»ΠΎΠ³ΠΈΠΊΡƒ хоста / Ρ†Π΅Π»ΠΈ для ящиков Rustc-macro, Ρ‡Ρ‚ΠΎ ΠΈ для ящиков ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, всСгда ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ящики Rustc-macro для хостов)

  • [x] - ВСсты

    • [x] - Π΄Ρ‹ΠΌΠΎΠ²ΠΎΠΉ тСст, Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‰ΠΈΠΉ rustc-макрос, Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ #[derive] trait

    • [x] - ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ ΠΈΠΌΠ΅Π½ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ошибкой

    • [x] - компиляция для Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ являСтся ошибкой

    • [x] - Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π΄Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ ящика rustc-macro, Π° всС ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, rustc-macro + dylib) являСтся ошибкой

    • [x] - ΠΎΡ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ уТаса.

    • [x] - ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΈΠ· структуры, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ»Π΅ΠΉ

    • [x] - Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΠΌΠΏΠΎΠ² рядом со структурой

    • [x] - кросс-компиляция ΠΈΡ‰Π΅Ρ‚ Ρ‚ΠΈΠΏ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° rustc-macro хоста

    • [x] - Π½Π΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Π²Π°Π½ΠΈΠ»ΡŒΠ½Ρ‹Π΅ Π΄ΠΈΠ»ΠΈΠ±Ρ‹ ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏΡ‹ ящиков rustc-macro

    • [x] - Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ общСдоступного экспорта Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ макроопрСдСлСния Π² ΠΊΠΎΡ€Π·ΠΈΠ½Π΅ rustc-macro

    • [x] - ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ макросы Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡƒΡŽ подпись

    • [x] - Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π΄Π²Π° ящика макросов Π² ΠΎΠ΄Π½Ρƒ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ

B-RFC-implemented B-unstable T-lang final-comment-period

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π₯ΠΎΡ€ΠΎΡˆΠΎ, я ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡΡŒ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ это сСгодня ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ Π΄Π°Π»Π΅ΠΊΠΎ я продвинулся.

ВсС 268 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π― ΠΎΠ±Π½ΠΎΠ²ΠΈΠ» описаниС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Π΄ΠΎΠ±Π°Π²ΠΈΠ² ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ список Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. Π‘ΠΊΠΎΡ€Π΅Π΅ всСго, это Π½Π΅ ΠΈΡΡ‡Π΅Ρ€ΠΏΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ список, Π½ΠΎ, надСюсь, ΠΎΠ½ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΌ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ 90% ΠΏΡƒΡ‚ΠΈ.

Π₯ΠΎΡ€ΠΎΡˆΠΎ, я ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡΡŒ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ это сСгодня ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ Π΄Π°Π»Π΅ΠΊΠΎ я продвинулся.

cc https://github.com/rust-lang/rust/pull/35957 , рСализация

Из # 35957: ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΅Ρ‰Π΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ имя ящика librustc_macro. Π’ частности, это Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ящик-Π΄ΠΎΠ»Π³ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ для всСх Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² макросов, поэтому ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ rustc_macro (Ρ‡Ρ‚ΠΎ, Π½Π° ΠΌΠΎΠΉ взгляд, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅) касаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ΄Π΅ΠΈ 1.1, каТСтся ΠΏΠ»ΠΎΡ…ΠΈΠΌ. РаньшС я Ρ…ΠΎΡ‚Π΅Π» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для этого libmacro, Π½ΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ macro - Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ слово (ΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°Ρ…ΠΎΡ‚Π΅Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² качСствС ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ), это Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. @cgswords ΠΈ я использовали libproc_macro, ΠΈ я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ это Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎΠ΅ имя, хотя я Π½Π΅ Π½Π° 100% Π΄ΠΎΠ²ΠΎΠ»Π΅Π½ этим.

@nrc : Π₯ΠΎΡ€ΠΎΡˆΠΎ, ΠΌΠΎΠΈ мысли ΠΏΠΎ

  • extern crate macros; - ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎ ΠΈ ΠΌΠΈΠ»ΠΎ, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ содСрТащий макросы, Π° Π½Π΅ ΠΊΠ°ΠΊ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ для ΠΈΡ… написания
  • extern crate macro_runtime; - ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ написано Π½Π° Π±Π°Π½ΠΊΠ΅
  • extern crate metarust; - Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ Rust ΠΎ Rust для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π° Rust
  • extern crate bikeshed; - с ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΌΠΈ макросами Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ любой Ρ†Π²Π΅Ρ‚ Rust, ΠΊΠ°ΠΊΠΎΠΉ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅!
  • extern crate macrame; - Π·Π²ΡƒΡ‡ΠΈΡ‚ ΠΊΠ°ΠΊ "макрос make [r]"; Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ для Π±ΡƒΠ΄ΡƒΡ‰Π΅Π³ΠΎ Β«Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π³ΠΎΒ» API вмСсто Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

@nrc ΠŸΠΎΡ…ΠΎΠΆΠ΅, Ρ‡Ρ‚ΠΎ Π²Π°ΠΆΠ½Ρ‹ΠΌ аспСктом этого вопроса являСтся ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ всСх Π½Π°ΡˆΠΈΡ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… стилСй макросов - Π² частности, Ссли ΠΌΡ‹ ΠΏΠΎΠΉΠ΄Π΅ΠΌ с libproc_macro , ΠΌΡ‹ Π±Π΅Ρ€Π΅ΠΌ Π½Π° сСбя ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ "ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ макрос" тСрминология. Π£ мСня Π½Π΅Ρ‚ Ρ‚Π²Π΅Ρ€Π΄ΠΎΠ³ΠΎ мнСния здСсь, Π½ΠΎ я Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½, исслСдовали Π»ΠΈ ΠΌΡ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎ пространство Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΠΈ.

Π§Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»ΠΎ ясно, Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹, Ρ‡Ρ‚ΠΎ сСгодняшниС macro_rules Π±ΡƒΠ΄ΡƒΡ‚ просто «макросами», Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅ΠΌ ΠΏΠΎΠ΄ макросами ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Β«ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы»? МнС это каТСтся Π²ΠΏΠΎΠ»Π½Π΅ Ρ€Π°Π·ΡƒΠΌΠ½Ρ‹ΠΌ ΠΏΠ»Π°Π½ΠΎΠΌ. И Π² этом ΠΌΠΈΡ€Π΅ я Π±Ρ‹ сказал, Ρ‡Ρ‚ΠΎ libproc_macro Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Π΅ΠΌ libmacros .

Π― ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ всС макросы - это «макросы», ΠΈ ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ Π½Π° основС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ (использованиС Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ для всСх Π²ΠΈΠ΄ΠΎΠ²), ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Β«ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы» ΠΏΡ€ΠΎΡ‚ΠΈΠ² «макросов для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Β». Π― Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ "Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ синтаксиса" ΠΈ "ΠΏΠ»Π°Π³ΠΈΠ½ компилятора" (ΠΈ ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ послСднСС для Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ²).

Но Π΄Π°, я ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ‡Ρƒ ΠΎΡ‚ΠΎΡ€Π²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Β«ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎΠ³ΠΎ макроса».

@nrc Π˜ΠΌΠ΅Π΅Ρ‚ смысл для мСня! Π₯отя «макросы Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅Β» Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΎΠΊ, это Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‡Π΅Π½ΡŒ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‰ΠΈΠΉΡΡ / ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ понятный Ρ‚Π΅Ρ€ΠΌΠΈΠ½. ЕдинствСнноС, Ρ‡Ρ‚ΠΎ мСня бСспокоит ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ Β«ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… макросов», Ρ‚Π°ΠΊ это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Β«ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°Β» Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² состав Rust. Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ, Π΅ΡΡ‚ΡŒ Π»ΠΈ способ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ связь Π±ΠΎΠ»Π΅Π΅ прямой. Β«Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ макрос» Π½Π΅ совсСм ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ, Π½ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, Π²Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ я имСю Π² Π²ΠΈΠ΄Ρƒ?

Π”Π°, это Π½Π΅ совсСм идСально, Π½ΠΎ, учитывая, Ρ‡Ρ‚ΠΎ это Ρ…ΠΎΡ€ΠΎΡˆΠΎ извСстный / ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ Rust, я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ это Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Π΅ΠΌ созданиС нашСго собствСнного Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°. "ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ макрос" Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½, Π½ΠΎ я ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ "ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ".

Π’Π΅Ρ€ΠΌΠΈΠ½ Perl для блиТайшСго эквивалСнта Β«ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΌ макросам» - это Β«Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ источника», Ρ‡Ρ‚ΠΎ (особСнно с ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠΌ ΠΎΡ‚ AST ΠΊ Ρ‚ΠΎΠΊΠ΅Π½Π°ΠΌ) являСтся довольно подходящим описаниСм.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Β«ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ синтаксиса» ΠΈΠ»ΠΈ Β«ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ макросы» ΠΏΠΎΠ΄ΠΎΠΉΠ΄ΡƒΡ‚ для использования Π² качСствС ΠΈΠΌΠ΅Π½? Однако Ρƒ мСня Π½Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΌΠΈ макросами.

Π›ΡŽΠ΄ΠΈ ΡƒΠΆΠ΅ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ это Β«ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΌΒ», ΠΈ я Π΄ΡƒΠΌΠ°ΡŽ, ΠΎΠ½ ясно понял, Ρ‡Ρ‚ΠΎ это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, особСнно Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ «макросов Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅Β». Π― Π±Ρ‹ Π½Π΅ стал Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π½Π°ΠΉΡ‚ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ имя.

МнС нравится Ρ‚Π΅Ρ€ΠΌΠΈΠ½ Β«ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ макрос» для рСгулярного использования (ΠΈΠ»ΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, Β«ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ макрос»). МнС особСнно нравится ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ слово _macro_, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»ΠΎ ясно, Ρ‡Ρ‚ΠΎ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ (Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ ...) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ "ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ макросы". По этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ ΠΌΠ½Π΅ Π½Π΅ нравятся «исходныС Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹Β» (я Ρ‚Π°ΠΊΠΆΠ΅ оТидаю, Ρ‡Ρ‚ΠΎ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ просто ΠΎΡ‚Π±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, Π° Π½Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡ…, хотя я знаю, Ρ‡Ρ‚ΠΎ этот Ρ‚Π΅Ρ€ΠΌΠΈΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΎΠ±ΠΎΠΈΡ…).

МСня устраиваСт libproc_macro ΠΈΠ»ΠΈ libmacros . Π― ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ послСднСС просто ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΌΠ½Π΅ Π½Π΅ нравится, ΠΊΠΎΠ³Π΄Π° Π² ΠΈΠΌΠ΅Π½Π°Ρ… ящиков Π΅ΡΡ‚ΡŒ _ ΠΊΠΎΠ³Π΄Π° этого Π»Π΅Π³ΠΊΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ. Π·Π½Π°ΠΊ Ρ€Π°Π²Π½ΠΎ

Один вопрос: ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ Π»ΠΈ ΠΌΡ‹ ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ наличия Β«ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈΒ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ· Π½Π΅ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… макросов? Π― Π½Π΅ знаю Ρ‚Π°ΠΊΠΈΡ… ΠΏΠ»Π°Π½ΠΎΠ², Π½ΠΎ Ссли Π±Ρ‹ ΠΌΡ‹ это сдСлали ΠΈ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ящикС, Ρ‚ΠΎΠ³Π΄Π° libmacros Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π»ΡƒΡ‡ΡˆΠΈΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ. Π·Π½Π°ΠΊ Ρ€Π°Π²Π½ΠΎ

(Π― Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡƒΠΌΠ°ΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ @dherman ΠΈΠ· RFC с Π½Π΅Ρ‚Π΅Ρ€ΠΏΠ΅Π½ΠΈΠ΅ΠΌ

@nikomatsakis : Бвязанный, Π½ΠΎ нСсколько Π΄Ρ€ΡƒΠ³ΠΎΠΉ вопрос - это Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ использования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ я поднял Π² https://github.com/rust-lang/rfcs/pull/1561#discussion_r60459479 - Ρ…ΠΎΡ‚ΠΈΠΌ Π»ΠΈ ΠΌΡ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… макросов ΠΌΠΎΠ³Π»ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… макросов?

Π― Π»Π΅Π³ΠΊΠΎ Π²ΠΈΠΆΡƒ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΠΌΡƒ настраиваСмому ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ, ΠΈ это, ΠΏΠΎ сути, сдСлало Π±Ρ‹ сами опрСдСлСния ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… макросов способными ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² качСствС Ρ‚Π°ΠΊΠΈΡ… Β«ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈΒ».

Но Π΄Π°, я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ gensym @dherman довольно ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅Π»Π΅Π½. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Ссли ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° ΠΌΠΎΠΉ вопрос Π²Ρ‹ΡˆΠ΅ - Β«Π΄Π°Β», gensym являСтся ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ макросом (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ макросами Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…) ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ (которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΌΠΈ макросами).

Π£ мСня Π΅ΡΡ‚ΡŒ PR ΠΏΠΎ Π³Ρ€ΡƒΠ·Π°ΠΌ https://github.com/rust-lang/cargo/pull/3064, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Ρ‹ всС Ρ„Π»Π°ΠΆΠΊΠΈ "интСграция Π³Ρ€ΡƒΠ·Π°" Π² ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΌ спискС.

Π― оставил ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ ΠΊ PR Π³Ρ€ΡƒΠ·Π°, Π½ΠΎ я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚ΠΈΠΏ _dependency_, Π° Π½Π΅ просто Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚ΠΈΠΏ _package_. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ это просто Π»ΡƒΡ‡ΡˆΠ΅ эстСтичСски ΠΈ эргономично, Π½ΠΎ это Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠΎΠ΅ ΠΌΠ½Π΅Π½ΠΈΠ΅. Но Ρƒ мСня Ρ‚ΠΎΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹.

  • Π’ Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ с ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΈ частными Π΄Π΅ΠΏΠ°Ρ€Ρ‚Π°ΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ Π²Π°ΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Π΅ Π΄Π΅ΠΏΠ°Ρ€Ρ‚Π°ΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Π΅ дСпСши ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ. НапримСр
  • Π’ Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ со встроСнными ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΌΠΈ макросами / ΠΊΠ²Π°Π·ΠΈ-ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°ΠΌΠΈ любая Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π²ΠΎ врСмя компиляции.
  • > Ρ…ΠΎΡ‚ΠΈΠΌ Π»ΠΈ ΠΌΡ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… макросов ΠΌΠΎΠ³Π»ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… макросов?

Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· этого, Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый ящик ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ Π΄Π΅ΠΏΠ»ΠΎΠ΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ящика ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… макросов ΠΈΠ»ΠΈ макросом Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ящика.

Π‘Π΅Ρ€Π΄Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚?

Π”Π° https://github.com/serde-rs/serde/releases/tag/v0.8.6

(ΠΊΡ€ΠΎΠΌΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях # 36211)

ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ, спасибо Π·Π° обновлСния @dtolnay!

Π•ΡΡ‚ΡŒ Π»ΠΈ докумСнтация ΠΏΠΎ этим макросам? Полагаю, СдинствСнный ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΡ… использования - Π² сСрдС, Π²Π΅Ρ€Π½ΠΎ?

ОК, Π³Ρ€ΡƒΠ· ΠΏΡ€ΠΈΠ±Ρ‹Π». Π­Ρ‚ΠΎ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, Π½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ https://github.com/rust-lang/rust/issues/35900#issuecomment -243976887 ΠΏΠ΅Ρ€Π΅Π΄ стабилизациСй. [Как Π±Ρ‹ Ρ‚ΠΎ Π½ΠΈ Π±Ρ‹Π»ΠΎ, я Ρ…ΠΎΡ‚Π΅Π» ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ ΠΎΠ± этом Π² исходном RFC, Π½ΠΎ Π·Π°Π±Ρ‹Π».]

Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ «макросы ΠΏΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΡƒΒ» ΠΈ Β«ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы» ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π° Β«Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ макросы» ΠΈ Β«ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ макросы» соотвСтствСнно. Π­Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈ с Π±ΠΎΠ»Π΅Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΎ извСстной Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ / ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ языков программирования. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ² рассматриваСтся ΠΊΠ°ΠΊ надмноТСство ΠΈΠ»ΠΈ синоним ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎΠ³ΠΎ, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ достаточно Π±Π»ΠΈΠ·ΠΎΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ люди, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΡŽ Β«ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎΠ³ΠΎ макроса», ΠΌΠΎΠ³Π»ΠΈ ΡΠΎΠ²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ ΠΏΡ€Ρ‹ΠΆΠΎΠΊ. Π’Π°ΠΊΠΆΠ΅ слСдуСт ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Ρ‹ с концСпциями ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ / Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ / ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π² самом Ρ€ΠΆΠ°Π²Ρ‡ΠΈΠ½Π΅.
Π­Ρ‚Π° схСма имСнования Π΄Π°Π΅Ρ‚ Π½Π°ΠΌ ящик macro_imp ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ для ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ macro_rules . macro_rules ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰Π΅Π³ΠΎ ящика macro_dec .

@nrc , ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚Π΅ ΠΎ "фактичСских ΠΏΠ»Π°Π³ΠΈΠ½Π°Ρ…", Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹ Ρ‚Π°ΠΊΠΈΠ΅ Π²Π΅Ρ‰ΠΈ, ΠΊΠ°ΠΊ metacollect ΠΈ clippy , Ρ‚Π°ΠΊΠΈΠ΅ Π²Π΅Ρ‰ΠΈ, ΠΊΠ°ΠΊ rustw , rustfmt ΠΈ сСрвСр языка Rust , ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΡƒΡŽ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ?

Как Π±Ρ‹ Ρ‚ΠΎ Π½ΠΈ Π±Ρ‹Π»ΠΎ, ΠΌΠ½Π΅ мягко Π½Π΅ нравится Π½Π°Π·Π²Π°Π½ΠΈΠ΅ "ΠΏΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ" (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² ΠΌΠΎΠ΅ΠΌ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠΈ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ $foo Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ "ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ"). Для мСня Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ ΠΈ ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ Π·Π²ΡƒΡ‡ΠΈΡ‚ Π»ΡƒΡ‡ΡˆΠ΅.

Π˜Π³Ρ€Π°Ρ с этим, я Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ» ΠΎΠ΄Π½Ρƒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ. ΠŸΠΎΡ…ΠΎΠΆΠ΅, Ρ‡Ρ‚ΠΎ прСдоставлСнныС Rust ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΈΠ½ΠΎΠ³Π΄Π° Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ компилятор Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π­Ρ‚ΠΎΡ‚ контСкст тСряСтся, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Ρ‡Π΅Ρ€Π΅Π· настраиваСмоС наслСдованиС. Π― Π±Ρ‹ ΠΎΠΆΠΈΠ΄Π°Π», Ρ‡Ρ‚ΠΎ функция ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, заданная ΠΊΠ°ΠΊ настраиваСмая производная, Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Π½ΠΎ это Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ошибки, связанныС с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° #[structural_match] .


РСпродукция сцСнария

(Π’ ящикС с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ demo_plugin )

#![feature(rustc_macro, rustc_macro_lib)]

extern crate rustc_macro;

use rustc_macro::TokenStream;

#[rustc_macro_derive(Foo)]
pub fn derive_foo(input: TokenStream) -> TokenStream {
    input
}

(Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ ящикС)

#![feature(rustc_macro)]

#[macro_use] extern crate demo_plugin;

#[derive(PartialEq, Eq, Foo)]
struct Bar {
    a: i32,
    b: i32,
}

Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ #[derive(Eq)] заставляСт всС Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ.

@sgrif Π°Ρ… Π΄Π°, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, спасибо, Ρ‡Ρ‚ΠΎ Π½Π°ΠΏΠΎΠΌΠ½ΠΈΠ»ΠΈ ΠΌΠ½Π΅!

Π˜Ρ‚Π°ΠΊ, здСсь происходит нСсколько Π²Π΅Ρ‰Π΅ΠΉ:

  • Π‘ #[derive(PartialEq, Eq)] компилятор ΠΌΠΎΠ»Ρ‡Π° добавляСт #[structural_match] ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ статичСски ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π²ΠΎΠ΄ PartialEq Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ выполняСт этот ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚.
  • Π― ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ #[derive(Copy, Clone)] с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ #[rustc_copy_clone_marker] .
  • Π’ настоящСС врСмя это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ этих Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ «допускаСт Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒΒ». Однако ΠΌΡ‹ тСряСм ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΏΡ€ΠΈ синтаксичСском Π°Π½Π°Π»ΠΈΠ·Π΅ ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΌ Π°Π½Π°Π»ΠΈΠ·Π΅.

Π˜Ρ‚Π°ΠΊ, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ:

  • ΠžΠ±Ρ‹Ρ‡Π½ΠΎ говорят, Ρ‡Ρ‚ΠΎ Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΌ мСстС ΠΈΠ΄Π΅Ρ‚ кастомноС ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ #[derive(Foo, Eq, PartialEq)]
  • ΠŸΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅ΡΡŒ Π½Π° Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Π΅ΠΌΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡƒΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ эти Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹
  • НС Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ настраиваСмыС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, Ссли ΠΌΡ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅ΠΌ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Π΅ΠΌΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡƒΡŽ
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π² компиляторС для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ говорят эти Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, Π½ΠΎ Π½Π΅ Ρ‡Π΅Ρ€Π΅Π· сам AST.

Π― Π±Ρ‹Π» Π±Ρ‹ Π·Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π»ΠΈΠ±ΠΎ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эти Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ. Однако это Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ слоТно, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ #[derive(Copy, Foo, Clone)] Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ (Π³Π΄Π΅ Π² сСрСдинС выполняСтся ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ опрСдСлСния).

Π― ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ Π½Π΅ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ эти Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, Ссли ΠΌΡ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠΌ настраиваСмоС наслСдованиС. Но Π΄Π°ΠΆΠ΅ это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎ. На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ достаточно соглашСния «сначала ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ, Π° Π·Π°Ρ‚Π΅ΠΌ стандартный», Π½ΠΎ я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ это ΠΏΠ΅Ρ€Π΅Π΄ стабилизациСй.

ΠžΡ‚ΠΊΠ°Π· ΠΎΡ‚ отвСтствСнности: Ρƒ мСня Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ внСшний Π²ΠΈΠ΄ компилятора, поэтому я ΠΌΠ½ΠΎΠ³ΠΎΠ³ΠΎ Π½Π΅ знаю. ^^

Но, насколько я понимаю, Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ созданию настраиваСмых макросов 1.1 большС ΠΏΠΎΡ…ΠΎΠΆ Π½Π° Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ ΠΎΠ±Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡƒΡ‚ΡŒ. Π’Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ «довольно Π΄ΠΎΠ»Π³ΠΎΒ». Но Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ (= макросы 2.0) ΠΌΡ‹ большС Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ цикличСский Π°Π½Π°Π»ΠΈΠ· строк, Ρ‡Ρ‚ΠΎ Π² настоящСС врСмя ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΠΎΡ‚Π΅Ρ€Π΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°. Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ, Π±Ρ‹Π»ΠΈ Π»ΠΈ эти скрытыС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π² AST Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠ»ΠΎΡ…ΠΎΠΉ Π²Π΅Ρ‰ΡŒΡŽ Π² ΠΌΠΈΡ€Π΅ макросов 2.0? ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, ΠΊΡ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ, ΠΊΡ‚ΠΎ Π·Π½Π°Π΅Ρ‚ компилятор ΠΈΠ·Π½ΡƒΡ‚Ρ€ΠΈ, смоТСт ΡΠΊΠ°Π·Π°Ρ‚ΡŒ. Если эти скрытыС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠΌΠ΅ΡŽΡ‚ смысл Π² этом Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ ΠΌΠΈΡ€Π΅, я Π±Ρ‹ поспорил с ΠΎΠ±Ρ…ΠΎΠ΄Π½Ρ‹ΠΌ ΠΏΡƒΡ‚Π΅ΠΌ, Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ помСщая ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅. Π’ любом случаС, это ΡƒΠΆΠ΅ ΠΎΠ±Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡƒΡ‚ΡŒ, Π½Π΅ Ρ‚Π°ΠΊ Π»ΠΈ?

@ colin-kiegel Π― ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΏΡ€Π°Π²Ρ‹ Π² Ρ‚ΠΎΠΌ смыслС, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ сСйчас, _Π½Π΅_ Π±ΡƒΠ΄ΡƒΡ‰Π΅Π΅. Допустим, Ρƒ вас Π΅ΡΡ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

#[derive(Eq, Foo, PartialEq)]

БСгодня ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Eq , Π·Π°Ρ‚Π΅ΠΌ запустим ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ для Foo , Π° Π·Π°Ρ‚Π΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ PartialEq . Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΌΠΎΠΆΠ΅Ρ‚ _Π·Π°ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ_ ΠΌΠ΅ΠΆΠ΄Ρƒ Eq ΠΈ PartialEq , поэтому #[structural_match] Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΠΎΠ΅ Eq ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ послС выполнСния Foo .

Π’ этом смыслС я согласСн с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π² любом случаС ΠΎΠ½ΠΈ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ рассчитаны Π½Π° Π±ΡƒΠ΄ΡƒΡ‰Π΅Π΅!

МнС каТСтся, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π°ΠΈ, основанныС Π½Π° структурных измСнСниях, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΡΠΎΡ‡Π΅Ρ‚Π°ΡŽΡ‚ΡΡ, нСзависимо ΠΎΡ‚ этих скрытых Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ². Π‘ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈ кастомная вСрсия v2.0 ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ структуру ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π° ΠΈΠ»ΠΈ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠΊΡ€Π°ΡˆΠ΅Π½ΠΈΠ΅ΠΌ?

Π”Π°, я Π²Π΅Ρ€ΡŽ, Ρ‡Ρ‚ΠΎ такая Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ всСгда Π±ΡƒΠ΄Π΅Ρ‚ (присуща интСрфСйсу TokenStream -> TokenStream), хотя я ΠΏΠΎΠ΄ΠΎΠ·Ρ€Π΅Π²Π°ΡŽ, Ρ‡Ρ‚ΠΎ любая разумная рСализация #[derive] сохранит структуру исходной структуры.

Π― Π½Π΅ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² Π½Π΅ содСрТал саму структуру, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ структура Π½Π΅ измСнится? Входная структура TokenStream Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌ прСфиксом? Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ Π² ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ нСраспознанных Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ сборки. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ # [derive ()] ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ прСфикс (скаТСм, # [derive (Foo)] ΠΈΠΌΠ΅Π΅Ρ‚ прСфикс Foo_), с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡŽΡ‚, ΠΈ послС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ настраиваСмого наслСдования ΠΌΡ‹ удаляСм эти Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹?

@mystor, Π΄Π°, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с этим ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠΌ - нСраспознанныС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, поэтому Π½Π° Π²Ρ…ΠΎΠ΄Π΅ Ρƒ нас Π΅ΡΡ‚ΡŒ вся структура. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΎ, Ρ‡Π΅ΠΌ ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ прСфикс / суффикс / Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π°Ρ†ΠΈΡŽ / ΠΈ Ρ‚. Π”.

Если настраиваСмая производная вСрсия v2.0 ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠ΅Ρ‡Π°Ρ‚ΡŒ настраиваСмыС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΊΠ°ΠΊ _ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅_, ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π° доступом Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния ΠΊ ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΉ части ΠΏΠΎΡ‚ΠΎΠΊΠ° Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² элСмСнтов. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, IMO ΠΌΠΎΠΆΠ΅Ρ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΡƒΡŽ ΠΊΠΎΠΌΠΏΠΎΠ½ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ…. Если макросу v2.0 Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ структуру элСмСнта, Π΅ΠΌΡƒ придСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ API, Π½ΠΎ Π½Π΅ настраиваСмоС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ΅. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с #[structural_mach] ΠΈ упорядочСниСм (настраиваСмых) ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² макросах 1.1. Π­Ρ‚ΠΎ ΠΈΠΌΠ΅Π»ΠΎ Π±Ρ‹ смысл?

Π”Ρ€ΡƒΠ³ΠΎΠΉ вопрос. Если Ρƒ структуры Π΅ΡΡ‚ΡŒ Π΄Π²Π° Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π° вторая Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠ°Π½ΠΈΠΊΡƒ, Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ошибок Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° ΠΏΠ΅Ρ€Π²ΡƒΡŽ, Π° Π½Π΅ Π½Π° Π²Ρ‹Π·Π²Π°Π²ΡˆΡƒΡŽ ΠΏΠ°Π½ΠΈΠΊΡƒ.


Π‘ΠΊΡ€ΠΈΠΏΡ‚ воспроизвСдСния

Π’ ящикС ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ demo_plugin

#![feature(rustc_macro, rustc_macro_lib)]

extern crate rustc_macro;

use rustc_macro::TokenStream;

#[rustc_macro_derive(Foo)]
pub fn derive_foo(input: TokenStream) -> TokenStream {
    input
}

#[rustc_macro_derive(Bar)]
pub fn derive_bar(input: TokenStream) -> TokenStream {
    panic!("lolnope");
}

Π’ Π΄Ρ€ΡƒΠ³ΠΎΠΌ ящикС

#![feature(rustc_macro)]

#[macro_use] extern crate demo_plugin;

#[derive(Foo, Bar)]
struct Baz {
    a: i32,
    b: i32,
}

Ошибка Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ Foo Π΄Π°ΠΆΠ΅ Ссли Bar Π·Π°ΠΏΠ°Π½ΠΈΠΊΠΎΠ²Π°Π».

Бпасибо Π·Π° ΠΎΡ‚Ρ‡Π΅Ρ‚ @sgrif! Π― ΠΎΠ±Π½ΠΎΠ²ΠΈΠ» описаниС этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈ надСюсь Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ всС Π½Π΅Ρ€Π΅ΡˆΠ΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, связанныС с макросами 1.1.

Π₯ΠΌ, взаимодСйствиС custom derive с #[structural_eq] - это Ρ‚ΠΎ, ΠΎ Ρ‡Π΅ΠΌ я Ρ€Π°Π½ΡŒΡˆΠ΅ Π½Π΅ Π΄ΡƒΠΌΠ°Π». МСня это скорСС бСспокоит!

МнС каТСтся, Ρ‡Ρ‚ΠΎ способ Β«Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒΒ» тСкст Π² ΠΏΠΎΡ‚ΠΎΠΊ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΠΈΠΌ интСрфСйсом Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ² ... ΠΎΠ½ сохранит ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΈ ΠΈΠ·Π±Π΅ΠΆΠΈΡ‚ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Π½Π΅ Ρ‚Π°ΠΊ Π»ΠΈ?

Одним ΠΈΠ· прСимущСств Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰Π΅Π³ΠΎ интСрфСйса являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ позволяСт ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌ ΠΈΠΌΠ΅Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π² полях, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ ΠΏΡ€ΠΈ запускС макроса. Π­Ρ‚ΠΎ СдинствСнный извСстный ΠΌΠ½Π΅ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ использования, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ настраиваСмым макросам извлСчСния ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ исходный элСмСнт.

Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ вопрос интСрфСйса сводится ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ…ΠΎΡ‚ΠΈΠΌ Π»ΠΈ ΠΌΡ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π²Ρ‹Π²ΠΎΠ΄ Π±Ρ‹Π» «просто Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΈΠΌ макросом», ΠΈ Π² этом случаС каТСтся Π²Π°ΠΆΠ½Ρ‹ΠΌ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΆΠ΅ интСрфСйс, Ρ‡Ρ‚ΠΎ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы (Π³Π΄Π΅ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ исходный элСмСнт). Или это Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ со ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ интСрфСйсом, ΠΈ Π² этом случаС Π±ΠΎΠ»Π΅Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ (Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ) интСрфСйс ΠΈΠΌΠ΅Π΅Ρ‚ смысл.

Π—Π°ΠΌΠ΅Ρ‡Ρƒ, Ρ‡Ρ‚ΠΎ Π² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΡ… синтаксиса Π΄ΠΎΠ»Π³ΠΎΠ΅ врСмя Π±Ρ‹Π»ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌΠΈ ΠΈ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ, ΠΈ я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ всС участники Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅Π½Π°Π²ΠΈΠ΄Π΅Π»ΠΈ это Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ я Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½Π΅ΠΎΡ…ΠΎΡ‚Π½ΠΎ ΠΈΠ΄Ρƒ ΠΏΠΎ ΠΏΡƒΡ‚ΠΈ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ настраиваСмоС наслСдованиС Π±Ρ‹Π»ΠΎ Ρ‡Π΅ΠΌ-Ρ‚ΠΎ особСнным (ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π²ΡˆΠ°ΡΡΡ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° - это ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ особСнный ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π²Ρ‹Π²ΠΎΠ΄, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄Π°ΠΆΠ΅ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚).

@nrc Π½Ρƒ, это всС Π΅Ρ‰Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ tokenstream -> tokenstream, Π³Π΄Π΅ ΠΌΡ‹ просто Π½Π΅ прСдоставляСм ΠΌΠ΅Ρ‚ΠΎΠ΄ new ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ начинаСтся с нуля, Π²Π΅Ρ€Π½ΠΎ?

Π― согласСн с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅Ρ‚ΡŒΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠΌΠ΅Ρ‚ΡŒ настраиваСмыС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π² полях, Ρ‡Ρ‚ΠΎΠ±Ρ‹ настраиваСмый ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠΌΠ΅Π» смысл. Но я ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ способов ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π² стилС Β«Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒΒ» - это, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, слСдуСт ΠΎΠ±ΡΡƒΠ΄ΠΈΡ‚ΡŒ. Π― ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ ΡΡ‚ΠΈΠ»ΡŒ добавлСния, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ я ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ ΠΌΠΈΡ€, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ макросы наслСдования Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ элСмСнт ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ, плюс это Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ #[structural_eq] . ИМО, это ΠΊΠ°ΠΊ Ρ€Π°Π· Ρ‚ΠΎ количСство свободы.

Если людям Π½Π΅ Π½Ρ€Π°Π²ΠΈΠ»Π°ΡΡŒ эта ΡΡƒΠ΄ΡŒΠ±Π°, я Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ ΡΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Π±Ρ‹Π»ΠΎ достаточно ΠΏΡ€ΠΈΡ‡ΠΈΠ½, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ Ρ€Π°Π½ΡŒΡˆΠ΅, Π½Π΅ Ρ‚Π°ΠΊ Π»ΠΈ?

(Π― полагаю, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ я ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ», - это всСго лишь Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π° самом Π΄Π΅Π»Π΅ Π½Π΅ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ Π΄ΠΎΠ»Π³ΠΎΡΡ€ΠΎΡ‡Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ.)

Π’ ΠΌΠΎΠΈΡ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… Π² настоящСС врСмя Π΅ΡΡ‚ΡŒ макросы Π²ΠΈΠ΄Π° foo!(Bar, parameters...) , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ структуру Bar ΠΈΠ· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

Π’ΠΎ врСмя Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ обсуТдСния IRC Ρƒ нас Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° идСя Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ вмСсто этого #[derive(Foo)] #[params] struct Bar; ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ foo! Π½Π° #[derive(Foo)] ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅Π»ΠΎ структуры.

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, это Π½Π΅ ΡΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, Π½ΠΎ ΠΌΠ½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ½Ρ€Π°Π²ΠΈΠ»Π°ΡΡŒ эта идСя, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π±ΠΎΠ»Π΅Π΅ ясно, Ρ‡Ρ‚ΠΎ структура создаСтся.

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ, ΠΌΠΎΠΆΠ΅ΠΌ Π»ΠΈ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»Π°Ρ‚ΡŒ #[structural_match] Ρ‡Ρ‚ΠΎΠ±Ρ‹ вмСсто этого ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² сгСнСрированный impl.

(На самом Π΄Π΅Π»Π΅ Π½Π΅ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ)

Π‘Ρ‚ΠΎΠΈΡ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΊ Serde, Ρ‚Π°ΠΊ ΠΈ Diesel ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ настраиваСмыС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π² полях, поэтому сущСствуСт опрСдСлСнная Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² настраиваСмом наслСдовании для возмоТности Π·Π°ΠΌΠ΅Π½Ρ‹.

Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π° самом Π΄Π΅Π»Π΅, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, я просто Π½Π΅ Π΄ΡƒΠΌΠ°ΡŽ ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ #[structural_match] . Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ кастомная производная?

  • Если настраиваСмая производная ΠΊΠΎΠΌΠ°Π½Π΄Π° Π»ΠΎΠΆΠ½ΠΎ вставляСт Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ #[structural_match] , ΠΎΠ½Π° Π½Π΅ ΠΏΡ€ΠΎΠΉΠ΄Ρ‘Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Если Π½Π΅Ρ‚, Ρ‚ΠΎ это ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° ΠΎΡˆΠΈΠ±ΠΊΡƒ! (Однако, учитывая слоТный ΠΈ Π΄ΡƒΡ€Π°Ρ†ΠΊΠΈΠΉ способ Ρ€Π°Π±ΠΎΡ‚Ρ‹ этого ΠΊΠΎΠ΄Π°, мСня это Π½Π΅ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚.)
  • Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΡƒΠ΄Π°Π»ΠΈΡ‚ Π΅Π³ΠΎ, Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π²Ρ€Π΅Π΄Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚.

Π˜Π·Π²ΠΈΠ½ΠΈΡ‚Π΅ Π·Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ написал массу ΠΌΠ΅Π»ΠΊΠΈΡ… ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² ΠΈ ΠΏΠΎΠ΄ΡƒΠΌΠ°Π» вслух, Π½ΠΎ Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ бСспокойство. Π₯отя настраиваСмая производная вСрсия ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ Π² состоянии Β«ΠΏΠΎΠ΄Π΄Π΅Π»Π°Ρ‚ΡŒΒ» Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ #[structural_match] (ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ Π±Π΅Π· «волшСбного Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°Β»), это, вСроятно, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ искаТСнию Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° любой ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ порядкС, Ρ‡Ρ‚ΠΎ прискорбно. По сути, это ΠΏΡ€ΠΈΠΌΠ΅Ρ€ нСсовмСстимости, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ» @ colin-kiegel, Π½ΠΎ Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ структуру Π² ΠΏΠΎΠ»Π΅Ρ‚Π΅.

(Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ полагаСмся Π½Π° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΡƒΠ΄ΠΈΡ‚ΡŒ, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π», потСря ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ…ΠΈΡ‚Ρ€Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.)

Π Π•Π”ΠΠšΠ’Π˜Π ΠžΠ’ΠΠ’Π¬: ОК, читая Π½Π°Π·Π°Π΄, я Π²ΠΈΠΆΡƒ, Ρ‡Ρ‚ΠΎ я Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ» Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΡƒΠΆΠ΅ сообщил

Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ довольно Π³Ρ€ΡƒΠ±ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ раскрываСм Π΄Π΅Ρ‚Π°Π»ΠΈ Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠΌΡƒ ΠΊΠΎΠ΄Ρƒ. ИдСально ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π±Ρ‹ Π΄Π°ΠΆΠ΅ Π½Π΅ ΡƒΠ·Π½Π°Π» ΠΎ сущСствовании Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ #[structural_match] .

@nikomatsakis Ну, Ρ‚Π°ΠΊ ΠΈΠ»ΠΈ ΠΈΠ½Π°Ρ‡Π΅, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π°Π»ΠΎΠΆΠΈΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ограничСния Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ Π»ΠΈ макрос для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ (ΠΈ Π΄Ρ€ΡƒΠ³ΡƒΡŽ сСмантику) нСзависимо ΠΎΡ‚ сигнатуры Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

@ colin-kiegel

Π― ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ ΡΡ‚ΠΈΠ»ΡŒ добавлСния, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ я ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ ΠΌΠΈΡ€, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ макросы наслСдования Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ элСмСнт ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ, плюс это Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ # [structure_eq]. ИМО, это ΠΊΠ°ΠΊ Ρ€Π°Π· Ρ‚ΠΎ количСство свободы.

Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ измСняСмыС макросы ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°Ρ‚ΡŒ, хотя, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, условия составлСния Ρ€Π°Π·Π½Ρ‹Π΅. Ясно, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈ пост-условий для Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ…, ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ выполняСмых компилятором ΠΈΠ»ΠΈ ΠΏΠΎ соглашСнию. ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ ΠΌΡƒΡ‚Π°Ρ†ΠΈΠΉ каТСтся ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· крайностСй Π² спСктрС ΠΈΠ½Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ здСсь Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ, ΠΈ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΡƒΠΆΠ΅ обсуТдаСм способы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ смягчСно (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, использованиС ΠΌΠ°Ρ€ΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²). Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Π² Ρ†Π΅Π»ΠΎΠΌ ΠΌΡ‹ Π±Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Π»ΠΈ самыС простыС условия ΠΈ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»ΠΈΡΡŒ компилятором. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, это частично связано с вопросом ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ слСдуСт ΠΎΡ‚Π½ΠΎΡΠΈΡ‚ΡŒΡΡ ΠΊ особому ΠΎΠ±Ρ‹Ρ‡Π°ΡŽ.

Если людям Π½Π΅ Π½Ρ€Π°Π²ΠΈΠ»Π°ΡΡŒ эта ΡΡƒΠ΄ΡŒΠ±Π°, я Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ ΡΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Π±Ρ‹Π»ΠΎ достаточно ΠΏΡ€ΠΈΡ‡ΠΈΠ½, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ Ρ€Π°Π½ΡŒΡˆΠ΅, Π½Π΅ Ρ‚Π°ΠΊ Π»ΠΈ?

Π― Π½Π΅ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Π² Ρ‚ΠΎ врСмя Π±Ρ‹Π»Π° сильная мотивация. Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ это Π±Ρ‹Π»ΠΎ Π»Π΅Π³ΠΊΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ «казалось Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΈΠ΄Π΅Π΅ΠΉΒ». Π•Π³ΠΎ Π½Π΅ любили, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ услоТняСт Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, добавляСт Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ для Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² макросов, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния, ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ макросы ΠΌΠ΅Π½Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈΠΌΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΠΌ приходится Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ, ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΠΊΡ€Π°ΡˆΠ°Ρ‚ΡŒ.

Π― Π±Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ‚Π΅Π» ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎ долгосрочном Π΄ΠΈΠ·Π°ΠΉΠ½Π΅ кастомного заимствования ΠΈ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ двиТСмся Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ. МнС каТСтся, Ρ‡Ρ‚ΠΎ ограничСния Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ 1.1 ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ большС ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ скорСС мутят Π²ΠΎΠ΄Ρƒ здСсь, ΠΈ ΠΌΡ‹ тСряСм ΠΈΠ· Π²ΠΈΠ΄Ρƒ Π±ΠΎΠ»Π΅Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΎΠ΅ Π²ΠΈΠ΄Π΅Π½ΠΈΠ΅.

Π― согласСн с @jimmycuadra Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° настраиваСмых Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Ρ‚Π΅ΠΌ ΠΈΠ»ΠΈ ΠΈΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ являСтся ТСстким Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. @nikomatsakis Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π°Π² Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ тСкущая ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° #[derive(PartialEq, Eq)] Π½Π΅ соотвСтствуСт трСбованиям, ΠΈ ΠΌΡ‹ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΅Π³ΠΎ ΡΡ‚Π°Π±ΠΈΠ»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. НаконСц, Ρƒ @mystor Π΅ΡΡ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Ρ€Π΅ΠΆΠΈΠΌΡ‹ получСния Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄Π°ΠΆΠ΅ Π·Π½Π°Ρ‚ΡŒ ΠΎΠ± этом магичСском Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π΅. ΠœΡ‹ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°Ρ…ΠΎΡ‚ΠΈΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΅Ρ‰Π΅ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ, ΠΈ я Π½Π΅ Ρ…ΠΎΡ‡Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ макросы 1.1 помСшали Π½Π°ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это.

Π’Π°ΠΊΠΆΠ΅ Вторя @nrc Β«s настроСния ΠΎ долгосрочном ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… DERIVE, я Π΄ΡƒΠΌΠ°ΡŽ, ΠΌΠ½ΠΎΠ³ΠΎ это сводится ΠΊ Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ #[derive] Π½Π° самом Π΄Π΅Π»Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Если ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ @nrc ΠΈΠΌΠ΅Π΅Ρ‚ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ смысл Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΈ Π½Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠ², Π½ΠΎ #[derive] являСтся довольно особСнным, ΠΊΠΎΠ³Π΄Π° настраиваСмая производная Π½Π΅ опрСдСляСт Π½ΠΎΠ²Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚, Π° скорСС просто прикрСпляСтся ΠΊ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ.

ΠŸΡ€ΡΠΌΠΎ сСйчас Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΅ΡΡ‚ΡŒ строгоС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠΎΠ² #[derive] . ВсС Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ Ρ€Π΅ΠΆΠΈΠΌΡ‹ извлСчСния Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² Ρ†ΠΈΠΊΠ»Π΅, ΠΈ всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° срабатываСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Ρ€Π΅ΠΆΠΈΠΌ извлСчСния, ΠΌΡ‹ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ сСриализуСм, Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌ, Π° Π·Π°Ρ‚Π΅ΠΌ возвращаСмся ΠΊ этапу 1. Π­Ρ‚ΠΎ, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ компилятор ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ #[derive] _ нСсколько Ρ€Π°Π· для ΠΎΠ΄Π½ΠΎΠ³ΠΎ. ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ°_. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ появлСнию волосатости.

Π£ мСня ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ - Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ порядок раскрытия #[derive] :

  • Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, всС настраиваСмыС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΈΠ· макроса 1.1 Ρ€Π°ΡΡˆΠΈΡ€ΡΡŽΡ‚ΡΡ ΠΎΠ΄ΠΈΠ½ Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ. Π’ΠΎ Π΅ΡΡ‚ΡŒ, Ссли Ρƒ вас Π΅ΡΡ‚ΡŒ #[derive(Clone, Foo)] ΠΌΡ‹ сначала ΠΈΠ·Π²Π»Π΅Ρ‡Π΅ΠΌ Foo Π³Π΄Π΅ Ρƒ структуры Π΅ΡΡ‚ΡŒ аннотация #[derive(Clone)] . Если Π±Ρ‹ этот #[derive] сохранился, ΠΌΡ‹ Π±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π²ΡΡ‚Ρ€ΠΎΠ΅Π½Π½ΡƒΡŽ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ Clone .
  • Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, всС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, нСизвСстныС компилятору, Ρ€Π°ΡΡˆΠΈΡ€ΡΡŽΡ‚ΡΡ Π΄ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² #[derive_Bar] . Π­Ρ‚ΠΎ всСго лишь ΡƒΠ»ΠΎΠ²ΠΊΠ° ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ совмСстимости, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ, ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ.
  • НаконСц, компилятор Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ всС извСстныС ΠΈ встроСнныС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ #[derive]

Π­Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ эффСкт: Π²Ρ‹ Π½Π΅ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚Π΅ слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ, Π½ΠΎ ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅ ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ это всСго лишь #[derive] . Π­Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ компилятору ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ знания ΠΎΠ± ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ структуры, ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ встроСнныС Ρ‡Π΅Ρ€Ρ‚Ρ‹, ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ структура Ρ‚ΠΈΠΏΠ° Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ измСнится.

Как это Π·Π²ΡƒΡ‡ΠΈΡ‚? Π― ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ это Ρ€Π΅ΡˆΠ°Π΅Ρ‚ всС ограничСния здСсь?


@nikomatsakis Π― Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ стратСгия размСщСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° Π² impl Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ настраиваСмыС Ρ€Π΅ΠΆΠΈΠΌΡ‹ получСния ΠΌΠΎΠ³ΡƒΡ‚ тСорСтичСски ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΌΠ°ΠΊΠ΅Ρ‚ структуры, Π΄Π°ΠΆΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΏΠΎΠ»Π΅ΠΉ. Π― Π΄ΡƒΠΌΠ°ΡŽ, это Π½Π°Ρ€ΡƒΡˆΠΈΡ‚ прСдполоТСния компилятора ΠΏΡ€ΠΈ Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΈ.

Π‘Ρ‹Π» Π»ΠΈ ΠΊΠΎΠ³Π΄Π°-Π»ΠΈΠ±ΠΎ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎ объявлСн порядок, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅, ΠΊΠ°ΠΊ слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ, Ρ‡Π΅Ρ€Π΅Π· ссылку Π½Π° Rust ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΅Ρ‰Π΅? Π’ Ρ†Π΅Π»ΠΎΠΌ, ΠΈΠΌΠ΅Π΅Ρ‚ Π»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ порядок Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²? ΠŸΠΎΡ…ΠΎΠΆΠ΅, Ρ‡Ρ‚ΠΎ это просто ΡΠ»ΡƒΡ‡Π°ΠΉΠ½ΠΎΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ это Π±Ρ‹Π»ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΈ Π°Π²Ρ‚ΠΎΡ€Ρ‹ макросов Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Π»ΠΈ ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° порядок слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ. ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ АлСкса ΠΏΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… запросов происходит Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²ΠΈΠ΄Π΅Π»ΠΈ магичСских Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… компилятором, ΠΈΠΌΠ΅Π΅Ρ‚ большой смысл.

Π― просто Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΠ½Π΅ Π½Π΅ нравится идСя, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΌΠ°ΠΊΠ΅Ρ‚ структуры. Π― Π±Ρ‹ Ρ…ΠΎΡ‚Π΅Π» ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ это для Ρ‡Π΅Π³ΠΎ-Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ для бСзопасности. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ #[derive(Trace)] ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡƒΡŽ rust-gc .

#[derive(Trace)]
struct Foo {
    a: Gc<i32>,
}

Π Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ Π΄ΠΎ:

struct Foo {
    a: Gc<i32>,
}

unsafe impl Trace { // NOTE: Strawman impl
    unsafe fn trace(&self) { Trace::trace(&self.a) }
}

Однако, Ссли ΠΌΡ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΠΌ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ поля Π² структурС, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Π΅ΠΌΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡƒΡŽ Evil :

#[derive(Evil)]
struct Foo {
    a: Gc<i32>,
}

Π Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ Π΄ΠΎ:

struct Foo {
    a: Gc<i32>,
    b: Gc<i32>,
}

Π§Ρ‚ΠΎ, Ссли ΠΈΡ… ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ:

#[derive(Trace, Evil)]
struct Foo {
    a: Gc<i32>,
}

Π Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ Π΄ΠΎ:

struct Foo {
    a: Gc<i32>,
    b: Gc<i32>,
}

unsafe impl Trace {
    unsafe fn trace(&self) { Trace::trace(&self.a) }
}

Π­Ρ‚ΠΎ нСнадСТная рСализация Trace . ΠŸΡ€ΠΈ использовании с rust-gc это позволяСт b Π±Ρ‹Ρ‚ΡŒ висящСй ссылкой, Ρ‡Ρ‚ΠΎ уТасно нСбСзопасно ΠΈ Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½ΠΎ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Trace большС Π½Π΅ являСтся бСзопасным для Ρ‚ΠΈΠΏΠ° #[derive] , Ρ‡Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ прискорбно.

Π― Π»ΠΈΡ‡Π½ΠΎ ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ любой Ρ…ΠΎΡ€ΠΎΡˆΠΎ управляСмый #[derive] Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ ΠΌΠ°ΠΊΠ΅Ρ‚ / структуру структуры, Π° Ссли это ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ρ‚ΠΎ Π²Π°ΠΌ просто Π½Π΅ ΠΏΠΎΠ²Π΅Π·Π»ΠΎ. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ для настраиваСмого ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΡΠ±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π΅ΡˆΠ°ΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΈ ΠΎΡ‚ΠΊΠ°Π· ΠΎΡ‚ этого Π½Π΅ являСтся основаниСм для Π½Π°Ρ‡Π°Π»Π°. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π² сСбя ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ Ρ„ΠΎΡ€ΠΌΡ‹ Π±Π΅Π»Ρ‹Ρ… списков ΠΈΠ»ΠΈ Ρ‡Π΅Π³ΠΎ-Ρ‚ΠΎ Π΅Ρ‰Π΅, довольно сильно ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ простого интСрфСйса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ сСгодня.

Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, я Π½Π΅ ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ «чистота» Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ #[derive] Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ измСняСт структуру, стоит Π·Π°Ρ‚Ρ€Π°Ρ‚.

МнС просто интСрСсно, Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ Ρƒ Π½Π΅Π³ΠΎ способ ΠΎΡ‚Π±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, Π½Π΅ позволяя Π΅ΠΌΡƒ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ поля (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, провСряя, Ρ‡Ρ‚ΠΎ поля Π² ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ структурС ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ с исходной структурой, ΠΈ Π²Ρ‹Π΄Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Ссли ΠΎΠ½ΠΈ Π½Π΅ ' t, Π½ΠΎ Π½Π΅ ΠΆΠ°Π»ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Ссли Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ измСнилось).

Π£ мСня ΠΏΠ»ΠΎΡ…ΠΎΠ΅ прСдчувствиС, Ρ‡Ρ‚ΠΎ я позволю ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ структуру. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ @mystor - это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ я ΠΈΠΌΠ΅Π» Π² Π²ΠΈΠ΄Ρƒ, ΠΊΠΎΠ³Π΄Π° Π³ΠΎΠ²ΠΎΡ€ΠΈΠ» ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ΅ ... Π½Π° высоком ΡƒΡ€ΠΎΠ²Π½Π΅ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, это Π±Ρ‹Π» Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½).

Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ люди Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ этим, Ссли ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ доступно. И это заставит ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΉ Ρ€Π°Π·ΠΌΡ‹ΡˆΠ»ΡΡ‚ΡŒ ΠΎ дСталях Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ наслСдования ΠΈ порядкС ΠΈΡ… выполнСния.

Π― Π±Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Π΅Π», Ρ‡Ρ‚ΠΎΠ±Ρ‹ я ΠΌΠΎΠ³ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ «эй, я Π½Π΅ знаю, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ это ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ΅, Π½ΠΎ я понимаю Π΄Ρ€ΡƒΠ³ΠΎΠ΅Β» Π±Π΅Π· взаимозависимости. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС это Π±ΡƒΠ΄Π΅Ρ‚ боль Π² ΠΏΠ°Π»ΡŒΡ†Π΅ Π½ΠΎΠ³ΠΈ, ΠΈ я Π²Π΅Ρ€ΡŽ, Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚.

Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ макрос, Π΄Π΅Π»Π°ΡŽΡ‰ΠΈΠΉ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ врСдоносноС, отличаСтся ΠΎΡ‚ любого ящика, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ для Ρ‡Π΅Π³ΠΎ-Ρ‚ΠΎ врСдоносного? Π’ любом ящикС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСбСзопасный ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π΅Π»Π°Π΅Ρ‚ Ρ‚ΠΎ, Ρ‡Π΅Π³ΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½. ΠŸΠΎΡ…ΠΎΠΆΠ΅, этот случай просто связан с Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ Π²Ρ‹ опрСдСляСтС Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ любого ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Π½Π΅ писали сами, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, рСпутация сообщСства, ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° источника ΠΈ Ρ‚. Π”.

Π― Π½Π΅ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΊΡ€Π΅ΠΉΡ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π·Π»ΠΎΠ½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠ΅, скорСС я оТидаю, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Β«ΡƒΠΌΠ½Ρ‹ΠΌΠΈΒ» ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ изящныС Ρ‚Ρ€ΡŽΠΊΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π±ΠΎΠ»Π΅Π΅ эффСктивной ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, ΠΈ Ρ‡Ρ‚ΠΎΠ±Ρ‹ это сломало Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ настраиваСмого наслСдования. Π― Π½Π΅ Π±Ρ‹Π» Π±Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΈΠ²Π»Π΅Π½, Ссли Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ Π½Π°Ρ‡Π½ΡƒΡ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ поля Π² структуры, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΈΡ… рСализациях, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚, Π° Π·Π°Ρ‚Π΅ΠΌ Π½Π°Ρ€ΡƒΡˆΠ°ΡŽΡ‚ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ Trace.

@mystor Π­Ρ‚ΠΎ Π·Π²ΡƒΡ‡ΠΈΡ‚ умСстно Π² Ρ‚Π΅ΠΎΡ€ΠΈΠΈ, Π½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ всС поля структуры Π² Rust, поэтому Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΌΠ΅Π½Π΅Π΅ вСроятно, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ Ρ‚ΠΈΡ…ΠΎ, Ρ‡Π΅ΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² C ++.

@alexcrichton

Π£ мСня ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ - Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ порядок раскрытия #[derive]

МнС нравится эта идСя. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π½ΡƒΠΆΠ½ΠΎ просто Π·Π°ΡΠ²ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ порядок раскрытия Β«Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Β». Π’ послСднСС врСмя Π½Π°ΠΌ доводилось Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ PartialEq / Eq, Π½ΠΎ для этого Π½Π΅Ρ‚ строгих ΠΏΡ€ΠΈΡ‡ΠΈΠ½.

Π§Ρ‚ΠΎ касаСтся ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ…, ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΡ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ структуры, я согласСн, Ρ‡Ρ‚ΠΎ это Π·Π²ΡƒΡ‡ΠΈΡ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Ρ‚ΠΎΠ½ΠΊΠΎ, Π½ΠΎ мСня это Π½Π΅ слишком бСспокоит. Π― Π±Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄ΡƒΠΌΠ°Π», Ρ‡Ρ‚ΠΎ «автоматичСская вставка» ΠΏΠΎΠ»Π΅ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ, Π½ΠΎ я Π±Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Π΅Π», Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚Π°ΠΊΠΈΠ΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Π±Ρ‹Π»ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ, Π° Π½Π΅ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π»ΠΈΡΡŒ Π² список ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ…, Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ люди полагались Π½Π° порядок Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сСйчас.

PS. Π― Π±Ρ‹ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎ рассмотрСл Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования (Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ) Π“Π‘Π§, засСянного Ρ…Π΅ΡˆΠ΅ΠΌ ящика, ΠΈΠ»ΠΈ Ρ‡Π΅Π³ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ порядок Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ люди Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° порядок Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ. Π― всСгда Ρ…ΠΎΡ‚Π΅Π» ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π² ΠΊΠ°ΠΊΠΎΠΌ-Ρ‚ΠΎ контСкстС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ нСявныС зависимости, Π½ΠΎ Ρƒ мСня Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±Ρ‹Π»ΠΎ возмоТности. ;)

Π Π•Π”ΠΠšΠ’Π˜Π ΠžΠ’ΠΠ’Π¬: я ΠΏΠ΅Ρ€Π΅Π΄ΡƒΠΌΠ°Π» ΠΈ большС Π½Π΅ Π²ΠΈΠΆΡƒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ Π·Π°ΠΏΡ€Π΅Ρ‰Π°Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ структуры, Π½ΠΎ Π²ΠΎΡ‚ ΠΌΠΎΠΉ исходный ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ для контСкста

Π˜Ρ‚Π°ΠΊ, насколько я понимаю, это Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌΡƒ #[derive] ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ структуру:

  • Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях (Π½Π΅ Π²ΠΈΠ΄Π΅Π» ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², Π½ΠΎ ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π΅ΡΡ‚ΡŒ)
  • ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹
  • ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… возмоТностСй Π°Π²Ρ‚ΠΎΡ€Π°ΠΌ настраиваСмых ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ…

Π₯отя Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ для добавлСния ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ рСализациям #[derive] (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ имя структуры ΠΈ поля / ΠΈΠΌΠ΅Π½Π° ΠΏΠΎΠ»Π΅ΠΉ Π² структурС ΠΎΡΡ‚Π°Π²Π°Π»ΠΈΡΡŒ Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΆΠ΅):

  • Π­Ρ‚ΠΎ позволяСт ΠΊΠΎΠ΄Ρƒ, сгСнСрированному ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ #[derive] Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ структуры Ρ‚ΠΈΠΏΠ°, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½ Π±Ρ‹Π» ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ для надСТности (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, #[derive(Trace)] ΠΈΠ· rust-gc, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ _Π΄ΠΎΠ»ΠΆΠ΅Π½_ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ фактичСский Ρ‚ΠΈΠΏ ΠΏΠΎΠ΄Π»ΠΎΠΆΠΊΠΈ, ΠΈΠ»ΠΈ это Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½ΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚ΠΎΠ½ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ послС бСсплатного использования)
  • Π­Ρ‚ΠΎ сниТаСт Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ нСявных зависимостСй Π² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΡ… макросов, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ мСньшС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ пСрСдаСтся ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ Ρ‡Π΅Ρ€Π΅Π· структуру

На ΠΌΠΎΠΉ взгляд, Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ Π²Π°ΠΆΠ½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ написания Π·Π²ΡƒΠΊΠΎΠ²Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ unsafe trait impls ΠΈΠ»ΠΈ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ зависит ΠΎΡ‚ нСбСзопасного ΠΊΠΎΠ΄Π°, ΠΈ я ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ способы Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ возмоТностСй Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ ( Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ возмоТности Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ поля структуры) бСзопасным способом. Если Ρƒ нас Π½Π΅Ρ‚ ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ, я Π½Π΅ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ящики, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ rust-gc, ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ бСзопасно Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Π£ мСня Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ ΠΈΠ΄Π΅ΠΈ:

ИдСя 1

ΠŸΠ΅Ρ€Π΅Π΄ запуском настраиваСмого ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π° извлСчСния ΠΏΡ€ΠΎΡ‡Ρ‚ΠΈΡ‚Π΅ имя структуры ΠΈ ΠΈΠΌΠ΅Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΠΎΠ»Π΅ΠΉ. Когда ΠΏΡ€ΠΎΡ…ΠΎΠ΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ ΠΈ структура ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π°, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, совпадаСт Π»ΠΈ имя структуры ΠΈ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ Π»ΠΈ ΠΈΠΌΠ΅Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΠΎΠ»Π΅ΠΉ (ΠΈ количСство ΠΏΠΎΠ»Π΅ΠΉ). Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π²Ρ‹Π΄Π°ΠΉΡ‚Π΅ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚Π΅ сборку.

Π­Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ основныС структурныС свойства, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ…, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ, Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ извлСчСния, Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°Ρ€ΡƒΡˆΠ΅Π½Ρ‹, ΠΈ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ большС Π·Π²ΡƒΠΊΠΎΠ²Ρ‹Ρ… ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ извлСчСния. Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎ прСимущСство, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ совмСстимо с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠΌ, поэтому, Ссли ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π½Π°ΠΌ большС понравится Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ просто ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΈ Π²Π·Π»ΠΎΠΌΠ°Ρ‚ΡŒ Ρ‡Π΅ΠΉ-Π»ΠΈΠ±ΠΎ ΠΊΠΎΠ΄. Он Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ случай Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², ΠΊΠ°ΠΊ ΠΈ сСгодня.

ИдСя 2

Π”Π°ΠΉΡ‚Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ настраиваСмому ΠΏΠ»Π°Π³ΠΈΠ½Ρƒ Π΄Π΅Ρ€ΠΈΠ²Π°Ρ†ΠΈΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ TokenStream (исходный тСкст, написанный Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅). ПослС ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π·Π°ΠΏΠΈΡˆΠΈΡ‚Π΅, ΠΊΠ°ΠΊΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ всС Π΅Ρ‰Π΅ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ структурС. Если Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ присутствуСт Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ², ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚.

Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ упорядочСнныС зависимости (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ настраиваСмый ΠΏΠ»Π°Π³ΠΈΠ½ заимствования Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ исходным ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ), Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΄Π΅Π»Π°Π΅Ρ‚ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ ΠΈΡΠΏΠΎΡ€Ρ‚ΠΈΡ‚ΡŒ структуру ΠΏΠ»Π°Π³ΠΈΠ½Π°. МнС нравится эта идСя, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ настраиваСмоС наслСдованиС дСйствуСт Π² основном Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ, гСнСрируя Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΠΎΠ²Ρ‹Π΅ элСмСнты Π½Π° основС ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ структуры. Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅, вСроятно, Π±ΡƒΠ΄Π΅Ρ‚ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π² любоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅.

TL; DR

Подводя ΠΈΡ‚ΠΎΠ³, я Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Π² Ρ‡Π΅ΠΌ особСнноС прСимущСство Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΡƒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… структур ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ это ΠΏΠ΅Ρ€Π΅Π²Π΅ΡˆΠΈΠ²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ бСзопасности, связанныС с Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒΡŽ #[derive(Trace)] ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ всСгда ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ #[derive(Serialize)] ΠΈ Ρ‚. Π”. Π― ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ Ссли ΠΌΡ‹ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ ΠΏΠΎΠΉΠ΄Π΅ΠΌ ΠΏΠΎ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρƒ ΠΌΡƒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… структур, для этого Π±ΡƒΠ΄Π΅Ρ‚ вСская ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°, Π½ΠΎ ΠΌΠ½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ грустно ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ имя ΠΌΠΎΠ΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ наслСдования Trace Π½Π° #[derive(unsafe_Trace)] .

Π― ΡΡ‡ΠΈΡ‚Π°ΡŽ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ @alexcrichton Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ компромиссом. Π― ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ ΠΎΠΆΠΈΠ΄Π°Π» Π±Ρ‹, Ρ‡Ρ‚ΠΎ Π»ΡŽΠ±Ρ‹Π΅ измСнСния, внСсСнныС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌΠΈ, Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Ρ‹ ΠΊ Π½ΠΈΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ @mystor ΠΈΠΌΠ΅Π΅Ρ‚ Ρ…ΠΎΡ€ΠΎΡˆΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ зрСния, это ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ нСприятным ΡΡŽΡ€ΠΏΡ€ΠΈΠ·Π°ΠΌ, Π½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ struct каТСтся ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, ящики, ΡΠΎΡ‡Π΅Ρ‚Π°ΡŽΡ‰ΠΈΠ΅ Π² сСбС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ использования ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… макросов, нСбСзопасный ΠΊΠΎΠ΄ ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ бСзопасности, каТутся довольно Ρ€Π΅Π΄ΠΊΠΈΠΌΠΈ.

НС ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅: эта рСализация прСдоставит макросу Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…?

МнС нравится идСя @nikomatsakis Ρ€Π°Π½Π΄ΠΎΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ порядок Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Ρ‡Ρ€Π΅Π·ΠΌΠ΅Ρ€Π½ΡƒΡŽ ΠΏΠΎΠΏΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒ Β«ΠΏΠ»ΠΎΡ…ΠΈΡ…Β» ΠΎΠ±Ρ‹Ρ‡Π°Π΅Π² - ΠΈ Π½Π΅ стоит ΠΏΡ€ΠΈΠ»Π°Π³Π°Ρ‚ΡŒ слишком ΠΌΠ½ΠΎΠ³ΠΎ усилий.

@mystor Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ - Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ эти ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ бСзопасности Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· послС примСнСния всСх ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ 100% -Π½Ρ‹ΠΌ Π·Π²ΡƒΠΊΠΎΠΌ (Π΄Π²Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… ΠΌΠΎΠ³ΡƒΡ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΈ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ ΠΏΠΎΠ»Π΅), Π½ΠΎ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния эвристичСской ΠΌΠ΅Ρ€Ρ‹ противодСйствия этого Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ достаточно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ структуры Π² настраиваСмом ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ.

Π― Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ Π²ΠΈΠΆΡƒ бСспокойства ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ структуры. ПолС Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Π½Π΅Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ, ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ придСтся ΠΊΠΎΠ΅-Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ. Если Π²Ρ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚Π΅ΡΡŒ ΠΎΠ± этом, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ своС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ΅ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Ссли ΠΎΠ½ Π½Π΅ Π²ΠΈΠ΄ΠΈΡ‚ всю структуру довольно Π»Π΅Π³ΠΊΠΎ.

@sgrif, вСроятно, Π²Π΅Ρ€Π΅Π½ Π² _ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅_ случаСв, Π½ΠΎ Π½Π΅ Ρ‚Π°ΠΊ сильно, Ссли Π²Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Ρ‡Π΅Ρ€Ρ‚Ρƒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅.

@sgrif PS: Π­Ρ‚ΠΎ ΠΏΡ€Π°Π²Π΄Π°, Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² Ρ€ΠΆΠ°Π²Ρ‡ΠΈΠ½Ρ‹, вСроятно, ΠΏΠΎΠ½ΠΈΠΌΠ°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ происходит Π² ΠΈΡ… собствСнном ΠΊΠΎΠ΄Π΅, ΠΈ поэтому ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚ΡŒΡΡ структурным измСнСниям, Ссли ΠΎΠ½ΠΈ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ макрос Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ.

ΠžΠ±Ρ‰ΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ примСнСния макросов ΠΊ структурам - это, бСзусловно, комбинация структурных ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ + Π΄Π΅ΠΊΠΎΡ€Π°Ρ†ΠΈΠΉ. Но я оТидаю, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‰Π΅Π΅ ΡΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Β«ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠΊΡ€Π°ΡˆΠ΅Π½ΠΈΠΉΒ» с «всСго лишь нСсколькими измСнСниями». Π—Π΄Π΅ΡΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‡Π΅Ρ‚ΠΊΠΎΠ΅ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ ΠΈ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ.

  • Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ: скаТСм, Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΄Π²Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΈ Ρ‚ΠΎ ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ΅, Ρ‚. Π΅. ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ ΠΈ ΡƒΠΊΡ€Π°ΡˆΠ°ΡŽΡ‚. НСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ ΠΈΡ… Π·Π°ΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚Π΅, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΆΠ΅Π»Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Однако, Ссли ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ происходит с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° ΠΈ всС Π΄Π΅ΠΊΠΎΡ€Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ впослСдствии, Ρƒ вас Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ нСсколько ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΈ ΡƒΠΊΡ€Π°ΡˆΠ΅Π½ΠΈΠΉ Π±ΠΎΠ»Π΅Π΅ управляСмым способом.
  • Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ: Ссли Π²Ρ‹ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚Π΅ Ρ‡Π΅ΠΉ-Ρ‚ΠΎ ΠΊΠΎΠ΄ elses, ΠΈ ΠΊ структурС ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΎ 10 ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ…, ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ… измСняСт структуру, Π²Π°ΠΌ потрСбуСтся большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ это.

Π˜Ρ‚Π°ΠΊ, хотя я ΡΡ‡ΠΈΡ‚Π°ΡŽ эту Ρ‡Π°ΡΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° @mystor ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ:

Π­Ρ‚ΠΎ позволяСт ΠΊΠΎΠ΄Ρƒ, сгСнСрированному настраиваСмым # [derive], Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ структуры Ρ‚ΠΈΠΏΠ°, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½ являСтся ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌ для надСТности (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, # [derive (Trace)] ΠΈΠ· rust-gc, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ фактичСский Ρ‚ΠΈΠΏ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ, ΠΈΠ»ΠΈ это Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½ΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚ΠΎΠ½ΠΊΠΎΠ΅ использованиС послС бСсплатного использования)

Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π½Π°Π²ΡΠ·Π°Ρ‚ΡŒ это Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ ΠΏΡƒΡ‚Π΅ΠΌ. Π’ частности, Π½Π°ΠΌ, вСроятно, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ опрСдСлСния структур Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС (Π΄Π°, это Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΌ, Π½ΠΎ Ρ‡Ρ‚ΠΎ с Ρ‚ΠΎΠ³ΠΎ). Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ идСя ΠΈΠΌΠ΅Ρ‚ΡŒ "Π·Π΄ΠΎΡ€ΠΎΠ²ΡƒΡŽ" Trace которая ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Π°, Ρ‡Ρ‚ΠΎ структура Π½Π΅ измСнится впослСдствии, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½Π° ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ _ Π΄Ρ€ΡƒΠ³ΠΈΠΌ_ способом. ΠŸΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅, ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π»ΠΈ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹ снизу Π²Π²Π΅Ρ€Ρ…:

#[mangle] // <-- custom decorator that does bad things to struct definition
#[derive(Trace)]
struct Foo {
    x: T, y: U
}

МоТно ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Trace impl ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ _it_ Π½Π΅ смоТСт ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ссли ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ struct измСнится. НапримСр:

unsafe impl Trace for Foo {
    fn trace(&self) {
        let &Foo { ref x, ref y } = self;
        <T as Trace>::trace(x);
        <U as Trace>::trace(y);
    }
}

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ #[mangle] Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΡ€Ρ‚ΠΈΡ‚ΡŒ ваш impl, Ссли ΠΎΠ½ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ дьявольский. =) Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ.

Как Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»ΡŒ Π·Π° этими Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€Π°ΠΌΠΈ, я Π±Ρ‹Π» Π±Ρ‹ счастлив ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΈΠ»ΠΈ Π½Π΅Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, согласно ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ #[derive] Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈ impl ΠΈ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ для родствСнников ( #[mangle(Foo, Bar)] Π·Π²ΡƒΠΊΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΎ для мСня 😸), посвящСнный измСнСнию структуры Ρ‚ΠΈΠΏΠ°. #[mangle] ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ порядок ΠΎΡ†Π΅Π½ΠΊΠΈ.

ВСроятно, ΠΌΠ΅ΠΆΠ΄Ρƒ аннотациями Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ порядок ΠΎΡ†Π΅Π½ΠΊΠΈ, Ссли ΠΎΠ½ Π΅Ρ‰Π΅ Π½Π΅ установлСн.

Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΈ мнСния ΠΏΠΎ этому ΠΏΠΎΠ²ΠΎΠ΄Ρƒ ΡΠΌΡΠ³Ρ‡ΠΈΠ»ΠΈΡΡŒ. @nikomatsakis Ρ…ΠΎΡ€ΠΎΡˆΠΎ let Foo{ ... } ΠΏΠΎΡ…ΠΎΠΆΠ΅, сработаСт для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΌΠ°ΠΊΠ΅Ρ‚Π° Π² Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… случаях. Однако Π½Π°ΠΌ, вСроятно, Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π³Π΄Π΅-Ρ‚ΠΎ Π·Π°Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ это, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всСм Π½Π΅ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ это ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ.

@nikomatsakis

  • mh ... ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Ρ‡Ρ‚ΠΎ _custom Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΏΠ΅Ρ€Π΅Π΄ derive_, плюс _derives Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ элСмСнт_. Π­Ρ‚ΠΎ всС Ρ€Π°Π²Π½ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΡƒΠΊΡ€Π΅ΠΏΠΈΡ‚ΡŒ / ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠΊΡƒ извлСчСния Π² Ρ†Π΅Π»ΠΎΠΌ.

Но я Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π΄ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ способ ΡƒΠΊΡ€Π΅ΠΏΠΈΡ‚ΡŒ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΎΡ‚ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. :-)

Π§Ρ‚ΠΎ касаСтся случаСв, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ Ρ‡Π°ΡΡ‚ΡŒ элСмСнта, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ примСняСтся Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚, я Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ наткнулся Π½Π° Π²Π΅Ρ‚ΠΊΡƒ Β«ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ обратная связь для Qt с RustΒ» Π² u.r-l.o ΠΈ написал ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ сообщСниС:

https://users.rust-lang.org/t/pre-implementation-feedback-for-qt-with-rust/7300/19

Один ΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ аспСкт Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ здСсь я ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ #[derive] (ΠΈΠ»ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ) ΠΊ _trait_, Π° Π½Π΅ ΠΊ структурС - ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π½Π΅Π³ΠΎ элСмСнт Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ const trait. .

Как ΠΈ Π² случаС с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ Π³Ρ€ΡƒΠ·Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я поднял Π²Ρ‹ΡˆΠ΅, я Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½ Π²

#[macro_use]
extern crate double;

ΠΈΠΌΠΏΠΎΡ€Ρ‚ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… макросов ΠΈΠ· ящика с ΠΈΠΌΠ΅Π½Π΅ΠΌ double . ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΊΠΎΠ΄ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния (ΠΊΠ°ΠΊ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Ruest) Π²ΠΎ врСмя компиляции, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° с Ρ„Π°Π·ΠΎΠ²Ρ‹ΠΌ ΠΏΡ€ΠΈΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ΠΌ, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ Racket (require (for-syntax ...)) . [Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Racket: https://docs.racket-lang.org/reference/require.html#% 28form ._% 28% 28lib._racket% 2Fprivate% 2Fbase..rkt% 29._for-meta% 29% 29, ΠΊ соТалСнию, я Π½Π΅ ΠΌΠΎΠ³Ρƒ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΉ Ρ€Π°Π·Π΄Π΅Π».]

Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ Π² Π±Π»ΠΎΠ³Π΅ http://blog.ezyang.com/2016/07/what-template-haskell-gets-wrong-and-racket-gets-right/ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ошибки фазирования, сдСланныС Π² Template Haskell, ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ интСрСс: - Π― Π½Π΅ Ρ…ΠΎΡ‡Ρƒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ Ρ‚Π΅ ΠΆΠ΅ ошибки Π² Rust.

@ Ericson2314 Π Π°Π·Π½ΠΈΡ†Π° Π² Rust Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ double ΡƒΠΆΠ΅ скомпилирован _ для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Ρ„Π°Π·Ρ‹_.
Π’ΠΎ Π΅ΡΡ‚ΡŒ ящик экспортируСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ интСрфСйс макроса / ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, macro_rules .
Π‘Ρ‹Π»ΠΎ Π±Ρ‹ интСрСсно ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ящики, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы, Ρ‚Π°ΠΊ ΠΈ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ элСмСнты Rust (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ макрос), Π½ΠΎ ΠΏΠΎΠΊΠ°, ΠΏΠΎΡ…ΠΎΠΆΠ΅, это Π½Π΅ прСдлагаСтся Π² ΠΊΠ°ΠΊΠΎΠΌ-Π»ΠΈΠ±ΠΎ качСствС.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ строящСмуся ящику самому Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈ ΠΊΠ°ΠΊ ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π½ΠΎ простой Π²Ρ‹Π±ΠΎΡ€ систСмы ΠΎΠΏΡ‚ΠΎΠΌ ΠΈΠ· LISP с Π΄Ρ€ΡƒΠ³ΠΎΠΉ модСлью компиляции каТСтся ΠΊΠΎΠ½Ρ‚Ρ€ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ.

Π”Π°, @eddyb. Π― скСптичСски ΠΎΡ‚Π½ΠΎΡˆΡƒΡΡŒ ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΠΈ Β«create Π·Π½Π°Π΅Ρ‚, ΠΊΠ°ΠΊ это Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½ΠΈΠΆΠ΅ ΠΏΠΎ Ρ‚Π΅Ρ‡Π΅Π½ΠΈΡŽΒ». Если Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΈΠ· этапов для нас Π²Π°ΠΆΠ½Π΅Π΅, Ρ‡Π΅ΠΌ Racket, ΠΈΠ·-Π·Π° нашСй ΠΌΠΎΠ΄Π΅Π»ΠΈ компиляции (я Π΄Π°ΠΆΠ΅ Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½, ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈ Racket кросс-компиляция), поэтому я Π½Π΅ понимаю вашСго послСднСго Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°.

Π’Ρ‹Π΄Π²ΠΈΠ½ΡƒΡ‚Π° для обсуТдСния Π² языковой Π³Ρ€ΡƒΠΏΠΏΠ΅ ΠΏΠ»Π°Π½Π° стабилизации.

Π§Ρ‚ΠΎ касаСтся serde, Π²ΠΎΡ‚ ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΉ список Π½Π΅Ρ€Π΅ΡˆΠ΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΡ‹ смоТСм ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΠ»Π°Π³ΠΈΠ½Π° компилятора ΠΈ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Ρ‚ΡŒ Macros 1.1 для всСх Π½ΠΎΡ‡Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ: https://github.com/serde-rs/serde/issues/545. ЕдинствСнноС, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ Rust, - это ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ # 36211. Π’ΠΎ всСм ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΌ ΠΌΡ‹ быстро прогрСссируСм.

Π£ мСня Π΅ΡΡ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ PR, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ наш rustc_macro Π±Π΅Π· использования syntex, поэтому ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°Ρ‚ΡŒ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции https://github.com/serde-rs/serde/pull/548.

Π Π•Π”ΠΠšΠ’Π˜Π ΠžΠ’ΠΠ’Π¬: Π½Π΅Π²Π°ΠΆΠ½ΠΎ, # 36211 повлиял Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΡΡ‚Π°Ρ€ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ syntex

Π― ΠΏΠΎΡΡ‚Π°Ρ€Π°ΡŽΡΡŒ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒ ΠΏΠΎΡ€Ρ‚ дизСльного Ρ‚ΠΎΠΏΠ»ΠΈΠ²Π° ΠΊ пятницС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π΄Π΅Π»Π°Π΅Ρ‚ всС, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ для этого.

@dtolnay, учитывая

@sgrif ΠΊΡ€ΡƒΡ‚ΠΎ , спасибо! Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ это сдСлаСтС (ΠΈΠ»ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅), Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²Ρ‹ ΠΏΡ€ΠΎΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ здСсь Π»ΡŽΠ±Ρ‹Π΅ ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠΈ, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π²Ρ‹ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ?

Π”Π°, я согласСн.

Π’ΠΎ Π²Ρ‚ΠΎΡ€Π½ΠΈΠΊ, 27 сСнтября 2016 Π³., 19:29 Alex Crichton [email protected]
написал:

@dtolnay https://github.com/dtolnay с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ serde-rs / serde # 548
https://github.com/serde-rs/serde/pull/548 , ΠΎΡΡ‚Π°Π»ΠΈΡΡŒ Π»ΠΈ
Π±Π»ΠΎΠΊΠΈΡ€Π°Ρ‚ΠΎΡ€Ρ‹ для сСрдС?

@sgrif https://github.com/sgrif ΠΊΡ€ΡƒΡ‚ΠΎ , спасибо! Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ это сдСлаСтС
(ΠΈΠ»ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅) Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²Ρ‹ ΠΏΡ€ΠΎΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ здСсь ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹
ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ?

-
Π’Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ это, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ вас упомянули.
ΠžΡ‚Π²Π΅Ρ‚ΡŒΡ‚Π΅ Π½Π° это письмо Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, просмотритС Π΅Π³ΠΎ Π½Π° GitHub
https://github.com/rust-lang/rust/issues/35900#issuecomment -250028743,
ΠΈΠ»ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ
https://github.com/notifications/unsubscribe-auth/ABdWK7MnA1rpn-WGji8gwAT2JCIqB4LFks5quaa-gaJpZM4JqEAX
.

@alexcrichton

Учитывая serde-rs / serde # 548, Π΅ΡΡ‚ΡŒ Π»ΠΈ Π΅Ρ‰Π΅ Π±Π»ΠΎΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ для serde?

НСт, Ссли @ oli-obk ΠΈΠ»ΠΈ @erickt ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ этот PR сСгодня ΠΈΠ»ΠΈ Π·Π°Π²Ρ‚Ρ€Π°, Ρ‚ΠΎ я ΠΌΠΎΠ³Ρƒ Π²Ρ‹Π»ΠΎΠΆΠΈΡ‚ΡŒ всС Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ дСнь ΠΈ пСрСнСсти Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… извСстных ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Rusoto.

@dtolnay Π”Π΅Π»Π°ΡŽ интСнсивноС использованиС serde_macros Π² Π ΡƒΠΌΠ΅ ΠΈ Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π²Π°ΠΌ тСст serde_derive , Π° Ρ‚Π°ΠΊΠΆΠ΅, Ссли Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ большС Π³Π»Π°Π·.

ЀактичСски, я Ρ‚ΠΎΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ diesel_codegen, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Ruma - Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ ΠΏΠ»ΠΎΡ‰Π°Π΄ΠΊΠ° для тСстирования вСрсии Macros 1.1 ΠΎΠ±Π΅ΠΈΡ… этих Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

Π― выпустил Serde 0.8.10, объявив, Ρ‡Ρ‚ΠΎ serde_macros устарСл Π² ΠΏΠΎΠ»ΡŒΠ·Ρƒ Macros 1.1.

Π”ΠΎΠ±Π°Π²ΠΈΠΌ Π³Π°Π»ΠΎΡ‡ΠΊΡƒ для "Cargo doc works" - https://github.com/rust-lang/cargo/issues/3132.

@dtolnay Π³ΠΎΡ‚ΠΎΠ²ΠΎ!

НС ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ это ошибки serde_derive ΠΈΠ»ΠΈ ошибки rustc / rustdoc, Π½ΠΎ я Π·Π°ΠΌΠ΅Ρ‡Π°ΡŽ Π΄Π²Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π² сгСнСрированных Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ…:

  • Π›ΠΈΡ‚Π΅Ρ€Π°Π» Β«///Β» появляСтся Π² Π½Π°Ρ‡Π°Π»Π΅ сгСнСрированных строк Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ для Ρ‚ΠΈΠΏΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… настраиваСмоС наслСдованиС.
  • Deserialize ΠΈ Serialize Π½Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«Π Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠ²Β» для Ρ‚ΠΈΠΏΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… настраиваСмоС наслСдованиС.

Π›ΠΈΡ‚Π΅Ρ€Π°Π» Β«///Β» появляСтся Π² Π½Π°Ρ‡Π°Π»Π΅ сгСнСрированных строк Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ для Ρ‚ΠΈΠΏΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… настраиваСмоС наслСдованиС.

Π­Ρ‚ΠΎ Π±Ρ‹Π»Π° ошибка syn . Π― выпустил 0.8.2 с исправлСниСм, поэтому cargo update Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π³ΠΎ Π·Π°Π±Ρ€Π°Ρ‚ΡŒ.

НасчСт Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ я Π½Π΅ знаю, ΠΎΡΡ‚Π°Π²Π»ΡŽ это @alexcrichton.

@jimmycuadra

  • Deserialize ΠΈ Serialize Π½Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«Π Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠ²Β» для Ρ‚ΠΈΠΏΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… настраиваСмоС наслСдованиС.

Π—Π²ΡƒΡ‡ΠΈΡ‚ довольно ΠΏΠΎΠ΄ΠΎΠ·Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ! ΠŸΠΎΡ…ΠΎΠΆΠ΅, это ошибка Π² rustdoc, Π½ΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π΅ новая. НапримСр, rustdoc Π½Π΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ этого с Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Copy :

#[derive(Clone)]           
pub struct Point {         
    x: i32,                
    y: i32,                
}                          

const _FOO: () = {         
    impl Copy for Point {} 
    ()                     
};                         

Π­Ρ‚ΠΎΡ‚ шаблон ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ serde-derive для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠΌΠΏΡ‹. @dtolnay Π±Ρ‹Π»Π° Π»ΠΈ Ρƒ serde_macros такая ΠΆΠ΅ Ρ„ΠΎΡ€ΠΌΠ° Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ? МоТно Π»ΠΈ сСйчас ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ?

@jimmycuadra Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ с rustdoc?

@dtolnay Π±Ρ‹Π»Π° Π»ΠΈ Ρƒ serde_macros такая ΠΆΠ΅ Ρ„ΠΎΡ€ΠΌΠ° Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ?

Π”Π°.

МоТно Π»ΠΈ сСйчас ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ?

НСт. Насколько ΠΌΠ½Π΅ извСстно, это СдинствСнноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ удовлСтворяСт ΠΎΠ±ΠΎΠΈΠΌ этим ограничСниям:

  • Π”ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ serde Π½Π΅ Π² ΠΊΠΎΡ€Π½Π΅ ящика, Ρ‚.Π΅. Π½Π΅ ::serde . Π­Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ Π΄Π΅Π»ΠΎ, ΠΊΠΎΠ³Π΄Π° люди ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ serde impls Π·Π° Ρ„Π»Π°Π³ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅.
  • Π”ΠΎΠ»ΠΆΠ½Π° ΡƒΠΌΠ΅Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ частныС Ρ‚ΠΈΠΏΡ‹ ΠΈΠ· ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅Π³ΠΎ модуля.

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ смотритС Π½Π° https://github.com/serde-rs/serde/issues/159 .

@dtolnay Π°Ρ…, Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ, @jimmycuadra это Π½Π΅ рСгрСсс, Π²Π΅Ρ€Π½ΠΎ?

ОбновлСниС: Π½Π΅ совсСм Π³ΠΎΡ‚ΠΎΠ²ΠΎ с ΠΏΠΎΡ€Ρ‚ΠΎΠΌ, Π½ΠΎ ΠΏΠΎΡ‡Ρ‚ΠΈ Π³ΠΎΡ‚ΠΎΠ²ΠΎ. Никаких ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, ΠΊΡ€ΠΎΠΌΠ΅ Π²Π΅Ρ‰Π΅ΠΉ, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… я ΡƒΠΆΠ΅ сообщал, ΠΈΠ»ΠΈ Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ, ΠΊΠ°ΠΊ ΠΌΡ‹ Π·Π½Π°Π»ΠΈ, ΠΌΡ‹ столкнСмся. НавСрноС, бСзопасно ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π³Π°Π»ΠΎΡ‡ΠΊΡƒ Π² ΠΏΠΎΠ»Π΅ Β«Π”ΠΈΠ·Π΅Π»ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Β», Π·Π°Π²Ρ‚Ρ€Π° Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ выпуск Macros 1.1, Ссли этого Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ сСгодня Π²Π΅Ρ‡Π΅Ρ€ΠΎΠΌ.

Для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ слСдит Π·Π° ΠΌΠ½ΠΎΠΉ, я ΠΎΡ‚ΠΊΡ€Ρ‹Π» # 36945 ΠΈ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π» rustc_macro Π² proc_macro практичСски Π²Π΅Π·Π΄Π΅, Ρ‡Ρ‚ΠΎ, ΠΏΠΎ-Π²ΠΈΠ΄ΠΈΠΌΠΎΠΌΡƒ, являСтся консСнсусом ΠΏΠΎ названию этого ящика.

ΠŸΠΎΡ…ΠΎΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Ρ€Π΅ΠΉΡ‚ΠΎΠ² Π² rustdoc (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сСйчас ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ выпускС) Π½Π΅ относятся ΠΊ Macros 1.1. МоТно ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

Π― попытался пСрСнСсти свою Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ mockers ΠΈΠ· ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠ³ΠΎ модуля компилятора Π² макросы 1.1 ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» Β«ΠΎΡˆΠΈΠ±ΠΊΡƒ: настраиваСмыС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ наслСдования ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ элСмСнтам struct / enumΒ». Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠ³ΠΎ модуля компилятора Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ (хотя ΠΈ нСсколько странно) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ "derive" для свойств. МнС Ρ‚ΡƒΡ‚ Π½Π΅ ΠΏΠΎΠ²Π΅Π·Π»ΠΎ?

@kriomant интСрСсно! Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ошибка Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ наслСдовании сСгодня, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ я Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ это ΠΊΠΎΠ³Π΄Π°-Π»ΠΈΠ±ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ #[derive] ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊ Ρ‚Ρ€Π΅ΠΉΡ‚Ρƒ ...

Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΊΠ° ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ консСрвативными, ΠΌΡ‹, скорСС всСго, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ _stabilize_ derive-on-traits, Π½ΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ для этого Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. ΠœΡ‹ΡΠ»ΠΈ @ rust-lang / lang?

@alexcrichton Π’ Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ

@alexcrichton МоТСм Π»ΠΈ ΠΌΡ‹ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Ρ‡Π΅Ρ€Ρ‚Π°ΠΌ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π°?

Как я ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π» Π²Ρ‹ΡˆΠ΅ , вСроятно, ошибка, Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π°ΡΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ настраиваСмоС наслСдованиС ΠΊΠΎΠ³Π΄Π°-Π»ΠΈΠ±ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π»ΠΎΡΡŒ для свойств, Π° это Π½Π΅ Π±Ρ‹Π»ΠΎ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π² RFC, поэтому ΠΏΠ΅Ρ€Π΅Π΄ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ провСсти Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ обсуТдСниС. Π’ любом случаС, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° derive-on-trait вряд Π»ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ стабилизирована Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π΅, Π½ΠΎ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Π²ΠΎΡ€ΠΎΡ‚Π° для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

Π― Π»ΠΈΡ‡Π½ΠΎ Π½Π΅ Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ наслСдованиС ΠΏΠΎ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΡƒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это большС ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° Ρ‚Π΅Ρ€Ρ€ΠΈΡ‚ΠΎΡ€ΠΈΡŽ настраиваСмых Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², Ρ‡Π΅ΠΌ само ΠΏΠΎ сСбС. (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ΄Π΅Ρ‚ Π²Ρ€Π°Π·Ρ€Π΅Π· с Π΄ΡƒΡ…ΠΎΠΌ #[derive] Π² исходном Π²ΠΈΠ΄Π΅)

Π― Π±Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Π΅Π», Ρ‡Ρ‚ΠΎΠ±Ρ‹ кастомноС ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ слСдовало Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ, Ρ‡Ρ‚ΠΎ ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅. ΠœΡ‹ _ΠΌΠΎΠ³ΡƒΡ‚_ Π·Π°Ρ…ΠΎΡ‚Π΅Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ это ΠΏΠΎΠ·ΠΆΠ΅, Π½ΠΎ я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ это Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ RFC (я Ρ‚ΠΎΠΆΠ΅ довольно Ρ…ΠΎΠ»ΠΎΠ΄Π΅Π½ Π² этой ΠΈΠ΄Π΅Π΅, tbh, Π½ΠΎ я ΠΌΠΎΠ³ Π±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ своС ΠΌΠ½Π΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° использования ΠΈ ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΊΡ€Π°ΠΉΠ½ΠΈΡ… случаСв ).

@alexcrichton

Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ консСрвативным, ΠΌΡ‹, вСроятно, Π΅Ρ‰Π΅ Π½Π΅ стабилизируСм ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ Ρ‡Π΅Ρ€Ρ‚Ρ‹, Π½ΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ для этого Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. ΠœΡ‹ΡΠ»ΠΈ @ rust-lang / lang?

πŸ‘ ΠΎΡ‚ мСня.

Π₯ΠΎΡ€ΠΎΡˆΠΎ, Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Π°Ρ функция - это Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Π½ΠΎ это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ моя Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎ (Π±Π΅Π· Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π°). И синтаксис macro!(…) Ρ‚ΠΎΠΆΠ΅ Π½Π΅ распространяСтся Π½Π° "макросы 1.1", я ΠΏΡ€Π°Π²?

Π― ΠΏΠ΅Ρ€Π΅ΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽ RFC макроса proc, ΠΈ Π±Ρ‹Π» ΠΏΠ»Π°Π½, Ρ‡Ρ‚ΠΎ ящики макросов Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ сСбя #[cfg(macro)] . Для макросов 1.1 это Π½Π΅ трСбуСтся, Π½ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ ящика. Π­Ρ‚ΠΈ Π΄Π²Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ стСпСни ΠΎΡ€Ρ‚ΠΎΠ³ΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ - ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ описываСт Ρ„Π°Π·Ρƒ компиляции, Π²Ρ‚ΠΎΡ€ΠΎΠΉ - Π²ΠΈΠ΄ ΠΊΠΎΡ€Π·ΠΈΠ½Ρ‹. Но ΠΎΠ½ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ стСпСни ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‚ΡΡ - послСднСС ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π²ΠΎΠ΅. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ для объявлСния макросов proc ΠΈ Π½Π΅ΠΌΠ°ΠΊΡ€ΠΎ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² ΠΎΠ΄Π½ΠΈΡ… ΠΈ Ρ‚Π΅Ρ… ΠΆΠ΅ ящиках, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ - Π½Π΅Ρ‚.

Π― Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½, Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈ Π½Π°ΠΌ здСсь Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²Π·Π»ΠΎΠΌΠ°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ макросов proc для обСспСчСния ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ совмСстимости (ΠΎΠ½ΠΎ Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ описаниС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ макросов ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‚ΠΈΠΏΠΎΠ² ящиков). Но Π½Π°Π΄ Ρ‡Π΅ΠΌ Π·Π°Π΄ΡƒΠΌΠ°Ρ‚ΡŒΡΡ Π² ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ стабилизации.

@kriomant ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Π΄Π°

@nrc прямо сСйчас опрСдСляСтся ΠΊΠ°ΠΊ cfg(rustc_macro) (хотя скоро измСнится Π½Π° proc_macro ). Нам это Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ, Π½Π΅Ρ‚, Π½ΠΎ я Π΄ΡƒΠΌΠ°Π», Ρ‡Ρ‚ΠΎ это Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ ΠΊΠ°ΠΊ связывания с ящиком Π²ΠΎ врСмя компиляции, Ρ‚Π°ΠΊ ΠΈ Π²ΠΎ врСмя выполнСния? Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΡ‹ Π±Ρ‹ скомпилировали ящик proc-macro Π΄Π²Π°ΠΆΠ΄Ρ‹: ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· с Ρ‚ΠΈΠΏΠΎΠΌ ящика proc-macro ΠΈ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· с Ρ‚ΠΈΠΏΠΎΠΌ ящика rlib , ΠΈ послСдний Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° libsyntax ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅. Ρ‚ΠΎΡ‚.

На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, хотя каТСтся Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π½Π΅ _require_ это, хотя я ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡŽ, Ρ‡Ρ‚ΠΎ это Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·ΠΆΠ΅ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния? (собираСм ящик Π΄Π²Π°ΠΆΠ΄Ρ‹)

@alexcrichton ΠœΠΎΠΆΠ΅Ρ‚ Π»ΠΈ #[proc_macro_derive] ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Ρ‚ΡŒ это? Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ #[test] ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ #[cfg(test)] .
(Π­Ρ‚ΠΎ Π½Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ сСйчас, просто Ρ…ΡƒΠ΄ΡˆΠΈΠΉ случай, Ссли ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ cfg - это прСдупрСТдСния ΠΎ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… элСмСнтах.)

@eddyb А ΠΊΠ°ΠΊ насчСт extern crate proc_macro; ? Π― Ρ‡ΡƒΠ²ΡΡ‚Π²ΡƒΡŽ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Ρ‚ΠΎΠΆΠ΅ ΡΠ»ΠΎΠΌΠ°ΡŽΡ‚ΡΡ.

@mystor Π­Ρ‚ΠΎ просто ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ящик с ΠΊΡƒΡ‡Π΅ΠΉ Ρ‚ΠΈΠΏΠΎΠ² ΠΈ ΠΈΠΌΠΏΠΎΠ².

Π Π°Π·Π²Π΅ ΠΎΠ½ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ связан с libsyntax , Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ, Ссли Π±Ρ‹ ящик использовал ящик proc_macro ΠΈ Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ кросс-ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ, Π΅ΠΌΡƒ Ρ‚Π°ΠΊΠΆΠ΅ придСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ синтаксис кросс-компиляции?

@eddyb yes #[proc_macro_derive] ΠΌΠΎΠΆΠ΅Ρ‚ автоматичСски ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Π½ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ _Ρ‚Π°ΠΊΠΆΠ΅_ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС, Ρ‡Ρ‚ΠΎ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Ρ€Π°Π½Π·ΠΈΡ‚ΠΈΠ²Π½ΠΎ Π΄ΠΎΡΡ‚ΠΈΠ³Π°ΡŽΡ‚ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, extern crate proc_macro ). Π₯отя это «просто ящик», ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹Π΅ послСдствия Π²ΠΎ врСмя выполнСния (динамичСскоС связываниС, нСдоступноС для кросс-скомпилированных Ρ†Π΅Π»Π΅ΠΉ ΠΈ Ρ‚. Π”.).

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² тСстах Π΅ΡΡ‚ΡŒ #[cfg(test)] , поэтому ΠΌΠ½Π΅ каТСтся Ρ€Π°Π·ΡƒΠΌΠ½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ #[cfg(proc_macro)] для Ρ‚ΠΎΠΉ ΠΆΠ΅ Ρ†Π΅Π»ΠΈ.

@alexcrichton _ИдСально_, Π² ящикС Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π½ΠΈΡ‡Π΅Π³ΠΎ, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ экспортируСтся, ΠΈ Π½Π΅ трСбуСтся динамичСского связывания ΠΈΠ»ΠΈ Ρ‡Π΅Π³ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ libstd . Однако я ΠΌΠΎΠ³ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ это Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π² случаях #![no_std] .

ΠŸΠΎΡ…ΠΎΠΆΠ΅, Π½Π°ΠΌ придСтся с самого Π½Π°Ρ‡Π°Π»Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΄Π²ΠΎΠΉΠ½ΡƒΡŽ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ, Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ всС ΡƒΠ»ΠΎΠ²ΠΈΡ‚ΡŒ: dis provided :.

Π Π•Π”ΠΠšΠ’Π˜Π ΠžΠ’ΠΠ’Π¬ : ΠŸΠΎΠ΄ΠΎΠΆΠ΄ΠΈΡ‚Π΅, ΠΎ Ρ‡Π΅ΠΌ я Π²ΠΎΠΎΠ±Ρ‰Π΅ Π΄ΡƒΠΌΠ°ΡŽ? Для этого трСбуСтся ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ ящика, двойная компиляция примСняСтся ΠΊ _рСгулярным_ ящикам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ _Ρ‚Π°ΠΊΠΆΠ΅_ ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы / Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ / ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ / ΠΈ Ρ‚. Π”. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ сСйчас это Π½Π΅ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ.
Но ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ хотя Π±Ρ‹ ввСсти #[cfg(proc_macro)] ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ всСгда устанавливаСтся для Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ящика.

πŸ”” Π­Ρ‚Π° функция вступаСт Π² послСдний ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ обсуТдСния с Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ΠΌ ΡΡ‚Π°Π±ΠΈΠ»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΊΠΎΠ½Ρ†Π΅ этого Ρ†ΠΈΠΊΠ»Π° выпуска! πŸ””

ОснованиСм для рассмотрСния вопроса ΠΎ стабилизации сСйчас являСтся:

  • ΠŸΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ API этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎ своСму замыслу _ Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ_ консСрвативна. Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя ΠΎΠ½ совмСстим с Π΄Π΅-Ρ„Π°ΠΊΡ‚ΠΎ ΠΏΠ»Π°Π½ΠΎΠΌ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… макросов.
  • Π­Ρ‚Π° функция быстро ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΡˆΠΈΡ€ΠΎΠΊΠΎΠ΅ распространСниС Ρ‡Π΅Ρ€Π΅Π· Serde, Π° вскорС ΠΈ Ρ‡Π΅Ρ€Π΅Π· Diesel, хотя, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΡˆΠΈΡ€ΠΎΠΊΠΎΠ΅ распространСниС Π² основном ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² качСствС _ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°_ настраиваСмого происхоТдСния.
  • ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° FCP Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π΅Ρ‚ Π½Π°ΠΌ Ρ‚Ρ€ΠΈ мСсяца Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ функция Π±ΡƒΠ΄Π΅Ρ‚ фактичСски ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π° ​​в ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ достаточно Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ имя смСщаСтся Π½Π° proc_macro , ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡΡΡŒ Π½Π° Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½Π΅ΠΌ консСнсусС ΠΏΠΎ этому ΠΏΠΎΡ‚ΠΎΠΊΡƒ. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ ΠΎΡ‚ΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ этой ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠΉ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° этого Ρ†ΠΈΠΊΠ»Π° выпуска.

Двойная сборка ящика Π·Π²ΡƒΡ‡ΠΈΡ‚ ΠΎΡ‡Π΅Π½ΡŒ Π³Ρ€ΡƒΠ±ΠΎ: ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ объСма Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. На самом Π΄Π΅Π»Π΅ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ extern! crate needed_for_my_inline_proc_macros; - Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π»ΡƒΡ‡ΡˆΠ΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅.

@aturon Ρ‡Ρ‚ΠΎ, Ρ€Π°Π·Π²Π΅ люди Π½Π΅ Π½Π°Ρ‡Π°Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ это нСсколько Π΄Π½Π΅ΠΉ Π½Π°Π·Π°Π΄?

@ Ericson2314 ΠŸΡ€ΠΎΡˆΠ»ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π½ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Π² ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ FCP, _минимальноС_ врСмя Π΄ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π½Π° ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» составляСт Ρ‚Ρ€ΠΈ мСсяца, Ρ‡Ρ‚ΠΎ, ΠΏΠΎ Π½Π°ΡˆΠ΅ΠΌΡƒ мнСнию, Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ достаточно для этого Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ ΡƒΠ·ΠΊΠΎΠ³ΠΎ интСрфСйса.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ сам FCP рассчитан Π½Π° 6 нСдСль, Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄Π°ΠΆΠ΅ поставим Π΅Π³ΠΎ Π½Π° ΠΏΡƒΡ‚ΡŒ стабилизации. Но, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, Π½Π°Ρ‡Π°Π² процСсс сСйчас, ΠΌΡ‹ создадим Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ‡Π΅Ρ€Π΅Π· 3 мСсяца, ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ Π΄ΠΎ этого Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

Ах Ρ…ΠΎΡ€ΠΎΡˆΠΎ. Π― вспомнил ΠΎ трСхмСсячной части, Π½ΠΎ Π·Π°Π±Ρ‹Π», Π³Π΄Π΅ находится FCP Π² этих Ρ‚Ρ€Π΅Ρ… ΡƒΡΡ‚ΡŒΡΡ… - Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π±Ρ‹Π»ΠΎ Ρ‚Ρ€Π΅Ρ… мСсяцСв с 22 августа. Π’ΠΎΠ³Π΄Π° Π½Π΅ ΠΎΠ±Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ внимания Π½Π° врСмя.

Π― Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ„Π°Π·ΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я поднял, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Π»ΠΈΡΡŽΡ‚ Π΄Π°ΠΆΠ΅ Π½Π° эту Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ истории макросов proc, поэтому я Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ Ρ€Π΅ΡˆΠ΅Π½Ρ‹.

@alexcrichton rustc_copy_clone_marker ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ rustc_attrs всС Π΅Ρ‰Π΅ ΠΊΡƒΡΠ°ΡŽΡ‚ нас. Π‘ΠΌ. Https://github.com/serde-rs/serde/issues/577.

#[derive(Copy, Clone)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub struct MyStruct {
    value: i64,
}

ΠžΠ±Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡƒΡ‚ΡŒ - ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ мСстами порядок, Π½ΠΎ я Ρ€Π΅ΡˆΠΈΠ» ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ это ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ.

#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
#[derive(Copy, Clone)]
pub struct MyStruct {
    value: i64,
}

Π― Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ» пСрСнос https://github.com/sfackler/rust-postgres-derive Π½Π° макросы 1.1. Π­Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π±Π΅Π·Π±ΠΎΠ»Π΅Π·Π½Π΅Π½Π½ΠΎ, Π½ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², считываСмых нСсколькими ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌΠΈ, - огромная боль. Π‘Π΅Ρ€Π΄Π΅ столкнулся с Ρ‚Π΅ΠΌ ΠΆΠ΅ самым, Π½ΠΎ для ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΎΠ±ΠΎΠΈΡ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… трСбуСтся нСсколько странных логичСских Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ: https://github.com/sfackler/rust-postgres-derive/blob/master/postgres-derive-internals/ src / lib.rs # L26

Он Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΡ‚Π°Π±ΠΈΠ»ΠΈΠ·Π°Ρ†ΠΈΡŽ, Π½ΠΎ я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ это ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ большая эргономичСская ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° со стороны Π°Π²Ρ‚ΠΎΡ€Π°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹, вСроятно, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π² блиТайшСС врСмя.

Π― выпустил quote 0.3.0 с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ ΠΏΡ€ΠΈΡ‡ΡƒΠ΄Π»ΠΈΠ²Ρ‹Ρ… ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ Π² стилС macro_rules! (спасибо @nrc Π·Π° ΠΏΠΎΠ΄Ρ‚Π°Π»ΠΊΠΈΠ²Π°Π½ΠΈΠ΅). Если Π²Ρ‹ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚Π΅ макросы proc Π±Π΅Π· quasi / syntex, Π²Ρ‹, вСроятно, Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ этого. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования ΠΈΠ· postgres-derive:

pub fn enum_body(name: &str, variants: &[Variant]) -> Tokens {
    let num_variants = variants.len();
    let variant_names = variants.iter().map(|v| &v.name);

    quote! {
        if type_.name() != #name {
            return false;
        }

        match *type_.kind() {
            ::postgres::types::Kind::Enum(ref variants) => {
                if variants.len() != #num_variants {
                    return false;
                }

                variants.iter().all(|v| {
                    match &**v {
                        #(                           // \
                            #variant_names => true,  //  |----- new feature
                        )*                           // /
                        _ => false,
                    }
                })
            }
            _ => false,
        }
    }
}

МнС Π»ΡŽΠ±ΠΎΠΏΡ‹Ρ‚Π½ΠΎ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ # Π° Π½Π΅ $ ?

Π Π•Π”ΠΠšΠ’Π˜Π ΠžΠ’ΠΠ’Π¬ : ВсСгда Π΄ΡƒΠΌΠ°Π», Ρ‡Ρ‚ΠΎ синтаксис цитирования Π±ΡƒΠ΄Π΅Ρ‚ ${...} Π½ΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, я слишком привязан ΠΊ ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹ΠΌ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π°ΠΌ ES6, Π΄Π°ΠΆΠ΅ Ссли это Π±Ρ‹Π»ΠΎ нСсколько Π»Π΅Ρ‚. \{...} Ρ‚ΠΎΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, хотя ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ³ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ мСстС.
ΠšΠ°ΠΆΠ΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Π½Π΅Ρ‚ скобок, Π½ΠΎ ΠΌΠ½Π΅ Π½Π΅ ΠΎ Ρ‡Π΅ΠΌ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ.

МнС Π»ΡŽΠ±ΠΎΠΏΡ‹Ρ‚Π½ΠΎ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ # Π° Π½Π΅ $ ?

ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это макрос macro_rules, ΠΈ я Π½Π΅ ΠΌΠΎΠ³Ρƒ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρ…ΠΎΡ‡Ρƒ: smile :. $v сопоставляСтся ΠΊΠ°ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΎΠΊΠ΅Π½, ΠΈ Π½Π΅Ρ‚ возмоТности ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΎΡ‚ $v ΠΊ использованию ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ v . Напротив, #v - это Π΄Π²Π° Ρ‚ΠΎΠΊΠ΅Π½Π°, поэтому я ΠΌΠΎΠ³Ρƒ ΡΠΎΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈΡ… ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ.

macro_rules! demo {
    ($tt:tt) => {};
}

fn main() {
    demo!($v);
}

ΠŸΠΎΠ΄ΠΎΠΆΠ΄ΠΈΡ‚Π΅, всС это дСлаСтся Π² macro_rules ?! Π—Π°Π±Ρ‹Π» макросы 1.1 Π±Ρ‹Π» ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΠΌΠ³Π½ΠΎΠ²Π΅Π½ΠΈΠ΅. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, $x ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ ΠΎΠ΄Π½ΠΈΠΌ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠΌ, являСтся нСдостатком Π΄ΠΈΠ·Π°ΠΉΠ½Π° ИМО. cc @jseyfried

@dtolnay

@alexcrichton, rustc_copy_clone_marker ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ rustc_attrs всС Π΅Ρ‰Π΅ ΠΊΡƒΡΠ°ΡŽΡ‚ нас. Π‘ΠΌ. Serde-rs / serde # 577.

Ой, каТСтся, это ΠΏΠ»ΠΎΡ…ΠΎ! Обновлю список Π²Π²Π΅Ρ€Ρ…Ρƒ. @nrc ΠΈΠ»ΠΈ @jseyfried мысли ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ с этим ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ? Π― Π½Π΅ слишком Π·Π½Π°ΠΊΠΎΠΌ с порядком раскрытия всСго, Π½ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄ΠΈΠ½ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ #[derive] Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΠ³Π»ΠΎΡ‚ΠΈΡ‚ΡŒ всС Π±ΡƒΠ΄ΡƒΡ‰ΠΈΠ΅ ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ?

@sfackler

ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ нСсколькими ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌΠΈ, - огромная боль

Π― Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ слСдовал ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΡΡΡ‹Π»Π°Π»ΠΈΡΡŒ, Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²Ρ‹ ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ?

@alexcrichton Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°

#[derive(ToSql, FromSql)]
enum Foo {
    #[postgres(name = "bar")]
    Bar
}

Атрибут #[postgres] ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для настройки Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ToSql ΠΈ FromSql . Он Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½ ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС это нСизвСстный Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚, Π½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ToSql ΠΈ FromSql Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ. Если Π²Ρ‹ сдСлаСтС это Π½Π°ΠΈΠ²Π½Ρ‹ΠΌ способом, просто сгСнСрировав Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, Π° Π·Π°Ρ‚Π΅ΠΌ ΡƒΠ΄Π°Π»ΠΈΠ² Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Ρ‚ΡŒ настроСк.

Serde-derive ΠΈ postgres-derive ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ прямо сСйчас, имСя Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ для ΠΎΠ±ΠΎΠΈΡ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… ΠΈΠΌΠΏΠΎΠ², пСрСнаправляя ΠΈΡ… Π½Π° ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ±Π° сразу. ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠΈΡ‚ΡŒ #[derive] для Ρ‚ΠΎΠ³ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² настоящСС врСмя вызываСтся, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ компилятор удаляСт Π΅Π³ΠΎ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ: https://github.com/sfackler/rust-postgres-derive/blob /master/postgres-derive/src/lib.rs#L18

@sfackler Π― _ Π΄ΡƒΠΌΠ°ΡŽ_, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это, ΡƒΠ΄Π°Π»ΠΈΠ² лишниС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°. Π’Π°Ρˆ способ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΠ΅ _shrug_.

@sfackler Π°Ρ…, Ρ…ΠΎΡ€ΠΎΡˆΠΎ, ΠΈΠΌΠ΅Π΅Ρ‚ смысл. Благодаря!

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈ эта Π»ΠΎΠ³ΠΈΠΊΠ° Π±Ρ‹Ρ‚ΡŒ Ρ…Ρ€ΡƒΠΏΠΊΠΎΠΉ. НапримСр, Ссли Π²Ρ‹ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚Π΅ ToSql ΠΊΠ°ΠΊ обнаруТиваСтся Π±ΡƒΠ΄ΡƒΡ‰Π΅Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ FromSql ? Π­Ρ‚ΠΎ ΠΌΠΎΠ³Π»ΠΎ Π±Ρ‹Ρ‚ΡŒ Π·Π° #[cfg] Π²Ρ€ΠΎΠ΄Π΅ @dtolnay, упомянутого Π²Ρ‹ΡˆΠ΅ ? Π—Π½Π°Ρ‡ΠΈΡ‚, это Π½Π΅ Π²ΠΎ всСх случаях Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ?

@alexcrichton Π”Π°, ΠΎΠ½ Ρ…Ρ€ΡƒΠΏΠΊΠΈΠΉ, поэтому Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ каТСтся Π²Π°ΠΆΠ½Ρ‹ΠΌ.

Π Π°Π·Π²Π΅ #[cfg] ΠΈ #[cfg_attr] Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄ производством?

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ api макросов 1.1 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ со строками, я ΠΌΠΎΠ³Ρƒ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Ρ€ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ:

  1. ΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ ΠΈ Π΄ΠΎΠΆΠ΄ΠΈΡ‚Π΅ΡΡŒ макросов 2.0
  2. Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π² настраиваСмой ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΉ
  3. Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ api макросов 1.1, ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ² настраиваСмому ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π±Π΅Π»Ρ‹ΠΉ список для Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ элСмСнта

Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π΅ΡΡ‚ΡŒ свои ΠΏΠ»ΡŽΡΡ‹ ΠΈ минусы.
ΠœΠΈΠ½ΡƒΡ 1: ΠΏΠΎΠΊΠ° Ρ‡Ρ‚ΠΎ Ρ…Ρ€ΡƒΠΏΠΊΠΈΠ΅ ΠΎΠ±Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΏΡƒΡ‚ΠΈ
Con 2: Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Ρ‹
con 3: большС повСрхности API для ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

Π― ΠΏΠΎΠ΄ΡƒΠΌΠ°Π» ΠΎΠ± установкС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π² #[used(...)] Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΡ… ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² Π±Π΅Π»Ρ‹ΠΉ список ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, Π½ΠΎ это довольно Π³Π»ΡƒΠΏΠΎ ΠΈ слишком быстро ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎ.

@alexcrichton

ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄ΠΈΠ½ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ #[derive] Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ³Π»ΠΎΡ‚ΠΈΡ‚ΡŒ всС Π±ΡƒΠ΄ΡƒΡ‰ΠΈΠ΅

МнС нравится эта идСя. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ #[cfg] s ΠΈ #[cfg_attr] s ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π΄ΠΎ #[derive] s, #[cfg] -guarded #[derive] s Π½Π΅ являСтся ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ для этого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°. (ΠΈΠ»ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ @sfackler для

Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ» Π±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ @sfackler Β«Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ s Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‰Π΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² послСднСм Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π΅ (я Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΡƒΠΌΠ°ΡŽ , Ρ‡Ρ‚ΠΎ @eddybΒ» s ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ Π±Ρ‹ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ Π²Π΅Ρ‰ΠΈ).

Одна ΠΈΠ· возмоТностСй ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ управлСния - Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Π΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ послС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, нСсколько ΠΏΠΎΡ…ΠΎΠΆΠΈΠ΅ Π½Π° синтСкс: https://github.com/sfackler/rust-postgres-derive/blob/master/postgres-derive-codegen/src/lib. rs # L23 -L50

Π’Π°ΡˆΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ impls ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ нСзависимыми ΠΈ Π½Π΅ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ управлСния, ΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ…ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запускаСтся послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ всС раскрытиС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ для очистки.

Π”ΠΈΠ·Π΅Π»ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π°Π΄ этим. https://github.com/diesel-rs/diesel/blob/master/diesel_codegen/src/lib.rs#L101 -L112

@dtolnay ваша прСдыдущая ΠΎΠ·Π°Π±ΠΎΡ‡Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² #[derive] Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ исправлСна ​​в блиТайшСС врСмя благодаря @jseyfried

Π― поигрался с этим, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ syn ΠΈ quote , ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠΏΡ‹Ρ‚. Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ отличная ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½Π° стабилизируСтся.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ Π² настоящСС врСмя укусила ΠΌΠΎΠΉ impl, Π½Π°Ρ…ΠΎΠ΄ΡΡΡŒ Π½ΠΈΠΆΠ΅ ΠΏΠΎ Ρ‚Π΅Ρ‡Π΅Π½ΠΈΡŽ ΠΎΡ‚ Π»ΠΎΠ³ΠΈΠΊΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° serde s.

Π˜Π³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΠΈΠ»ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ·Π΄Π½ΠΈΡ… Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ, запускаСмых послС ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ…, для ΠΈΡ… удалСния, каТутся ΠΌΠ½Π΅ Ρ€Π°Π·ΡƒΠΌΠ½Ρ‹ΠΌΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΠΌΠΈ.

Π‘Ρ‹Π»ΠΎ Π±Ρ‹ идСально, Ссли Π±Ρ‹ Ρƒ макросов Π½Π΅ Π±Ρ‹Π»ΠΎ возмоТности ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ исходный ΠΏΠΎΡ‚ΠΎΠΊ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ², это каТСтся опасной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Π΄ΠΈΠΊΠΎΠΉ ΠΏΡ€ΠΈΡ€ΠΎΠ΄Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ настоящим ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ макросами 2.0, ΠΈ поэтому Π΅Π΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅.

Π˜Ρ‚Π°ΠΊ, Ρƒ мСня отсутствовала Ρ‚ΠΎΡ‡ΠΊΠ° с запятой Π² ΠΏΡƒΡ‚ΠΈ ΠΊ Ρ‚ΠΈΠΏΡƒ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ generic, ΠΈ я ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ сообщСниС ΠΎΠ± ошибкС ΠΎΡ‚ rustc. МнС интСрСсно, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°ΠΊΠΎΠΉ макрос derive Π²Ρ‹Π·Π²Π°Π» ΠΎΡˆΠΈΠ±ΠΊΡƒ lex, ΠΊΠ°ΠΊΠΎΠΉ Ρ‚ΠΎΠΊΠ΅Π½ Π΅Π΅ Π²Ρ‹Π·Π²Π°Π» ΠΈ Ρ‚. Π”.

error: custom derive attribute panicked
  --> src/simple.rs:69:1
   |
69 | struct C(u64);
   | ^^^^^^^^^^^^^^
   |
   = help: message: Failure parsing derived impl: LexError { _inner: () }

Π― сдСлал тСстовый ΠΏΡ€ΠΈΠΌΠ΅Ρ€ для LexError, ΠΏΠΎΡ…ΠΎΠΆΠ΅, это ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ с Π½ΠΎΡ‡Π½Ρ‹ΠΌ 13 октября (Ρƒ rustup Π½Π΅ Π±Ρ‹Π»ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ) https://github.com/keeperofdakeys/proc_macro_derive_test.

@ rust-lang / lang Π― Π΄ΡƒΠΌΠ°ΡŽ, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±ΡΡƒΠ΄ΠΈΡ‚ΡŒ вопрос ΠΎ Ρ‚ΠΎΠΌ, ΠΌΠΎΠ³ΡƒΡ‚ Π»ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ свой Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ элСмСнт. Π₯отя это простоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΏΠΎΡ…ΠΎΠΆΠ΅, ΠΎΠ½ΠΎ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡ΠΈΡ‚ оТиданиям ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ каТСтся довольно нСпопулярным. Π― ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ - простота приятна, ΠΈ Π½ΠΈ ΠΎΠ΄Π½Π° ΠΈΠ· ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ² Π½Π΅ каТСтся ΠΌΠ½Π΅ Π»ΡƒΡ‡ΡˆΠ΅.

Нам понадобится ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для управлСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ, Ссли элСмСнт ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ. Π― Π½Π΅ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ я особСнно ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎ ΠΎΡ‚Π½ΠΎΡˆΡƒΡΡŒ ΠΊ ΡΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΡŽ возмоТности для наслСдования ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ элСмСнт, ΠΏΠΎΠΊΠ° (Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ) макросы Π½Π΅ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚.

ΠšΡ‚ΠΎ-Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Β«ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΒ». ΠœΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ‡Π»Π΅Π½ΠΎΠ² структуры ΠΈΠ»ΠΈ просто ΠΎΠ± ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ компилятор Π½Π΅ Таловался Π½Π° нСизвСстныС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹?

Если ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ‡Π»Π΅Π½ΠΎΠ² структуры, Π½Π° ΠΌΠΎΠΉ взгляд, Π»ΡƒΡ‡ΡˆΠΈΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π±ΡƒΠ΄Π΅Ρ‚, вСроятно, Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ макрос ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ структуры для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ структуры, которая раскрываСтся Ρ€Π°Π½ΡŒΡˆΠ΅ всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ…. Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‡Π΅Ρ‚ΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ ΠΈ (Π½Π° ΠΌΠΎΠΉ взгляд) ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.

Если ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ± ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², вСроятно, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ способ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π² сам ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ макросов вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ это Π½Π° усмотрСниС макроса.

Моя интуиция ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Π΅Π΄Π΅Ρ‚ сСбя ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ΅, состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ добавляСт ΠΈΠΌΠΏΠ»ΠΈΡ†ΠΈΡ‚. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ impls ΠΈ большС Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°ΡŽΡ‚. Π’ частности, ΠΎΠ½ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ структуру Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ это Π±Ρ‹Π»ΠΎ Π²Π°ΠΆΠ½ΠΎ для Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ…, ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ нСзависимыми ΠΎΡ‚ порядка. Богласны Π»ΠΈ ΠΌΡ‹, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊ Π΄ΠΎΠ»ΠΆΠ½ΠΎ вСсти сСбя ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ΅, ΠΈΠ»ΠΈ люди Π΄ΡƒΠΌΠ°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ прСобразования Π² присоСдинСнном Ρ‚ΠΈΠΏΠ΅?

Если ΠΌΡ‹ соглашаСмся с этим, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ вопрос: Ρ…ΠΎΡ‚ΠΈΠΌ Π»ΠΈ ΠΌΡ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ прСдоставляСмый Π½Π°ΠΌΠΈ интСрфСйс обСспСчивал это, ΠΈΠ»ΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ это Π½Π° усмотрСниС Π°Π²Ρ‚ΠΎΡ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ это? Π—Π΄Π΅ΡΡŒ, ΠΏΠΎΡ…ΠΎΠΆΠ΅, Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ ΡƒΡ€Π°Π²Π½ΠΎΠ²Π΅ΡˆΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹:

  • ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ повСдСнчСского ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ, бСзусловно, ΠΌΠ½Π΅ большС ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Rust.
  • Π—Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ serde ΠΈ deisel Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с этим ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ прСдставляСт мноТСство ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

И, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, Ρ‚ΠΎ, ΠΊΠ°ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ структуру, каТСтся, Π½Π΅ связано с Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ, Π² частности, Π΄ΠΎΠ»ΠΆΠ½ΠΎ вСсти сСбя ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ΅.

Π‘Ρ‚ΠΎΠΈΡ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ элСмСнт позволяСт Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ систСмС Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ мноТСство Ρ€ΠΎΠ»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ½Π° Π½Π΅ сдСлала Π±Ρ‹.

@sgrif НС ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²Ρ‹ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ deisel ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ derive? МнС каТСтся, я понимаю, ΠΊΠ°ΠΊ serde ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ свою ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ структуру (для удалСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‚ макрос ΠΎΠ± ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΠΎΠ»Π΅ΠΉ Π² ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠ΅ сСриализации), Π½ΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, deisel ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ это для Ρ‡Π΅Π³ΠΎ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ. Когда Π²Ρ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚Π΅ Β«ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ элСмСнт», создаСтся Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ выполняСтС довольно Ρ€Π°Π΄ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ этого элСмСнта.

@withoutboats 90% - это Π±ΠΎΠ»Π΅Π΅ ΠΈΠ»ΠΈ ΠΌΠ΅Π½Π΅Π΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚Π΅. ΠœΡ‹ Π½Π΅ Ρ‚Ρ€ΠΎΠ³Π°Π΅ΠΌ ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Ρ‹, прСдоставлСнныС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΌΡ‹ удаляСм Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ элСмСнты, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π·Π»ΠΎΠΌΠ°Ρ‚ΡŒ макросы bang Π² систСму. https://github.com/diesel-rs/diesel/blob/master/diesel/src/macros/macros_from_codegen.rs#L12 -L18. Помимо этого, СдинствСнный Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ касаСмся Ρ‡Π΅Π³ΠΎ-Π»ΠΈΠ±ΠΎ Π²ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ², ΠΌΡ‹ удаляСм Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ. https://github.com/diesel-rs/diesel/blob/master/diesel_codegen/src/lib.rs#L109 -L120

@sgrif Π― Ρ‚Π°ΠΊΠΆΠ΅ злоупотрСблял кастомным ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌ для получСния ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… макросов Π²Π·Ρ€Ρ‹Π²Π°. Π― Π»ΠΈΡ‡Π½ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Π΅Π» Π±Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² макросах 1.1 Π±Ρ‹Π»Π° процСдурная макросистСма Π²Π·Ρ€Ρ‹Π²Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρƒ нас Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»ΠΎ соблазна Π·Π»ΠΎΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡ‚ΡŒ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΈΠ·-Π·Π° Π΅Π΅ грубости. Π― Ρ‡ΡƒΠ²ΡΡ‚Π²ΡƒΡŽ, Ρ‡Ρ‚ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΏΡƒΡ‚ΡŒ - это Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΡƒΡŽ ΠΌΠ°ΠΊΡ€ΠΎ-ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ Π²Π·Ρ€Ρ‹Π²Π° (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ТСсткой, Π½ΠΎ простой Π³ΠΈΠ³ΠΈΠ΅Π½ΠΎΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, всС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹, ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π² TokenStream, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠΌ Π² макрос, скрыты с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π³ΠΈΠ³ΠΈΠ΅Π½Ρ‹? I Π½Π΅ знаю Ρ‚ΠΎΡ‡Π½ΠΎ, ΠΊΠ°ΠΊ это Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ) ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ это вмСсто злоупотрСблСния настраиваСмой ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΉ, Π° Π·Π°Ρ‚Π΅ΠΌ сдСлайтС Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Π΅ΠΌΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡƒΡŽ нСспособной ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ структуру, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½Π° находится. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΡƒΠ΅ΠΌ Π΅Ρ‰Π΅ большС ящиков, ΡƒΠ»ΡƒΡ‡ΡˆΠΈΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ интСрфСйс ΠΈ сдСлаСм Π΄Π΅Ρ€ΠΈΠ²Π°Ρ†ΠΈΡŽ Ρ€Π°Π·ΡƒΠΌΠ½ΠΎΠΉ.

Однако я ΠΌΠΎΠ³Ρƒ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π² ΠΏΠΎΠ»ΡŒΠ·Ρƒ сохранСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠ°ΠΊ простой макрос.

Π― ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ Ρ†Π΅Π»ΡŒ Macros 1.1 - Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΎΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ большС потрСбностСй, с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π·Π°Ρ‚Ρ€Π°Ρ‚Π°ΠΌΠΈ Π½Π° обслуТиваниС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ быстро ΡΡ‚Π°Π±ΠΈΠ»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π΄ΠΎ появлСния макросов 2.0. На ΠΌΠΎΠΉ взгляд, Π½Ρ‹Π½Π΅ΡˆΠ½ΠΈΠΉ Π΄ΠΈΠ·Π°ΠΉΠ½ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для этой Ρ€ΠΎΠ»ΠΈ.

Если Π±Ρ‹ ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ ΠΎ Ρ‡Π΅ΠΌ-Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΎ для постоянного выполнСния этой Ρ€ΠΎΠ»ΠΈ, я Π±Ρ‹Π» Π±Ρ‹ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΎΡ‚ΠΈΠ².

ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, я ошибаюсь, Π½ΠΎ ΠΌΠΎΠ΅ ΠΏΡ€ΠΎΡ‡Ρ‚Π΅Π½ΠΈΠ΅ RFC Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ основой для повСдСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΉ Π½Π° постоянной основС. Π’ΠΎ Π΅ΡΡ‚ΡŒ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ Π² TokenStream Π±ΡƒΠ΄ΡƒΡ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Π½ΠΎ макросы извлСчСния Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот API, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² настоящСС врСмя позволяСт ΠΈΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ ΠΌΡƒΡ‚Π°Ρ†ΠΈΠΈ Π² Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ элСмСнтС (ΠΈ эта Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° для Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° использования deisel ).

Π― довольно Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½ΠΎ ΠΎΡ‚Π½ΠΎΡˆΡƒΡΡŒ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ‚ΡŒ Π΄Π΅Ρ€ΠΈΠ²Π°ΠΌ Π΄Π΅Π»Π°Ρ‚ΡŒ это навсСгда. Если ΠΌΡ‹ согласимся с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ эта систСма Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅ΠΉ вмСстС с макросами macro_rules Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ, Π° Π² Ρ€Π°ΠΌΠΊΠ°Ρ… макросов 2.0 ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π΄Π°Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ API Π΄Π΅Ρ€ΠΈΠ²Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½, я с Π½ΠΈΠΌ ΠΊΠΎΠΌΡ„ΠΎΡ€Ρ‚Π½Π΅Π΅.

ΠšΠ°ΠΆΠ΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΊΠ°ΠΊ трансформаторов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ всС Ρ‡Ρ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ.
И ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ прСдставлСн ΠΊΠ°ΠΊ простой Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ Π±Π΅Π· Π²Π²ΠΎΠ΄Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°.

@withoutboats : Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² для измСнСния Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈΠΌΠΏΡ‹, ΠΈ поэтому Π½Π°ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ Π½ΡƒΠΆΠ½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΈΡ… ΠΈΠ»ΠΈ ΠΈΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… послС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Если Π±Ρ‹ это ΠΏΠΎΠΌΠΎΠ³Π»ΠΎ, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ компилятору список Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ слСдуСт ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ, вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π΅Π»Π°Ρ‚ΡŒ это сами.

@eddyb Π― Π·Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ, Π½ΠΎ Π½Π΅ Π·Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π΅Ρ€ΠΈΠ²Ρ‹ Π±Ρ‹Π»ΠΈ Π±Π΅Π·ΡƒΠ΄Π΅Ρ€ΠΆΠ½Ρ‹ΠΌΠΈ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ (Π² долгосрочной пСрспСктивС).

@erickt Π’Π΅Ρ€Π½ΠΎ. Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Π² долгосрочной пСрспСктивС ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π±Ρ‹Π»ΠΎ Π±Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ эти Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π±Ρ‹Π»ΠΈ зарСгистрированы ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π±Π΅Π· ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΎΡ‚Π²Π΅Ρ‡Π°Π» Π·Π° ΠΈΡ… ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅. Но Π² краткосрочной пСрспСктивС это Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Π² долгосрочной пСрспСктивС ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π±Ρ‹Π»ΠΎ Π±Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ эти Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π±Ρ‹Π»ΠΈ зарСгистрированы ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π±Π΅Π· ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΎΡ‚Π²Π΅Ρ‡Π°Π» Π·Π° ΠΈΡ… ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅. Но Π² краткосрочной пСрспСктивС это Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

Π― Π½Π΅ Π·Π½Π°ΠΊΠΎΠΌ с Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ компилятора, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π΅Π»Π°ΡŽΡ‚ это Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ Π² краткосрочной пСрспСктивС, Π½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ»Π°Π³ΠΈΠ½ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ извлСчСния прСдставил список настраиваСмых Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ намСрСваСтся ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΎΡ‚ΠΊΠ»ΠΎΠ½ΠΈΠ» Π»ΡŽΠ±Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ прСобразования Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π² ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΎΠ²Π°Ρ€?

Π― Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ», Ρ‡Ρ‚ΠΎ Diesel Π½Π΅ слСдуСт ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρƒ Serde, согласно ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ всС свои настраиваСмыС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΏΠΎΠ΄ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, #[serde(rename = "name")] Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ #[table_name = "name"] ДизСля). Упростит Π»ΠΈ это Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, Ссли Π±Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ настраиваСмоС имя Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° прописался вмСсто списка?

Одна ΠΈΠ· возмоТностСй ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ управлСния - Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Π΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ послС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, нСсколько ΠΏΠΎΡ…ΠΎΠΆΠΈΠ΅ Π½Π° синтСкс: https://github.com/sfackler/rust-postgres-derive/blob/master/postgres-derive-codegen/src/lib. rs # L23 -L50

Π’Π°ΡˆΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ impls ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ нСзависимыми ΠΈ Π½Π΅ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ управлСния, ΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ…ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запускаСтся послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ всС раскрытиС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ для очистки.

Π― Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π» ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Π΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ послС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ для макросов 1.1 Π² post-expansion . Π’Π°ΡˆΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ impls ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ нСзависимыми ΠΈ Π½Π΅ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ управлСния, ΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ…ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запускаСтся послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ всС раскрытиС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ для удалСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ².

ΠœΡ‹ обсудили вопрос ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ / Π·Π°ΠΊΠ°Π·Π° сСгодня Π½Π° собрании ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ lang. Π‘Ρ‹Π»ΠΎ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ ΠΎΠΏΡ€Π°Π²Π΄Π°Ρ‚ΡŒ оТидания ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ для простоты (с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Π΄ΠΈΠ·Π°ΠΉΠ½Π°, Π½Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ слишком большого количСства Ρ…Π°ΠΊΠΎΠ² Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π°Ρ… ΠΈ Π½Π΅ слишком ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½Ρ‹ ошибкам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Ρ‚ΡŒ / ΠΎΡ‚Π»Π°Π΄ΠΈΡ‚ΡŒ). Π‘Ρ‹Π»ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½ΠΎ, Ρ‡Ρ‚ΠΎ, хотя ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ†Π΅Π»Π΅Π²Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΡƒΠ΄ΠΈΠ²Π»Π΅Π½ΠΈΠ΅, ΠΎΠ½ΠΎ Π½Π΅ нСбСзопасно. Π’Π°ΠΊΠΆΠ΅ ΡΡ‡ΠΈΡ‚Π°Π»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΡΡ‚Ρ€Π΅ΠΌΠΈΡ‚ΡŒΡΡ ΠΊ чистотС Ρ€Π°Π΄ΠΈ самой чистоты, Π° Π½Π΅ ΠΏΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΌΠΎΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ.

Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ исходный ΠΊΠΎΠ΄, вСроятно, Π»ΡƒΡ‡ΡˆΠ΅, ΠΈ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° эту модСль. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΄Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° FCP. ΠœΡ‹ Π½Π΅ Π΄ΡƒΠΌΠ°Π»ΠΈ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ удалСния. Π‘ΠΊΠΎΡ€Π΅Π΅, Ρ‚ΠΎ, ΠΊΠ°ΠΊ компилятор ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ‚ΡŒ Ρ‚Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ макросом, ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. RFC 1755 Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ это.

Π­Ρ‚ΠΎ Π·Π°Π΄Π΅Ρ€ΠΆΠΈΡ‚ ΡΡ‚Π°Π±ΠΈΠ»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ…. Однако ΠΌΡ‹ считаСм, Ρ‡Ρ‚ΠΎ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв использования ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… (особСнно Ρ‚Π΅Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΡƒΡŽ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ инструмСнтов) Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, поэтому, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Serde вскорС смогут ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ. Π’Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½ΡƒΠΆΠ½Ρ‹ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, Π·Π°ΠΉΠΌΡƒΡ‚ Π½Π° нСсколько Ρ†ΠΈΠΊΠ»ΠΎΠ² большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π½ΠΎ это Π½Π΅ повлияСт Π½Π° ΠΎΠ±Ρ‰ΠΈΠΉ случай.

cc @alexcrichton , @dtolnay , @sgrif , @erickt - мысли?

Атрибуты, вСроятно, Ρ‡Π°Ρ‰Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ с Serde ΠΈ Diesel, Ρ‡Π΅ΠΌ Π²Ρ‹ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚Π΅. Π˜ΡΡ…ΠΎΠ΄Ρ ΠΈΠ· собствСнного ΠΎΠΏΡ‹Ρ‚Π°, я ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ всС ΠΌΠΎΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ Serde, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹. Π’ Diesel я ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, ΠΈ я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ diesel_codegen, какая Ρ‚Π°Π±Π»ΠΈΡ†Π° Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… сопоставляСтся со структурой.

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π·Π°ΠΏΡ€Π΅Ρ‚ Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ структуры Π² custom derive каТСтся ΠΌΠ½Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ. Π­Ρ‚ΠΎ просто всС ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚, прСдотвращая мноТСство странных ΠΊΡ€Π°ΠΉΠ½ΠΈΡ… случаСв. Π‘ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Ρ‡Π΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это быстро, поэтому, Ссли функция Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠΉ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ дольшС, это Ρ‚ΠΎΠΆΠ΅ каТСтся прСкрасным.

Π‘Ρ‹Π»ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½ΠΎ, Ρ‡Ρ‚ΠΎ, хотя ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ†Π΅Π»Π΅Π²Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΡƒΠ΄ΠΈΠ²Π»Π΅Π½ΠΈΠ΅, ΠΎΠ½ΠΎ Π½Π΅ нСбСзопасно.

Π­Ρ‚ΠΎ нСбСзопасно, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρƒ вас Π½Π΅Ρ‚ нСбСзопасных Ρ‡Π΅Ρ€Ρ‚.

На ΠΌΠΎΠΉ взгляд, ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² использования настраиваСмых ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… являСтся бСзопасная рСализация Ρ‚Ρ€Π΅ΠΉΡ‚ΠΎΠ², ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹Ρ… ΠΊΠ°ΠΊ нСбСзопасныС, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Ρ€Π΅ΠΉΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ‚ΠΎΡ‡Π½ΠΎ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΌΠ°ΠΊΠ΅Ρ‚ элСмСнтов структуры, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½.

Мой ящик asn1 Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² для Ρ‡Π΅Π³ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ использования, поэтому ΠΌΠ½Π΅ фактичСски Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° Π½Π΅ появятся ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹.

Π‘Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ настраиваСмыС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ rfc Π½Π° Π΄Π²Π΅ части?

  1. RFC для прСдоставлСния ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ пространств ΠΈΠΌΠ΅Π½ для настраиваСмых Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π² Ρ†Π΅Π»ΠΎΠΌ (Ρ‡Ρ‚ΠΎ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ no-op Π² ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠΉ вСрсии).
  2. RFC для опрСдСлСния ΠΈ сСмантики выполнСния макросов настраиваСмых Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ².

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ настраиваСмых Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² каТутся Ρ‡Π΅ΠΌ-Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎΠ³ΠΎ, Ссли ΠΈΡ… ΠΏΡ€ΠΎΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ rfc Π½Π° Π΄Π²Π° ΠΌΠΎΠΆΠ΅Ρ‚ быстрСС ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ для настраиваСмых ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ².

Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Ρ‹ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€Π΅Π΄Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½Ρ‹ΠΌΠΈ (Ρ‚. Π•. Для использования Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² для ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° трСбуСтся внСшний ящик). Π― ΠΌΠΎΠ³Ρƒ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ это Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ способ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ использованиС Π΄Π²ΡƒΡ… настраиваСмых макросов ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… с ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°. Π—Π΄Π΅ΡΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² качСствС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ использовано имя ящика, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ находится Ρ‡Π΅Ρ€Ρ‚Π°.

Π•ΡΡ‚ΡŒ Π»ΠΈ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ эта рСализация Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ макросы name! ? ΠŸΡ€ΠΎΡΡ‚Ρ‹Π΅ TokenStream in, TokenStream out для ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… макросов оказались Π±Ρ‹ Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ Π² Π±ΠΎΡ€ΡŒΠ±Π΅ с врСдитСлями, ΠΊΠΎΠ³Π΄Π° врСмя компиляции слоТных Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ 30 сСкунд.

@dragostis ΠŸΡ€ΠΎΡ†ΠΈΡ‚ΠΈΡ€ΡƒΡŽ Ρ€Π΅Π·ΡŽΠΌΠ΅

Π˜Π·Π²Π»Π΅ΠΊΠΈΡ‚Π΅ Π² компилятор ΠΎΡ‡Π΅Π½ΡŒ нСбольшой Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ сСгодняшнСй ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎΠΉ макросистСмы, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ достаточно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π° настраиваСмого наслСдования, ΠΈ ΠΈΠΌΠ΅Ρ‚ΡŒ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ API. Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Ρ€Π΅ΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ для компилятора, Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ ΠΏΡ‹Ρ‚Π°ΠΉΡ‚Π΅ΡΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ достаточно Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для «идСальной макросистСмы». Π’ Ρ†Π΅Π»ΠΎΠΌ, это слСдуСт Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ постСпСнный шаг ΠΊ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ «макросам 2.0Β».

Или, говоря Π±ΠΎΠ»Π΅Π΅ практичСским языком, потрСбуСтся ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ тСстированиС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΡƒΡŽ макросистСму, которая Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ систСма закрытия, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ сСйчас создали. Π’Π°ΠΊΠΈΠ΅ ящики, ΠΊΠ°ΠΊ serde ΠΈ diesel ΠΈΠΌΠ΅ΡŽΡ‚ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с удобством использования Π±Π΅Π· Π½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ настраиваСмого извлСчСния, поэтому Π΄Π°Π²Π°ΠΉΡ‚Π΅ сдСлаСм Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΌΠ΅Ρ€Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ это сСйчас - это Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ инструмСнтам ΠΈ ΠΎΠΏΡ‹Ρ‚Ρƒ с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ процСдурная макросистСма. Π―Ρ‰ΠΈΠΊΠΈ syn ΠΈ quote ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ этого.

@keeperofdakeys Ага, понял. Π― Π½Π΅ ΠΏΡ€ΠΎΡˆΡƒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ макросы 2.0, ΠΌΠ½Π΅ просто интСрСсно, Π΅ΡΡ‚ΡŒ Π»ΠΈ ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ брСмя для добавлСния Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°, скаТСм, proc_macro ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся минимальной Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ, которая просто ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π΄ΠΈΠ·Π°ΠΉΠ½ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… макросов. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π² pest Π±ΡƒΠ΄Π΅Ρ‚ просто Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ для struct Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½ Π½Π΅ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π΅Π³ΠΎ ΠΈΠ· самого struct , Π° ΠΈΠ· простой Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ {} . Π₯отя, надСюсь, я Π½Π΅ Π²Ρ‹ΠΊΠ°ΠΏΡ‹Π²Π°ΡŽ ΠΌΠ΅Ρ€Ρ‚Π²Ρ‹Π΅ дискуссии!

@nrc

Π’Π°ΠΊΠΆΠ΅ ΡΡ‡ΠΈΡ‚Π°Π»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, стрСмимся ΠΊ чистотС Ρ€Π°Π΄ΠΈ самой чистоты, Π° Π½Π΅ ΠΏΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΌΠΎΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ.

Одно Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ ΠΏΠΎ этому ΠΏΠΎΠ²ΠΎΠ΄Ρƒ: Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ТСсткиС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΈ спСциализация, статичСскоС обСспСчСниС ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ понятия «чистота» Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π·Π°Ρ‚Ρ€ΡƒΠ΄Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ / Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Но Π² этом случаС Π½Π° самом Π΄Π΅Π»Π΅ ΠΎΡ‡Π΅Π½ΡŒ просто Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ это конструкциСй, ΠΈ устранСниС ваТности порядка для ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… каТСтся довольно ΡΠΈΠ»ΡŒΠ½Ρ‹ΠΌ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠ΅ΠΌ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

Π§Ρ‚ΠΎ касаСтся ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° для игнорирования Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² прямо сСйчас, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» Π±Ρ‹ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ (Π² Ρ‚ΠΎΠΌ смыслС, Ρ‡Ρ‚ΠΎ API Π½Π΅ Π±Ρ‹Π» Π±Ρ‹ ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½ ΠΏΠΎΠ»ΠΎΠΌΠΊΠ΅), Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ всС Π΅Ρ‰Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π½ΠΎΡ‡Π½ΠΎΠ³ΠΎ использования. ΠœΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π΄Π°ΠΆΠ΅ ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎ стабилизации Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ±ΠΎΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° с ΠΏΠ»Π°Π½Π°ΠΌΠΈ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Π½Π΅Π³ΠΎ Π² ΠΏΠΎΠ»ΡŒΠ·Ρƒ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰Π΅Π³ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ доступСн. Или ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ @keeperofdakeys ΠΈ быстро Ρ€Π΅ΡˆΠΈΠ»Π° Π±Ρ‹

Π‘ ΠΌΠΎΠ΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния, Π²Π°ΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½ΠΈ ΠΎΠ΄Π½Π° ΠΈΠ· этих ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π½Π΅ мСшала ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ макрос 1.1 для Serde ΠΈ, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, Β«Π΄Π΅-Ρ„Π°ΠΊΡ‚ΠΎΒ» ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎ (Ρ‚.Π΅. Π½Π΅ Π»ΠΎΠΌΠ°Ρ‚ΡŒ).

@sgrif

Если Π±Ρ‹ ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ ΠΎ Ρ‡Π΅ΠΌ-Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΎ для постоянного выполнСния этой Ρ€ΠΎΠ»ΠΈ, я Π±Ρ‹Π» Π±Ρ‹ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΎΡ‚ΠΈΠ².

Π― Ρ…ΠΎΡ‚Π΅Π» ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ @withoutboats ΠΈ ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² настоящСС врСмя ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ API макросов 1.1 ΠΎΡΡ‚Π°Π²Π°Π»Π°ΡΡŒ ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ, Π΄Π°ΠΆΠ΅ ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ отправляСм макросы 2.0. Π­Ρ‚ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΏΠ΅Ρ€Π΅ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ - ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎΠ± этом большС ΠΊΠ°ΠΊ ΠΎ ΡΠ΅Π³ΠΎΠ΄Π½ΡΡˆΠ½ΠΈΡ… macro_rules, с Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ΠΌ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΉ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ систСма Π±ΡƒΠ΄Π΅Ρ‚ Π½Π° мСстС.

МоС Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»Π΅Π½ΠΈΠ΅ ΠΎΡ‚ использования Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π½Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ DERIVE Π±Ρ‹Π»ΠΎ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° @jimmycuadra Β«s Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»Π΅Π½ΠΈΠ΅ , Ρ‡Ρ‚ΠΎ , Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ довольно ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ. Π― ΡΡ‡ΠΈΡ‚Π°ΡŽ (Π½ΠΎ ΠΏΠΎΠΏΡ€Π°Π²ΡŒΡ‚Π΅ мСня, Ссли я ошибаюсь), Ρ‡Ρ‚ΠΎ настраиваСмыС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΈΠΌΠ΅Π»ΠΈ Ρ€Π΅ΡˆΠ°ΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для ряда Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² использования дизСльного Ρ‚ΠΎΠΏΠ»ΠΈΠ²Π°.

Π’ этом смыслС я Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½ Π½Π° 100%, ΠΊΠ°ΠΊ Π»ΡƒΡ‡ΡˆΠ΅ всСго ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ с этими Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ. Π‘Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΠ±ΠΈΠ΄Π½ΠΎ ΡΡ‚Π°Π±ΠΈΠ»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ макросы 1.1, Π½ΠΎ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ большоС количСство ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π½ΠΎΡ‡ΡŒ (Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ "Π΄Π΅-Ρ„Π°ΠΊΡ‚ΠΎ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ" ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π½ΠΎΡ‡ΡŒ), ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ стСпСни сводит Π½Π° Π½Π΅Ρ‚ Ρ†Π΅Π»ΡŒ быстрой стабилизации макросов 1.1 Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Ссли ΠΌΡ‹ Π½Π΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΠΌ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ макросов 1.1 _ фактичСски_ Π½Π° ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Rust, я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ стабилизация макросов 1.1 ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒ.

Один ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ мСня бСспокоит, - это Ρ‚ΠΎ, ΠΊΠ°ΠΊ, ΠΏΠΎ Π½Π°ΡˆΠ΅ΠΌΡƒ мнСнию, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Π² долгосрочной пСрспСктивС, ΠΈ рационализация этого с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ систСмы макросов 1.1. Π’ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ RFC для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ящики Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ внСсСнныС Π² Π±Π΅Π»Ρ‹ΠΉ список пространства ΠΈΠΌΠ΅Π½ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ части ящика. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ использованиС настраиваСмого Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° Π² настраиваСмой ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΉ Ρ€Π°Π΄ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎ отличаСтся ΠΎΡ‚ использования настраиваСмого Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ мСстС. Π­Ρ‚ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ бСспокоит мСня с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния эргономичности ΠΈ "Π½Π°ΠΈΠΌΠ΅Π½Π΅Π΅ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎΠΉ" Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния, хотя я Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽ это ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для настройки RFC (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ссли я ΡΠ²ΡΠΆΡƒΡΡŒ с ящиком serde Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ автоматичСски занСсти Π² Π±Π΅Π»Ρ‹ΠΉ список Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ serde ).

Π’ Ρ†Π΅Π»ΠΎΠΌ, я Π»ΠΈΡ‡Π½ΠΎ Π±Ρ‹Π» Π±Ρ‹ Π² порядкС, ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΠ²ΡˆΠΈΡΡŒ Π²ΠΏΠ΅Ρ€Π΅Π΄ с ΠΏΠΎΠ»Π½ΠΎΠΉ стабилизациСй систСмы макросов 1.1 ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ сСгодня. Или, Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, стабилизируйтС Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ структуру, Π° Π·Π°Ρ‚Π΅ΠΌ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ эту структуру, Ссли ΠΎΠ½ΠΈ хотят Π΅Π΅ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ.

Π― склонСн ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ с rustc-serialize Π½Π° serde, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ гСнСрация ΠΊΠΎΠ΄Π° serde ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ управлСния.

ΠœΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ макросы 1.1 для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² самого ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°. Π’ Ρ†Π΅Π»ΠΎΠΌ это каТСтся приятным, ΠΈ Π² краткосрочной пСрспСктивС ΠΈΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π·Π»ΠΎΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ отсутствиС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² управлСния.

Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ @sfackler , Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Ρ‹ для Serde , Ρ‡Π΅ΠΌ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ @nrc заставляСт ΠΈΡ… Π·Π²ΡƒΡ‡Π°Ρ‚ΡŒ. ΠŸΠΎΡ‡Ρ‚ΠΈ всС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ использования Π±Π΅Π· Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ rustc-serialize. Если ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒ людСй ΠΎΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎ Π½ΠΎΡ‡Π°ΠΌ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это, ΠΎΡ‚ΠΊΠ°Π·Π°Π²ΡˆΠΈΡΡŒ ΠΎΡ‚ Serde Π² ΠΏΠΎΠ»ΡŒΠ·Ρƒ rustc-serialize.

Π£ мСня ΠΏΠΎΠΊΠ° Π½Π΅Ρ‚ мнСния ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ шагС, Π½ΠΎ я знаю, Ρ‡Ρ‚ΠΎ Ссли ΠΌΡ‹ стабилизируСмся Π±Π΅Π· Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², я Π±Ρ‹ Π½Π°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ΄ΡƒΠΌΠ°Π» ΠΎ синтаксичСском Π°Π½Π°Π»ΠΈΠ·Π΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° для извлСчСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ². Π― полагаю, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ люди Π½Π΅ Π·Π°Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π΅Π»ΠΎ со сцСнариСм сборки Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ ΠΌΠΎΠ³Π»ΠΈ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ:

#[serde(skip_serializing)]

.. вмСсто:

/// <!-- serde(skip_serializing) -->

@tomaka

На ΠΌΠΎΠΉ взгляд, ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² использования настраиваСмых ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… являСтся бСзопасная рСализация Ρ‚Ρ€Π΅ΠΉΡ‚ΠΎΠ², ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹Ρ… ΠΊΠ°ΠΊ нСбСзопасныС, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Ρ€Π΅ΠΉΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ‚ΠΎΡ‡Π½ΠΎ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΌΠ°ΠΊΠ΅Ρ‚ элСмСнтов структуры, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½.

Π§Ρ‚ΠΎ Π²Ρ‹ Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅ ΠΎ ΠΌΠΎΠ΅ΠΌ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΏΠΎ этому ΠΏΠΎΠ²ΠΎΠ΄Ρƒ? Π― ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ», Ρ‡Ρ‚ΠΎ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Π° ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ.

Π₯ΠΎΡ‡Ρƒ ΠΏΡ€ΠΎΡΡΠ½ΠΈΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ Π²Π΅Ρ‰ΡŒ:

Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ настраиваСмых Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² - Π³Π»Π°Π²Π½ΠΎΠ΅, Ρ‡Ρ‚ΠΎ люди Π΄Π΅Π»Π°ΡŽΡ‚ с настраиваСмым ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌ?

Π― знаю, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ нСсколько Ρ…Π°ΠΊΠΎΠ² для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ foo! Π² контСкстС Ρ‚ΠΈΠΏΠ° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, @sgrif упомянул Ρ‚Π°ΠΊΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ использования Π² дизСльном Ρ‚ΠΎΠΏΠ»ΠΈΠ²Π΅, я Π΄ΡƒΠΌΠ°ΡŽ, @tomaka Ρ‚ΠΎΠΆΠ΅ упомянул ΠΎΠ΄ΠΈΠ½) - насколько

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ я ΡΠΏΡ€Π°ΡˆΠΈΠ²Π°ΡŽ, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ: я Π²ΠΈΠΆΡƒ прСимущСства Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ извлСчСния Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ список Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… элСмСнтов. Π’ частности, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Ρ‹ для самого объявлСния Ρ‚ΠΈΠΏΠ° Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌΠΈ. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ быстрого ΠΈ грязного API Π² контСкст, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π²Π°ΠΌ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ список ΠΈΠΌΠ΅Π½ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π² Π±Π΅Π»Ρ‹ΠΉ список Π² контСкстС этого Ρ‚ΠΈΠΏΠ°, каТСтся достаточно простым исправлСниСм для Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², ΠΈ ΠΌΡ‹ всСгда ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Π½Π΅Π³ΠΎ.

Однако, Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ большС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² использования (ΠΈ, чСстно говоря, эти Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ использования Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ большС ... ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Π΅Π³ΠΎ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ ΠΎΡ‚ наслСдования), Ρ‚ΠΎ это Π½Π΅ сработаСт. Π’ этом случаС, я Π±Ρ‹ , вСроятно , Π±ΡƒΠ΄Π΅Ρ‚ ΡˆΡ‚Ρ€Π°Ρ„ ΡΡ‚Π°Π±ΠΈΠ»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΊΠ°ΠΊ ΠΈ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠ·ΠΈΡ‚ΡŒ Π½Π° Β«ΠΈΠ· Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Ρ… Π±Π°ΠΉΡ‚ΠΎΠ²Β» API Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ Π² ΠΏΠΎΠ»ΡŒΠ·Ρƒ Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ способа , Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ DERIVE ( Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², ΠΌΡ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ , Ρ‡Ρ‚ΠΎ люди Π±ΡƒΠ΄ΡƒΡ‚ Π² любом случаС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Π΅ Π±Π°ΠΉΡ‚Ρ‹, Π²Π΅Ρ€Π½ΠΎ? Π° ΠΏΠΎΡ‚ΠΎΠΊΠΈ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ²?) Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π΄Π°Ρ‚ΡŒ API Π±ΠΎΠ»Π΅Π΅ Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΎΠ΅ имя =)

@nikomatsakis Основная Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ - Π½Π΅ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ, Π° ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹. Π― Π½Π΅ осознаю ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹Ρ… нСдостатков ΠΈΡ… игнорирования. НапримСр, прСдоставлСния Π±Π΅Π»ΠΎΠ³ΠΎ списка ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΊ основному Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρƒ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ для всСх практичСских Π½ΡƒΠΆΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ истинными ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌΠΈ, Π° Π½Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΌΠΈ макросами.

Π”Π°, я Ρ€Π°Π·Ρ€Ρ‹Π²Π°ΡŽΡΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ двумя ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°ΠΌΠΈ, Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ явныС нСдостатки:

  1. ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ «простого ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎΒ» - настройтС API Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠ» Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ элСмСнты, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ настраиваСмыС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ получСния, ΠΈ закрывая Π΄Ρ‹Ρ€Ρƒ, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ дизСль ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ящики ΠΏΡ€Ρ‹Π³Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы.
  2. ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ Β«Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ устарСвания» - стабилизация API ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ, с нСбольшими ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚Π°ΠΊΠΈΠΌΠΈ, ΠΊΠ°ΠΊ Нико упомянул ΠΎΠ± ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠΈ, с Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Π½Π΅Π³ΠΎ. Π­Ρ‚ΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ‚ всСх создатСлСй настраиваСмых ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ свой ΠΊΠΎΠ΄ ΠΈ Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎΠ³ΠΎ повСдСния Π² ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄.

EDIT: Π½ΠΎ Π±Π΅Π»Ρ‹ΠΉ список

Π― имСю Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ это Π½Π΅ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ @nrc ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ

ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я злоупотрСблял систСмой макросов 1.1 Π² rust-cpp, Π±Ρ‹Π»ΠΈ Π±Ρ‹ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ с Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ просто прСдоставляСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ impls ΠΈ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹.

Π― Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π²Π°ΠΆΠ½Π°, Π½ΠΎ Π² ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΌ мСня Π±Ρ‹ устроила Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ структуру Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ этой Ρ‚ΠΎΡ‡ΠΊΠΈ.

Π― Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½, ΠΊΠ°ΠΊΠΈΠ΅ Ρ„ΠΎΡ€ΠΌΡ‹ Ρ…Π°ΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ @sgrif ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π² deisel, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ_ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π² ΠΌΠΈΡ€Π΅, Π³Π΄Π΅ ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ саму структуру, Π° вмСсто этого ΠΌΠΎΠΆΠ΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ элСмСнты.

Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ настраиваСмым ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, ΠΊΠ°ΠΊ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ @sfackler , ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ способом ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, позволяя ΠΏΡ€ΠΈ этом ΠΎΡ‚Π»ΠΎΠΆΠΈΡ‚ΡŒ принятиС любого Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎ настраиваСмым Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ. Он Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠΌ красивым ΠΈΠ»ΠΈ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌ, Π½ΠΎ ΠΎΠ½ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ. Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

#[derive(Debug, Clone, Serialize(field("bar", rename = "baz")))]
pub struct Foo {
  pub bar: String,
}

ПозднСС эта Ρ„ΠΎΡ€ΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΌΠ΅Π½Π΅Π½Π° настраиваСмыми Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±ΡƒΠ΄Π΅Ρ‚ принято Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΎ Π½ΠΈΡ….

И serde, ΠΈ ΠΌΠΎΠΉ ящик Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² field / option. ΠŸΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ΄Ρ€Π°ΠΆΠ°Ρ‚ΡŒ этому с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ особого смысла, Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹.

КакоС Π±Ρ‹ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΌΡ‹ Π½ΠΈ приняли, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΡ‚Π°Π±ΠΈΠ»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ это, Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ, Ссли Π±Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ настраиваСмых макросов ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ свой ΠΊΠΎΠ΄, ΠΊΠΎΠ³Π΄Π° / Ссли ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡΡ Π½Π° макросы 2.0, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ api (ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Π°Π²Ρ‚ΠΎΡ€Ρ‹ макросов настраиваСмых ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… макросов Π±ΡƒΠ΄ΡƒΡ‚). ΠŸΠΎΡ…ΠΎΠΆΠ΅, Ρ‡Ρ‚ΠΎ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Ρ€Π°Π·ΡƒΠΌΠ½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ являСтся прСдоставлСниС компилятору списка Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² для удалСния для вашСго ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΈ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ, ΠΎΠ½ΠΈ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС выполнСния _всС_ макросов ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π£ Serde, Diesel ΠΈ ΠΌΠΎΠ΅Π³ΠΎ ящика Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° для Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… макросов.

Π‘ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ удалСния ΠΌΠ½Π΅ Π½Π΅ понадобится ящик послС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сдСлал @dtolnay, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ макрос извлСчСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ послС запуска ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ….

FWIW СдинствСнная ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° для удалСния этих Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² - ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ HIR Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ½ΠΊΠΈΠΌ - Ρ‡Ρ‚ΠΎ касаСтся всСго ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΈΡ… ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅.

Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ настраиваСмых Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² - Π³Π»Π°Π²Π½ΠΎΠ΅, Ρ‡Ρ‚ΠΎ люди Π΄Π΅Π»Π°ΡŽΡ‚ с настраиваСмым ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌ?

Π― знаю, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ нСсколько хитростСй, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ foo! Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Π² контСкстС Ρ‚ΠΈΠΏΠ° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, @sgrif упомянул Ρ‚Π°ΠΊΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ использования Π² дизСльном Ρ‚ΠΎΠΏΠ»ΠΈΠ²Π΅, я Π΄ΡƒΠΌΠ°ΡŽ, @tomaka Ρ‚ΠΎΠΆΠ΅ упомянул ΠΎΠ΄ΠΈΠ½) - насколько Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ эти Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ использования?

Π― ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ согласСн с Ρ‚Π΅ΠΌ Ρ„Π°ΠΊΡ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ структуру.

Π― часто Π²ΠΎΡ€Ρ‡Ρƒ Π½Π° отсутствиС ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² Π² ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠΌ Rust, поэтому, ΠΊΠΎΠ³Π΄Π° я Π²ΠΈΠ΄Π΅Π» кастомныС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅, я использовал ΠΈΡ… ΠΊΠ°ΠΊ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹. Но я, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Π½Π΅ ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡΡŒ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ кастомныС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎ, для Ρ‡Π΅Π³ΠΎ ΠΎΠ½ΠΈ Π½Π΅ Π±Ρ‹Π»ΠΈ созданы.

ΠŸΠΎΡ…ΠΎΠΆΠ΅, Π² послСднСм Π½ΠΎΡ‡Π½ΠΎΠΌ Π½ΠΎΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π» рСгрСсс. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ошибки

Queryable - это Ρ€Π΅ΠΆΠΈΠΌ Π²Ρ‹Π²ΠΎΠ΄Π°

ΠΏΡ€ΠΈ составлСнии Π½Π°ΡˆΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ².

#[derive(Queryable)]
pub struct Post {
    pub id: i32,
    pub title: String,
    pub body: String,
    pub published: bool,
}

@sgrif Π­Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π²Ρ‹Π·Π²Π°Π½ΠΎ # 37198, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ» ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎ ΠΆΠ΅ пространство ΠΈΠΌΠ΅Π½, Ρ‡Ρ‚ΠΎ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ макросы (Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ макросы bang!() , #[attribute] макросы #[derive(custom)] всС совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ‚ΠΎ ΠΆΠ΅ пространство ΠΈΠΌΠ΅Π½).

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ #[macro_use] extern crate diesel; ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ макрос bang с ΠΈΠΌΠ΅Π½Π΅ΠΌ Queryable Π° #[macro_use] extern crate diesel_codegen; ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ настраиваСмый макрос получСния, Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ Queryable , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ пСрСзаписываСт макрос bang (ΠΊΡ€ΠΎΠΌΠ΅ - #[macro_use] тихая ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡŒ Π½Π΅ идСальна, Π½ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΡ‹ смоТСм ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ макросы ΠΈΠ· Π²Π½Π΅ΡˆΠ½ΠΈΡ… ящиков с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ use вмСсто #[macro_use] , скоро!).

Π― ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ ошибка Π²Ρ‹Π·Π²Π°Π½Π° Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ макроса Bang Queryable!(); Π² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΈ настраиваСмого ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ Π² настраиваСмый ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ· diesel_codegen вмСсто макроса Bang ΠΈΠ· diesel .

@jseyfried Π’ Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° использования ΠΎΠ΄Π½ΠΎΠ³ΠΎ пространства ΠΈΠΌΠ΅Π½ для всСх Ρ‚Ρ€Π΅Ρ… Β«Π²ΠΈΠ΄ΠΎΠ²Β» макросов? МнС каТСтся, Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ смысла Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΈ макросы Π²Π·Ρ€Ρ‹Π²Π° ΠΊΠ°ΠΊ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠ΅ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ пространство ΠΈΠΌΠ΅Π½, ΠΊΠ°ΠΊ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ смысла Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Ρ‚ΠΈΠΏΡ‹ ΠΊΠ°ΠΊ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠ΅ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ пространство ΠΈΠΌΠ΅Π½ (Π΅Ρ‰Π΅ мСньшС - Π²Ρ‹Π²ΠΎΠ΄ макросов).

@withoutboats Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ это Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°Ρ аналогия, я ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Π½Ρ‹Π΅ Π²ΠΈΠ΄Ρ‹ макросов Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ пространство ΠΈΠΌΠ΅Π½ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Ρ€Π°Π·Π½Ρ‹Π΅ Π²ΠΈΠ΄Ρ‹ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΠ»ΠΈ Ρ‚ΠΈΠΏΠΎΠ² (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ константы). НаличиС пространств ΠΈΠΌΠ΅Π½ связано со ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ, ΠΈ я ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ Ρ‡Π΅ΠΌ ΠΈΡ… мСньшС, Ρ‚Π΅ΠΌ Π»ΡƒΡ‡ΡˆΠ΅, поэтому вопрос Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Π·Π°Ρ‡Π΅ΠΌ Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ Ρ€Π°Π·Π½Ρ‹Π΅ пространства ΠΈΠΌΠ΅Π½? ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ для ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ совмСстимости Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ макросы Π½Π°Ρ…ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ Π² пространствС ΠΈΠΌΠ΅Π½, ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠΌ ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Ρ‚ΠΈΠΏΠΎΠ².

РСальная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ use для Π²Ρ‹Π±ΠΎΡ€ΠΎΡ‡Π½ΠΎΠ³ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° ΠΈΠ»ΠΈ пСрСимСнования макросов. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ящика Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ ΠΈΠΌΠ΅Π½ макросов. Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя я Π±Ρ‹ Π½Π΅ ΠΎΠΆΠΈΠ΄Π°Π», Ρ‡Ρ‚ΠΎ простой ΠΈΠΌΠΏΠΎΡ€Ρ‚ ящика ProcMacro столкнСтся с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… макросов - я Π΄ΡƒΠΌΠ°Π», Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ макросы Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с derive_ ?

НаличиС пространств ΠΈΠΌΠ΅Π½ связано со ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ, ΠΈ я ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ Ρ‡Π΅ΠΌ ΠΈΡ… мСньшС, Ρ‚Π΅ΠΌ Π»ΡƒΡ‡ΡˆΠ΅, поэтому вопрос Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Π·Π°Ρ‡Π΅ΠΌ Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ Ρ€Π°Π·Π½Ρ‹Π΅ пространства ΠΈΠΌΠ΅Π½?

Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ элСмСнты Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ пространство ΠΈΠΌΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½Ρ‹ΠΌΠΈ Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ. consts ΠΈ fns находятся Π² ΠΎΠ΄Π½ΠΎΠΌ пространствС ΠΈΠΌΠ΅Π½, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΎΠ±Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Π² контСкстС выраТСния. Π’ΠΈΠΏΡ‹ ΠΈ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΈ находятся Π² ΠΎΠ΄Π½ΠΎΠΌ пространствС ΠΈΠΌΠ΅Π½ ΠΈΠ·-Π·Π° синтаксиса для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠ².

ВсС эти Ρ‚Ρ€ΠΈ Π²ΠΈΠ΄Π° макросов Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ способами. Для мСня Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ смысла Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ пространство ΠΈΠΌΠ΅Π½, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ двусмыслСнности.

Π₯отя Π΅ΡΡ‚ΡŒ Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Π½Π° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, я Π½Π΅ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ _use_ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π·Π°Ρ‚Ρ€Π°Ρ‚Π°ΠΌΠΈ Π·Π° счСт раздСлСния ΠΈΡ… ΠΈΠΌΠ΅Π½. Когда я Π΄ΡƒΠΌΠ°ΡŽ ΠΎ стоимости слоТности языковой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, я ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π΄ΡƒΠΌΠ°ΡŽ ΠΎ слоТности использования.


Π’Ρ‹ Π±Ρ‹ сказали, Ρ‡Ρ‚ΠΎ _всС_ элСмСнты Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ пространствС ΠΈΠΌΠ΅Π½, Ссли Π±Ρ‹ это Π½Π΅ Π±Ρ‹Π»ΠΎ критичСским ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ? ΠŸΡ‹Ρ‚Π°ΡŽΡΡŒ ΠΏΡ€ΠΎΡΡΠ½ΠΈΡ‚ΡŒ свой ΠΌΡ‹ΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ процСсс.

Если ΠΏΠΎΡ€Π°Π·ΠΌΡ‹ΡΠ»ΠΈΡ‚ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅, я Π±Ρ‹ согласился ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ пространство ΠΈΠΌΠ΅Π½, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ находятся всС элСмСнты - я Π΄Π°ΠΆΠ΅ Π²Ρ€ΠΎΠ΄Π΅ ΠΊΠ°ΠΊ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ Π΅Π³ΠΎ; вСсь шаблон «настоящиС конструкторы» Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ сбиваСт с Ρ‚ΠΎΠ»ΠΊΡƒ ИМО - Π½ΠΎ это Π½Π΅ Ρ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Rust принял для Π½Π΅ΠΌΠ°ΠΊΡ€ΠΎΡΡŠΠ΅ΠΌΠΎΡ‡Π½Ρ‹Ρ… элСмСнтов, поэтому ΠΌΠ½Π΅ каТСтся, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π±ΠΎΠ»Π΅Π΅ согласованным ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠ°ΠΊΡ€ΠΎ-элСмСнты Π·Π°Π½ΠΈΠΌΠ°Π»ΠΈ Ρ€Π°Π·Π½Ρ‹Π΅ пространства ΠΈΠΌΠ΅Π½.

Настоящая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ use для Π²Ρ‹Π±ΠΎΡ€ΠΎΡ‡Π½ΠΎΠ³ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° ΠΈΠ»ΠΈ пСрСимСнования макросов.

Π’Ρ‹ смоТСтС ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ макросов 2.0. МодСль здСсь Π² основном врСмСнная.

Π― Π΄ΡƒΠΌΠ°Π», Ρ‡Ρ‚ΠΎ макрос derive начинаСтся с derive_?

Π­Ρ‚ΠΎ Π±Ρ‹Π»Π° старая систСма кастомного Π²Ρ‹Π²ΠΎΠ΄Π°, я Π½Π΅ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ макрос 1.1 Π΄Π΅Π»Π°Π΅Ρ‚ это.

Π₯отя Π΅ΡΡ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ слоТности Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, я Π½Π΅ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ Π² слоТности использования.

Π—Π° Π½Π΅ΠΊΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ использования приходится ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ - Π² частности, это услоТняСт Тизнь инструмСнтам (хотя ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ сильно ΡΠΏΠΎΡ€ΠΈΡ‚ΡŒ). Π― Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΆΠ½Π° Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ (хотя пространства ΠΈΠΌΠ΅Π½ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ ΡƒΡΠ»ΠΎΠΆΠ½ΡΡŽΡ‚ компилятор, я согласСн, Ρ‡Ρ‚ΠΎ это Π½Π΅ Ρ‚Π°ΠΊ Π²Π°ΠΆΠ½ΠΎ), сколько языковая ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ - ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°ΡΡΡƒΠΆΠ΄Π°Ρ‚ΡŒ ΠΎΠ± этом, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Rust, ΠΈ это ΠΈΠΌΠ΅Π΅Ρ‚ большоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. влияниС Π½Π° Ρ‚Π°ΠΊΠΈΠ΅ Π²Π΅Ρ‰ΠΈ, ΠΊΠ°ΠΊ Π³ΠΈΠ³ΠΈΠ΅Π½Π° ΠΈ Π·Π°Ρ‚Π΅Π½Π΅Π½ΠΈΠ΅, Π΅Ρ‰Π΅ большС услоТняя ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ.

Π’Ρ‹ Π±Ρ‹ сказали, Ρ‡Ρ‚ΠΎ всС элСмСнты Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ пространствС ΠΈΠΌΠ΅Π½, Ссли Π±Ρ‹ это Π½Π΅ Π±Ρ‹Π»ΠΎ критичСским ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ? ΠŸΡ‹Ρ‚Π°ΡŽΡΡŒ ΠΏΡ€ΠΎΡΡΠ½ΠΈΡ‚ΡŒ свой ΠΌΡ‹ΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ процСсс.

Π― Π±Ρ‹ Π½Π΅ стал Π·Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅ΠΊΠΎ - я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ прСимущСства раздСлСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ Ρ‚ΠΈΠΏΠΎΠ², Π½ΠΎ, бСзусловно, язык с Π΅Π΄ΠΈΠ½Ρ‹ΠΌ пространством ΠΈΠΌΠ΅Π½ Π±Ρ‹Π» Π±Ρ‹ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ приятнСС Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡΡ….

Π½ΠΎ это Π½Π΅ Ρ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Rust принял для Π½Π΅ΠΌΠ°ΠΊΡ€ΠΎ-элСмСнтов

ΠšΠΎΠ½Ρ‚Ρ€Π°ΠΏΡƒΠ½ΠΊΡ‚: ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΈ поля находятся Π² пространствС ΠΈΠΌΠ΅Π½ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, хотя мСста, Π³Π΄Π΅ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, (я Π΄ΡƒΠΌΠ°ΡŽ) ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ мСст, Π³Π΄Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ значСния.

@keeperofdakeys

РСальная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ use для Π²Ρ‹Π±ΠΎΡ€ΠΎΡ‡Π½ΠΎΠ³ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° ΠΈΠ»ΠΈ пСрСимСнования макросов.

Π‘ΠΊΠΎΡ€ΠΎ ΠΌΡ‹ смоТСм ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ макросы use ΠΈΠ· extern crate s Π·Π° Π²ΠΎΡ€ΠΎΡ‚Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (~ 1 нСдСля), cf https://github.com/rust-lang/rfcs/pull/1561 ΠΈ β„–35896. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΡΡ‚Π°Π±ΠΈΠ»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ макросы use ing ΠΈΠ· ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ящиков ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… вмСстС с собствСнными ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌΠΈ.

Π― Π΄ΡƒΠΌΠ°Π», Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ макросы Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с derive_

Π­Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π²Π΅Ρ€Π½ΠΎ для старых ΠΎΠ±Ρ‹Ρ‡Π°Π΅Π². Π’ макросах 1.1 с настраиваСмыми ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌΠΈ макросами #[derive(Serialize)] (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€) ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Serialize Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡΡ Π² макрос настраиваСмых ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ….

@withoutboats

Π’ Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° использования Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ пространства ΠΈΠΌΠ΅Π½ для всСх Ρ‚Ρ€Π΅Ρ… Β«Π²ΠΈΠ΄ΠΎΠ²Β» макросов?

  • ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚: макросы bang ΠΈ макросы Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π΄ΠΎΠ»Π³ΠΎΠ΅ врСмя совмСстно использовали пространство ΠΈΠΌΠ΅Π½, поэтому Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° это Π½Π΅ измСнится, я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ это пространство ΠΈΠΌΠ΅Π½.
  • ΠžΠ±Ρ€Π°Ρ‚Π½Π°Ρ ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ: Ссли ΠΌΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ с ΠΎΠ΄Π½ΠΎΠ³ΠΎ пространства ΠΈΠΌΠ΅Π½ макроса, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ совмСстимо. Если ΠΌΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ с Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… пространств ΠΈΠΌΠ΅Π½ макросов, ΠΌΡ‹ застрянСм с Π½ΠΈΠΌΠΈ навсСгда.
  • ΠŸΡ€ΠΎΡΡ‚ΠΎΡ‚Π°: Ссли Π±Ρ‹ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Β«Π²ΠΈΠ΄Π°Β» макроса Π±Ρ‹Π»ΠΎ своС собствСнноС пространство ΠΈΠΌΠ΅Π½, Ρƒ нас Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΡΡ‚ΡŒ пространств ΠΈΠΌΠ΅Π½. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ https://github.com/rust-lang/rfcs/pull/1561 призСмлится, use foo::bar; ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ _ΠΏΡΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… элСмСнтов_ с ΠΈΠΌΠ΅Π½Π΅ΠΌ bar (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚ΠΈΠΏ, макрос Π²Π·Ρ€Ρ‹Π²Π° ΠΈ Ρ‚. Π΄.), ΠΈ Π½Π΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ простого способа, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ макрос bang, Π½ΠΎ Π½Π΅ макрос ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ извлСчСния, ΠΈΠ»ΠΈ просто ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ макрос ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ извлСчСния ΠΊΠ°ΠΊ baz .

ΠžΠ±Ρ€Π°Ρ‚Π½Π°Ρ ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ: Ссли ΠΌΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ с ΠΎΠ΄Π½ΠΎΠ³ΠΎ пространства ΠΈΠΌΠ΅Π½ макроса, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ совмСстимо. Если ΠΌΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ с Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… пространств ΠΈΠΌΠ΅Π½ макросов, ΠΌΡ‹ застрянСм с Π½ΠΈΠΌΠΈ навсСгда.

Π­Ρ‚ΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, особСнно с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ 1.1 Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ срСдством. : +1:

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ прСрывания ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для Ρ‚Π΅Ρ…, Ρƒ ΠΊΠΎΠ³ΠΎ Π±Ρ‹Π» макрос macro_rules с ΠΈΠΌΠ΅Π½Π΅ΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, PartialEq! ?

НСт, PartialEq сСгодня Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² пространствС ΠΈΠΌΠ΅Π½ макросов, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это Π½Π΅ настраиваСмая производная.
#[derive(Foo)] сначала провСряСт, являСтся Π»ΠΈ Foo «встроСнной ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΉΒ» ( PartialEq , Copy ΠΈ Ρ‚. Π”.), ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Π΅ΠΌΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡƒΡŽ Foo Π² пространствС ΠΈΠΌΠ΅Π½ макроса. ВстроСнныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ТСстко прописаны Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ derive .

ΠŸΡ€ΠΈ этом ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΡΠ»ΠΎΠΌΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠ°ΠΊ Π²Ρ‹ описали, Ссли Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ Ρ€Π΅ΡˆΠΈΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ PartialEq настраиваСмым ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌ Π² ΠΏΡ€Π΅Π»ΡŽΠ΄ΠΈΠΈ вмСсто встроСнного, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΈΠ΄Π΅Π΅ΠΉ для Π±ΡƒΠ΄ΡƒΡ‰Π΅Π³ΠΎ Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π° этого сСйчас.

ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² (ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ Π½Π°Π΄ модСлью, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ макросы извлСчСния Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ элСмСнты, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠΊΡ€Π°ΡˆΠ°Ρ‚ΡŒ):

  • Π—Π° кулисами макросы ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ извлСчСния Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ Ρ‚Ρ€Π΅ΠΉΡ‚, Π² настоящСС врСмя MultiItemModifier . ΠŸΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ макросы 2.0 Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Ρ‚Ρƒ, ΠΈ эта Ρ‡Π΅Ρ€Ρ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°. Аннотированная функция, которая являСтся макросом, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ эту Ρ‡Π΅Ρ€Ρ‚Ρƒ. Π₯отя ΠΌΡ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ рСгистратор ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ², это, ΠΏΠΎ сути, ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ сахара.
  • ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‚Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Ρ‚Ρƒ CustomDerive ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для макроса 1.1, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС Π°Π²Ρ‚ΠΎΡ€Ρ‹ макросов Π½ΠΈΠΊΠΎΠ³Π΄Π° этого Π½Π΅ видят. Но Ρƒ Π½ΠΈΡ… Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Π° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (я оТидаю, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Π² impl, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±ΡΡƒΠ΄ΠΈΡ‚ΡŒ этот ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ рСгистрации).
  • ΠΌΡ‹ добавляСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ declare_attributes ΠΊ CustomDerive которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Vec<String> . По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠ½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ пустой vec.
  • Если Π°Π²Ρ‚ΠΎΡ€Ρ‹ макроса Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ этот ΠΌΠ΅Ρ‚ΠΎΠ΄, Ρ‚ΠΎ Π»ΡŽΠ±Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, Π½Π°Π·Π²Π°Π½Π½Ρ‹Π΅ Π² точности ΠΊΠ°ΠΊ ΠΎΠ΄Π½Π° ΠΈΠ· Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… строк, ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠΌΠΈ макросу. Π›ΡŽΠ±ΠΎΠΉ Ρ‚Π°ΠΊΠΎΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ рассматриваСтся ΠΊΠ°ΠΊ макрос ΠΈ Π½Π΅ запускаСт настраиваСмый Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ lint. Атрибуты оставлСны Π² ΠΊΠΎΠ΄Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ…, Π½ΠΎ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅. Π›ΡŽΠ±ΠΎΠΉ Ρ‚Π°ΠΊΠΎΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ затрагиваСтся Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, всС Ρ€Π°Π²Π½ΠΎ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ lint (Π½ΠΎ Π½Π΅ настраиваСмый Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ lint).
  • Π’ Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ввСсти Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ с Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ макросы, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ настраиваСмыС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅, ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ _ Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅_ ΠΊ declare_attributes ΠΈ этот ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌ.
  • ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π°: строки, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ declare_attributes , ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ прСфикс ΠΏΡƒΡ‚ΠΈ для Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ссли declare_attributes Π²Π΅Ρ€Π½ΡƒΠ» vec!["foo::bar"] , Ρ‚ΠΎ #[foo::bar::baz] ΠΈ #[foo::bar::qux] Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ.

ΠœΡ‹ΡΠ»ΠΈ? Копия @alexcrichton @jseyfried @dtolnay @sgrif @erickt @ rust-lang / lang

@nrc, ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π»ΠΈ этот ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ _used_, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ #[cfg(..)] - случайно ΠΈΠ»ΠΈ Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ? И ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ это ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ?

@nrc, ΠΊ соТалСнию, я Π½Π΅ совсСм понимаю, ΠΊΠ°ΠΊ рСализация Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ этих ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ, поэтому я Π½Π΅ совсСм ΡƒΠ²Π΅Ρ€Π΅Π½, сработаСт ΠΎΠ½Π° ΠΈΠ»ΠΈ Π½Π΅Ρ‚.

ΠŸΡ€ΠΈ этом я нСсколько скСптичСски ΠΎΡ‚Π½ΠΎΡˆΡƒΡΡŒ ΠΊ Ρ‚ΠΎΠΌΡƒ, Π±ΡƒΠ΄ΡƒΡ‚ Π»ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Ρ‚Ρ‹ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‡Π΅Ρ€Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π³Π΄Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ экзСмпляры создаваСмых Ρ‡Π΅Ρ€Ρ‚?

@nrc ΠŸΠΎΡ‡Π΅ΠΌΡƒ это Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ просто списком Π² Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π΅, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΉ? НапримСр, #[proc_macro_derive(Serialize, uses_attrs(serde_foo, serde_bar))] ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅.

@ colin-kiegel Π― ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡŽ, Ρ‡Ρ‚ΠΎ это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ прилоТСния, ΠΈ Π² этом случаС ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², вСроятно, являСтся ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ, хотя я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ cfgs Π΄ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ макроса (это измСнилось, Π½ΠΎ я Π½Π΅ ΠΌΠΎΠ³Ρƒ Π²ΡΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ Π΄ΠΎ ΠΈ послС).

@alexcrichton

ΠŸΡ€ΠΈ этом я нСсколько скСптичСски ΠΎΡ‚Π½ΠΎΡˆΡƒΡΡŒ ΠΊ Ρ‚ΠΎΠΌΡƒ, Π±ΡƒΠ΄ΡƒΡ‚ Π»ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Ρ‚Ρ‹ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‡Π΅Ρ€Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π³Π΄Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ экзСмпляры создаваСмых Ρ‡Π΅Ρ€Ρ‚?

Π₯ΠΌ, Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, полагаю, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ для макросов 2.0.

@eddyb Π­Ρ‚ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ идСя, ΠΈ Π΅Π΅, вСроятно, ΠΏΡ€ΠΎΡ‰Π΅ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ Π² краткосрочной пСрспСктивС. Моя ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ я ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ это ΠΎΠ±Ρ‰ΠΈΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΠΎΡΡ‚ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Π΅Ρ‰Π΅ΠΉ Π² Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Π½Π΅ слишком Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ, ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, это Π½Π΅ Ρ‚ΠΎ, с Ρ‡Π΅ΠΌ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π·Π°ΡΡ‚Ρ€ΡΡ‚ΡŒ навсСгда . Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, сСйчас это, бСзусловно, Π»Π΅Π³Ρ‡Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, ΠΈ это Π½Π΅ каТСтся ΠΏΠ»ΠΎΡ…ΠΈΠΌ занятиСм, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ это Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅.

ПопаданиС Π² Π»ΠΎΠ²ΡƒΡˆΠΊΡƒ - я Π±Ρ‹Π» Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ страны, Π° ΠΏΠΎΡ‚ΠΎΠΌ Π·Π°Π±ΠΎΠ»Π΅Π». Π― Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ https://github.com/rust-lang/rust/pull/37198 , Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π΅ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ для всСх Π²ΠΈΠ΄ΠΎΠ² макросов Π΅ΡΡ‚ΡŒ смысл Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ пространство ΠΈΠΌΠ΅Π½. Π― Π±Ρ‹ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ ΠΎΠΆΠΈΠ΄Π°Π», Ρ‡Ρ‚ΠΎ макросы ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ извлСчСния Π±ΡƒΠ΄ΡƒΡ‚ Π² этом пространствС ΠΈΠΌΠ΅Π½ ΠΊΠ°ΠΊ derive_Foo ΠΈΠ»ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ использования Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² макросов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ имя Π΄Π°ΠΆΠ΅ Π² стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, #[cfg] ΠΈ cfg! ).

Π― Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Ρ…ΠΎΠΆΡƒ ΠΎΠ±Ρ‰Π΅Π΅ пространство ΠΈΠΌΠ΅Π½ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ. Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ происходит какая-Ρ‚ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ·Π°ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ, Π΄Π²ΡƒΡΠΌΡ‹ΡΠ»Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ интСрСсноС, Ρ‡Π΅Π³ΠΎ Π½Π΅Ρ‚. Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ «случайныС» ограничСния ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΡΠ»ΠΎΠΆΠ½ΠΈΡ‚ΡŒ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Rust ΠΊΠ°ΠΊ языка.

Однако я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ это, вСроятно, Π½Π΅ ΠΊΠΎΠ½Π΅Ρ† свСта. ΠŸΠΎΡ…ΠΎΠΆΠ΅, Ρ‡Ρ‚ΠΎ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Π²Π΅Π΄Π΅Π½Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ пространства ΠΈΠΌΠ΅Π½ Π±Π΅Π· особых ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

@sgrif @ https://github.com/rust-lang/rust/issues/35900#issuecomment -256247659.

Π― Π½Π΅ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ для всСх Π²ΠΈΠ΄ΠΎΠ² макросов Π΅ΡΡ‚ΡŒ смысл Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ пространство ΠΈΠΌΠ΅Π½.

Π§Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»ΠΎ ясно, макросы Bang ΠΈ макросы Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² всСгда Π·Π°Π½ΠΈΠΌΠ°Π»ΠΈ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ пространство ΠΈΠΌΠ΅Π½; # 37198 Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ наслСдуСтся Π² этом пространствС ΠΈΠΌΠ΅Π½.

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ использования Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² макросов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ имя Π΄Π°ΠΆΠ΅ Π² стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, #[cfg] ΠΈ cfg! )

Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ cfg ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ макрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° bang ΠΈΠ»ΠΈ Π²Ρ‹Π·ΠΎΠ²Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° (хотя сСгодня ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ макрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° ΠΈΠ»ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ это Π² макросах 2.0).

Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ сущСствуСт какая-Ρ‚ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ·Π°ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ.

Π― Π΄ΡƒΠΌΠ°ΡŽ, это ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‡Π΅Ρ‚ΠΊΠΈΡ… сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… ΠΏΡ€ΠΈ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π΅ Π΄Π²ΡƒΡ… макросов (я Π±ΡƒΠ΄Ρƒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π°Π΄ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΡΠ΅Π³ΠΎΠ΄Π½ΡΡˆΠ½ΠΈΡ… сообщСний).

ΠŸΠΎΡ…ΠΎΠΆΠ΅, Ρ‡Ρ‚ΠΎ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Π²Π΅Π΄Π΅Π½Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ пространства ΠΈΠΌΠ΅Π½, Π½Π΅ сильно Π½Π°Ρ€ΡƒΡˆΠ°Ρ

Π― ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ пространства ΠΈΠΌΠ΅Π½ макросов ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ совмСстимо (ΠΏΠΎΠΏΡ€Π°Π²ΡŒΡ‚Π΅ мСня, Ссли я ошибаюсь). Π­Ρ‚ΠΎ моя основная мотивация для сохранСния Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ пространства ΠΈΠΌΠ΅Π½ макросов сСгодня - ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ макросы 1.1 Π±Ρ‹Π»ΠΈ максимально совмСстимы Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ.

НаконСц, я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ макросов Bang / attribute ΠΈ настраиваСмых ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… макросов Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π΅Π΄ΠΊΠΈΠΌΠΈ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ макросы Bang / attribute ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠΈΡˆΡƒΡ‚ΡΡ Π² Π½ΠΈΠΆΠ½Π΅ΠΌ рСгистрС, Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ - Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ рСгистрС. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΏΡ€ΠΈ соблюдСнии этих соглашСний ΠΎΠ± ΠΈΠΌΠ΅Π½Π°Ρ… Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ собствСнноС пространство ΠΈΠΌΠ΅Π½.

ΠŸΠΎΡ…ΠΎΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΠΎΠΌΠΊΠ° (https://github.com/diesel-rs/diesel/issues/485) Π²Ρ‹Π·Π²Π°Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Queryable! { struct S; } Π° Ρ‚Π°ΠΊΠΆΠ΅ #[derive(Queryable)] struct S; . Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ станут ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΌΠΈ, ΠΎΡ‚ΠΏΠ°Π΄Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅ Queryable! { struct S; } Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ это большС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, Π²Π΅Ρ€Π½ΠΎ?

А ΠΏΠΎΠΊΠ° я ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ diesel Ρ‡Ρ‚ΠΎΠ±Ρ‹

  • Queryable! ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ поддСрТиваСтся Π±Π΅Π· #[macro_use] extern crate diesel_codegen; ΠΈ
  • #[derive(Queryable)] , Π½ΠΎ Π½Π΅ Queryable! , поддСрТиваСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ #[macro_use] extern crate diesel_codegen; .

НС ΡΡ‚Π΅ΡΠ½ΡΠΉΡ‚Π΅ΡΡŒ ΠΏΠΈΠ½Π³ΠΎΠ²Π°Ρ‚ΡŒ мСня Π² IRC, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΡΡƒΠ΄ΠΈΡ‚ΡŒ - я Π±ΡƒΠ΄Ρƒ Ρ€Π°Π΄ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠΈΠ°Ρ€.

@nrc @alexcrichton

ΠŸΡ€ΠΈ этом я нСсколько скСптичСски ΠΎΡ‚Π½ΠΎΡˆΡƒΡΡŒ ΠΊ Ρ‚ΠΎΠΌΡƒ, Π±ΡƒΠ΄ΡƒΡ‚ Π»ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Ρ‚Ρ‹ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‡Π΅Ρ€Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π³Π΄Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ экзСмпляры создаваСмых Ρ‡Π΅Ρ€Ρ‚?

Π― согласСн с @eddyb Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ссли всС, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, - это ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, Π² интСрСсах удобства ΠΈ цСлСсообразности ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ просто Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹.

Но Ссли Π±Ρ‹ ΠΌΡ‹ _did_ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΡƒΡŽ систСму Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ, я ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π», Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Ρ‚Ρ‹ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π°, Π½ΠΎ эти Ρ‡Π΅Ρ€Ρ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΊΠ°ΠΊ Π½Π°Π±ΠΎΡ€ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ относятся ΠΊ Self :

trait CustomDerive {
     fn foo(); // note: no self
     fn bar(); // again, no self
}

Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ Π±Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ Π΅Π³ΠΎ Π½Π° Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ Ρ‚ΠΈΠΏΠ΅, Ρ‚Π°ΠΊΠΎΠΌ ΠΊΠ°ΠΊ struct my_annotation_type; (с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚, я Π΄ΡƒΠΌΠ°ΡŽ?), И ΠΌΡ‹ использовали Π±Ρ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠ° для извлСчСния ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ <my_annotation as CustomDerive>::foo (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡ€ΠΈ записи ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅). Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ создадим (ΠΈΠ»ΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π½ΡƒΠΆΠ΄Π°Ρ‚ΡŒΡΡ) Π² экзСмплярС my_annotation , это просто ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²ΠΊΠΈ для объСдинСния Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… связанных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, это Π½Π΅ самая элСгантная Π²Π΅Ρ‰ΡŒ, Π½ΠΎ я Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅? Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈΠ·-Π·Π° нСэлСгантности ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π½Π°Ρ‡Π°Ρ‚ΡŒ с приписываСмых Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π·Π½Π°ΠΊ Ρ€Π°Π²Π½ΠΎ

Π§Ρ‚ΠΎ касаСтся пространств ΠΈΠΌΠ΅Π½, @sgrif прСдставляСт собой Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ #[cfg] ΠΈ cfg! . Π―, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΌΠΎΠ³Ρƒ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ #[derive(SomeTrait)] Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ макрос, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ SomeTrait! { ... } ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ... Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚. =) Но @jseyfried Ρ‚Π°ΠΊΠΆΠ΅ являСтся Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Π² ΠΏΠΎΠ»ΡŒΠ·Ρƒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ совмСстимости - ΠΏΠΎΠΊΠ° ΠΌΡ‹ Π½Π΅ сталкиваСмся с ограничСниями _already_.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ я ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ мСньшСС количСство пространств ΠΈΠΌΠ΅Π½, Π² основном ΠΈΠ·-Π·Π° Π±ΠΎΠ»ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ, ΠΊΠ°ΠΊ ΠΌΠ½Π΅ каТСтся, приносит Π½Π°ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ пространства ΠΈΠΌΠ΅Π½ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ / Ρ‚ΠΈΠΏ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ извСстных Π±ΠΎΠ»Π΅Π²Ρ‹Ρ… Ρ‚ΠΎΡ‡Π΅ΠΊ здСсь Π½Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹:

  • Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° / значСния являСтся ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ ΠΈΠΌΠ΅Π½, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ use foo::bar ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ Π½Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ с ΠΈΠΌΠ΅Π½Π΅ΠΌ bar ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚ (ΠΈΠ»ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚) ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ΠΊ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ ΠΈΠΌΠ΅Π½, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ bar::baz ;
  • Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° / значСния - это своСго Ρ€ΠΎΠ΄Π° боль для Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ² ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с константами, хотя эта боль Ρ‚Π°ΠΊΠΆΠ΅ связана с синтаксичСским Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ΠΈ значСниями.

Но Π² Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ стСпСни, с Ρ‚Π΅Ρ… ΠΏΠΎΡ€ ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΡˆΠ»ΠΈ мост, я Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Β«custom deriveΒ», ΠΆΠΈΠ²ΡƒΡ‰Π΅Π³ΠΎ Π² собствСнном пространствС ΠΈΠΌΠ΅Π½, создаСт ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ особыС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Π½Π΅ Ρ‚Π°ΠΊ Π»ΠΈ?

ΠœΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ прСфикс derive_ ΠΊ сгСнСрированным макросам, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΡ… псСвдо-пространством ΠΈΠΌΠ΅Π½. Если Π±Ρ‹ ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ внСсти это ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅, сСйчас самоС врСмя.

@keeperofdakeys Π Π°Π·Π²Π΅ это Π½Π΅ эквивалСнтно Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π°Π²Ρ‚ΠΎΡ€Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… Ρ€Π΅ΡˆΠ°ΡŽΡ‚ Π½Π°Π·Π²Π°Ρ‚ΡŒ свои ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ derive_* ? Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, я ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π° derive_* слишком ΡƒΡ€ΠΎΠ΄Π»ΠΈΠ²Ρ‹ для ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

@nikomatsakis

Но Π² Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ стСпСни, с Ρ‚Π΅Ρ… ΠΏΠΎΡ€ ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΡˆΠ»ΠΈ мост, я Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Β«custom deriveΒ», ΠΆΠΈΠ²ΡƒΡ‰Π΅Π³ΠΎ Π² собствСнном пространствС ΠΈΠΌΠ΅Π½, создаСт ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ особыС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Π½Π΅ Ρ‚Π°ΠΊ Π»ΠΈ?

Алгоритм Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ пространств ΠΈΠΌΠ΅Π½, Π½ΠΎ ΠΎΠ½ выполняСт ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ объСм Ρ€Π°Π±ΠΎΡ‚Ρ‹ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ пространства ΠΈΠΌΠ΅Π½. Π’ частности, для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° I ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ пространства ΠΈΠΌΠ΅Π½ S это Π΄ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ I Π½Π΅ выполняСтся Π² S (cf https: // github. com / rust-lang / rfcs / pull / 1560 # issuecomment-209119266). Π­Ρ‚ΠΎ Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ часто Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ DFS Π³Ρ€Π°Ρ„Π° ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° глобуса (Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ модулями, Π° Ρ€Π΅Π±Ρ€Π° - ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°ΠΌΠΈ глобусов) для поиска ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°.

Однако эта Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ€Π°Π±ΠΎΡ‚Π° с пространством ΠΈΠΌΠ΅Π½ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ значСния Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅, ΠΈ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈ нСобходимости (см. Https://github.com/rust-lang/rfcs/pull/1560#issuecomment-209119266) Π·Π° счСт Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ пространствам ΠΈΠΌΠ΅Π½ макросов.

Π― объСдинил пространства ΠΈΠΌΠ΅Π½ Π² # 37198, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² основном ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ наши Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ ΠΈ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ я Π½Π΅ Π΄ΡƒΠΌΠ°Π», Ρ‡Ρ‚ΠΎ это Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅. Если люди хотят этого сСгодня, ΠΈ @ rust-lang / lang Π½Π΅ ΠΏΡ€ΠΎΡ‚ΠΈΠ² ΠΈΠΌΠ΅Ρ‚ΡŒ нСсколько пространств ΠΈΠΌΠ΅Π½ макросов навсСгда, Ρƒ мСня Π½Π΅Ρ‚ Π²ΠΎΠ·Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

@nikomatsakis

Π”ΡƒΠΌΠ°ΡŽ, ваша стратСгия сработаСт, хотя ΠΈ Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½ΠΎ. Π›ΠΈΡ‡Π½ΠΎ я ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ ΡΡ‚Ρ€Π°Π½Π½ΠΎΡΡ‚ΡŒ Π½Π΅ ΠΈΠ³Ρ€Π°Π΅Ρ‚ своСй Ρ€ΠΎΠ»ΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ сСгодня, мСня устраиваСт), Π½ΠΎ ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π² любом случаС.

@alexcrichton, ΠΊΠ°ΠΊ я, каТСтся, писал Ρ€Π°Π½ΡŒΡˆΠ΅, я Ρ€Π°Π΄ ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° Π½Π°ΠΌ понадобится большС мощности (Ссли ΠΊΠΎΠ³Π΄Π°-Π»ΠΈΠ±ΠΎ) - ΠΈ Ρ‚ΠΎΠ³Π΄Π° ΠΌΡ‹ смоТСм ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ Ρ‡Π΅Ρ€Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ я описал, ΠΈΠ»ΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΡˆΠ΅. На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ достаточно Π±Ρ‹Π»ΠΎ Π±Ρ‹ просто Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, примСняСмыС ΠΊ fn .

МнС стало Π»ΡŽΠ±ΠΎΠΏΡ‹Ρ‚Π½ΠΎ, ΠΈ я Π½Π°Ρ‡Π°Π» Π±Π°Π·ΠΎΠ²ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ этой ΠΈΠ΄Π΅ΠΈ (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ proc_macro для обозначСния ΠΈΠΌΠ΅Π½ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² элСмСнтС).

Π― ΡƒΠ΄Π°Π»ΠΈΠ» Ρ‚Π΅Π³ FCP, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ каТСтся ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΅Ρ‰Π΅ _quite_ Π½Π΅ достигли Ρ‚ΠΎΡ‡ΠΊΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊ стабилизации. Π― ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡΡŒ ΠΏΠΎΠ΄Ρ‹Ρ‚ΠΎΠΆΠΈΡ‚ΡŒ состояниС Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€Π° ΠΈ, Π² частности, Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ошибки, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π°ΠΌ всС Π΅Ρ‰Π΅ Π½ΡƒΠΆΠ½Ρ‹ Ρ‚Π²Π΅Ρ€Π΄Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈ / ΠΈΠ»ΠΈ дополнСния ΠΊΠΎΠ΄Π°:

Вопрос 1. ΠœΠΎΠ³ΡƒΡ‚ Π»ΠΈ настраиваСмыС макросы ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ элСмСнт, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΎΠ½ΠΈ проходят?

  • Никто Π½Π΅ Π΄ΡƒΠΌΠ°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄Π΅Π»Π°Ρ‚ΡŒ это _ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅_, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ
  • Π­Ρ‚ΠΎ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Ρ€Π΅ΠΆΠΈΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π±Ρ‹Π» ΠΎΡ‚Π²Π΅Ρ€Π³Π½ΡƒΡ‚ Π² Π΄ΡƒΡ…Π΅ Π―Π“ΠΠ˜.
  • ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ Π½Π°Π±ΠΎΡ€ ΠΈΠΌΠ΅Π½ ΠΏΠΎΠ»Π΅ΠΉ ΠΈ Ρ‚. Π”., НС ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, дСлая Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ порядок прилоТСния;
    ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ этого смягчаСтся двумя Π²Π΅Ρ‰Π°ΠΌΠΈ:
  • Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ссли ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ custom derive Π½ΡƒΠΆΠ½ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΠΎΠ²Ρ‹Π΅ impls

    • информация ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ Π»ΡƒΡ‡ΡˆΠ΅

    • кастомныС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΏΡ€ΠΎΡ‰Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ

  • _Но_ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ настраиваСмыС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ настраиваСмыС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ для управлСния своим Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ, ΠΈ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ прСдупрСТдСния / ошибки.

    • ВСкущая Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΈΡ… ΠΈΠ· AST.

  • _Π’Π°ΠΊΠΆΠ΅: _ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π²Ρ‹ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ это Π² ΠΌΠΈΡ€ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ скорСС, Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ экспСримСнты ΠΈΠ»ΠΈ Ρ€Π°Π΄ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ измСнСния

ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ:

  • ΠžΡΡ‚Π°Π²ΡŒΡ‚Π΅ всС ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚Π΅ использованиС ΠΏΠΎΠ·ΠΆΠ΅

    • ЦСлСсообразно, нСсколько Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎ

  • Π Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ #[proc_macro] Π±Π΅Π»Ρ‹ΠΌ списком Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ rustc ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΡ… "ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ" ΠΈ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

    • ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ, ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ основной Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ использования

    • Но ΠΊΠΎΠΌΡƒ-Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ это Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ( ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, @keeperofdakeys! )

Вопрос 2: Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π»ΠΈ настраиваСмыС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎ ΠΆΠ΅ пространство ΠΈΠΌΠ΅Π½, Ρ‡Ρ‚ΠΎ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ макросы?

АргумСнт Π·Π°:

АргумСнт ΠΏΡ€ΠΎΡ‚ΠΈΠ²:

ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ:

  • Π Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π° пространство ΠΈΠΌΠ΅Π½ "custom derive"
  • БохраняйтС статус-ΠΊΠ²ΠΎ

Π”Ρ€ΡƒΠ³ΠΈΠ΅ Π²Π΅Ρ‰ΠΈ?

Π•ΡΡ‚ΡŒ Π»ΠΈ Π΅Ρ‰Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ вопросы?

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΌΡƒΡ‚Π°Ρ†ΠΈΠΈ:

ВмСсто ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… с Ρ‚ΠΈΠΏΠΎΠΌ TokenStream -> TokenStream , ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΈΠΏ
Item -> TokenStream , Π³Π΄Π΅ Item - Π½Π΅ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ всСго двумя ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ:

  • item.tokens() , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ TokenStream , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹ сСгодня, ΠΈ
  • item.use_attrs(name) , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΡ‚ всС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΉ TokenStream Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ impl s.
Π’ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ API Item с ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌΠΈ функциями (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ ΠΏΠΎ полям / Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°ΠΌ элСмСнта) ΠΈΠ»ΠΈ API получСния Π±ΠΎΠ»Π΅Π΅ высокого уровня, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ Ρ‚ΠΎΠΌΡƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТится Π² syntax_ext::deriving::generic .

Π― Π±Ρ‹Π» Π±Ρ‹ Ρ€Π°Π΄ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‰ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΈΠ· Π±Π΅Π»ΠΎΠ³ΠΎ списка Π² #[proc_macro_derive] (Ρ‚.Π΅. Π²Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ для вопроса 1 Π² https://github.com/rust-lang/rust/issues/35900#issuecomment-258315395) ΠΈΠ»ΠΈ ΠΌΠΎΠ΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Item -> TokenStream .

Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ошибкой ΡΡ‚Π°Π±ΠΈΠ»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ элСмСнт. Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ ΠΆΠ΅Ρ€Ρ‚Π²ΡƒΠ΅ΠΌ, допуская ΠΌΡƒΡ‚Π°Ρ†ΠΈΡŽ, ΡƒΠΆΠ΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ - Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ исправлСниСм # 37563 ΠΈ исправлСниСм # 36218.

Π― Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ Π²ΠΈΠΆΡƒ ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Π±Π΅Π»ΠΎΠ³ΠΎ списка, ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈ ΠΊΡ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ использования?

Π― Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½, Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ / ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ этот ΠΊΠΎΠ΄ компилировался:

#![feature(proc_macro)]

#[proc_macro_derive(Whatever)]
struct Foo {}

@eddyb Π― Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½, Π΅ΡΡ‚ΡŒ Π»ΠΈ Π½Π΅ΠΎΡ‚ΡŠΠ΅ΠΌΠ»Π΅ΠΌΠ°Ρ ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Π±Π΅Π»ΠΎΠ³ΠΎ списка - я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ прСимущСство
Item -> TokenStream Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ API Item , Ρ‡Π΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ большС Π²ΠΈΠ΄ΠΎΠ² Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ². ΠŸΡ€ΠΈ этом, Ссли ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎΠ± этом Π΅Ρ‰Π΅ Ρ€Π°Π·, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ Ρ‚Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² использования, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… трСбуСтся Item вмСсто TokenStream , поэтому TokenStream -> TokenStream с Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ Π±Π΅Π»Ρ‹ΠΌ списком ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΠ΅.

ЗамСнят Π»ΠΈ макросы 2.0 этот API? Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ особого бСспокойства, Π° Item -> TokenStream api Π½Π΅ каТСтся ΠΎΡ‡Π΅Π½ΡŒ ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ.

@keeperofdakeys Богласно RFC:

Π’ Ρ†Π΅Π»ΠΎΠΌ, это слСдуСт Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ постСпСнный шаг ΠΊ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ «макросам 2.0Β».

Π—Π°Π΄Π°Ρ‡Π° макроса 1.1 - максимально ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚ΡŒΡΡ ΠΊ макросу 2.0 ΠΏΠΎ Π΄ΡƒΡ…Ρƒ ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π½ΠΎ Π±Π΅Π· стабилизации ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ³ΠΎ количСства Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π’ этом смыслС Ρ†Π΅Π»ΡŒ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ макроса 1.1 ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π½Π°Π»ΠΎΠΆΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ совмСстимыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ макросу 2.0.

https://github.com/rust-lang/rfcs/pull/1681#issuecomment -233449053 ΠΈ https://github.com/rust-lang/rfcs/pull/1681#issuecomment -233708395 ΠΈ https: // github. com / rust-lang / rfcs / pull / 1681 # issuecomment -239558657, ΠΏΠΎΡ…ΠΎΠΆΠ΅, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ. Π’ частности: «шаблон Π΄Π΅Ρ€Π΅Π²Π° Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² с привязкой ΠΊ строкам стал Π±Ρ‹ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ, Ссли Π±Ρ‹ фактичСски Π½Π΅ стал ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌΒ».

@eddyb

Π― Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ Π²ΠΈΠΆΡƒ ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Π±Π΅Π»ΠΎΠ³ΠΎ списка, ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈ ΠΊΡ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ использования?

Π§Ρ‚ΠΎ ΠΆ, я ΠΌΠΎΠ³Ρƒ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ сСбС случай, ΠΊΠΎΠ³Π΄Π° ΠΈΠΌΠ΅Π½Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ динамичСски Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π° основС ΠΈΠΌΠ΅Π½ΠΈ Ρ‚ΠΈΠΏΠ° ΠΈΠ»ΠΈ ΠΏΠΎΠ»Π΅ΠΉ?) - ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΈΡ… нСльзя ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Π·Π°Ρ€Π°Π½Π΅Π΅. Π₯отя это каТСтся искусствСнным ΠΈ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠΉ.

Π― ΡΡ‡ΠΈΡ‚Π°ΡŽ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρƒ @jseyfried ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ - Π½Π΅ ΠΈΠ·-Π·Π° ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π° ΠΌΠ°Ρ€ΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ…, Π° ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ API Item со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ Π±ΠΎΠ³Π°Ρ‡Π΅. Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π°Π±ΠΎΡ€Π° ΠΏΠΎΠ»Π΅ΠΉ ΠΎΡ‡Π΅Π½ΡŒ структурированным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ доступ ΠΊ Π±ΠΎΠ»ΡŒΡˆΠ΅ΠΌΡƒ количСству Π΄Π°Π½Π½Ρ‹Ρ… (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΠΌ ΠΈΠΌΠ΅Π½), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π² нашСм распоряТСнии, ΠΈ Ρ‚. Π΄.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Ρ‡Π°ΡΡ‚ΡŒ этого Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ (_Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ²_) ΠΈΠ· Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹ стандартного API AST.

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ ΠΎ сроках: я ΠΎΡ‡Π΅Π½ΡŒ, ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ‡Ρƒ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΡΡ‚Π°Π±ΠΈΠ»ΠΈΠ·Π°Ρ†ΠΈΡŽ макроса 1.1 Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ†ΠΈΠΊΠ»Π΅. Π’ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚, каТСтся, Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ счСтС, довольно Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ.

Π’ этом Π΄ΡƒΡ…Π΅ ΠΌΠΎΠΉ взгляд Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я описал:

  1. Π― Π΄ΠΎΠ²ΠΎΠ»Π΅Π½ Π»ΠΈΠ±ΠΎ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ #[proc_macro] _, Π»ΠΈΠ±ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠ° Π½Π° Item . Π― Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΌΡ‹ Π½ΠΈ Π²Ρ‹Π±Ρ€Π°Π»ΠΈ, ΠΌΡ‹ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ, Ссли Π±Ρ‹ это казалось Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΈΠ΄Π΅Π΅ΠΉ. Π― ΠΊΠ°ΠΊ Π±Ρ‹ Ρ…ΠΎΡ‡Ρƒ ΠΏΠΎΠΉΡ‚ΠΈ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ. Π·Π½Π°ΠΊ Ρ€Π°Π²Π½ΠΎ
  2. Π§Ρ‚ΠΎ касаСтся Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… пространств ΠΈΠΌΠ΅Π½, я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠΊΠ° Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΈΡ… Π² ΠΎΠ΄Π½ΠΎΠΌ пространствС ΠΈΠΌΠ΅Π½. Для мСня сочСтаниС ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ совмСстимости (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, сохранСниС Π½Π°ΡˆΠΈΡ… возмоТностСй ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ) с Ρ‚Π΅ΠΌ Ρ„Π°ΠΊΡ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ использованиС Π·Π°Π³Π»Π°Π²Π½Ρ‹Ρ… Π±ΡƒΠΊΠ² ΡƒΠΆΠ΅ ΠΎΡ‚Π»ΠΈΡ‡Π°Π΅Ρ‚ макросы «настраиваСмого извлСчСния» ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅, являСтся ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ. ΠžΡ‚Π»ΠΈΡ‡ΠΈΠ΅ #[cfg] ΠΎΡ‚ cfg! каТСтся Ρ‡Π΅ΠΌ-Ρ‚ΠΎ, с Ρ‡Π΅ΠΌ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ способами, ΠΈΠ»ΠΈ, Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ввСсти Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ пространства ΠΈΠΌΠ΅Π½ _then_. НС ΠΏΠΎΡ…ΠΎΠΆΠ΅, Ρ‡Ρ‚ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ пространства ΠΈΠΌΠ΅Π½ Π²Ρ€Π΅Π΄ΠΈΡ‚, Π² частности, Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρƒ использования настраиваСмого наслСдования, ΠΈ это СдинствСнноС, ΠΎ Ρ‡Π΅ΠΌ ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π² любом случаС ΠΎ стабилизации. ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ?

@nikomatsakis, вашС Ρ€Π΅Π·ΡŽΠΌΠ΅ Π·Π²ΡƒΡ‡ΠΈΡ‚ Ρ‚ΠΎΡ‡Π½ΠΎ, спасибо, Ρ‡Ρ‚ΠΎ написали Π΅Π³ΠΎ! МнС Таль, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ макрос 1.1 Π² Rust 1.14, Π½ΠΎ я понимаю, Ρ‡Ρ‚ΠΎ это спорныС вопросы.

МоС Π»ΠΈΡ‡Π½ΠΎΠ΅ ΠΌΠ½Π΅Π½ΠΈΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΡ‚Π°Π±ΠΈΠ»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ΅ наслСдованиС Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΈ Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ пространство ΠΈΠΌΠ΅Π½.

Π― Π½Π΅ совсСм ΡΠ»Π΅Π΄ΡƒΡŽ Item -> TokenStream API, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ исходный элСмСнт ΠΈΠ»ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ ΠΈΠΌΠΏΠ»ΠΈΠΌΠ΅Π½Ρ‚Ρ‹? Π—Π½Π°Ρ‡ΠΈΡ‚ Π»ΠΈ это, Ρ‡Ρ‚ΠΎ потрСбуСтся &mut Item ?

@ est31 ваш ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ Π·Π²ΡƒΡ‡ΠΈΡ‚ ΠΊΠ°ΠΊ ошибка, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ для этого ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ вопрос?

Π― ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ согласСн с ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅ΠΌ

НС ΠΏΠΎΡ…ΠΎΠΆΠ΅, Ρ‡Ρ‚ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ пространства ΠΈΠΌΠ΅Π½ Π²Ρ€Π΅Π΄ΠΈΡ‚, Π² частности, Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρƒ использования настраиваСмого наслСдования, ΠΈ это СдинствСнноС, ΠΎ Ρ‡Π΅ΠΌ ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π² любом случаС ΠΎ стабилизации. ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ?

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ сломал дизСльноС Ρ‚ΠΎΠΏΠ»ΠΈΠ²ΠΎ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π² настоящСС врСмя Π΅ΡΡ‚ΡŒ макросы, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Queryable! ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΡŒ структуру, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ для Π½Π΅Π΅ Queryable .

Как Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прямо сСйчас Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΈ Π½Π΅ обслуТиваСт дизСльноС Ρ‚ΠΎΠΏΠ»ΠΈΠ²ΠΎ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΊ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π΅ влияСт Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ я ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡΡŒ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ: sweat_smile :), я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ всСго ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ 1 пространство ΠΈΠΌΠ΅Π½ Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, Π° для дизСля ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ эти макросы Π½Π° derive_Queryable! ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π² этом Ρ€ΠΎΠ΄Π΅. Они Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌΠΈ, ΠΊΠΎΠ³Π΄Π° это Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎ, Π²Π΅Ρ€Π½ΠΎ?

Π― создал PR https://github.com/rust-lang/rust/pull/37614 для ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Он ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ #[proc_macro_attributes(..)] , ΠΈ Π²Π°ΠΌ большС Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ элСмСнт Π² Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠΌ TokenStream .

Π― ΠΏΠΎΠ΄Π°Π» # 37637, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ макросы proc Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ $crate .

ΠŸΡ€ΠΎΡΡ‚ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ, считаСтся Π»ΠΈ этот Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ использования ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ ΠΈΠ»ΠΈ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ использованиСм систСмы:

Π― создаю Π½ΠΎΠ²Ρ‹Π΅ структуры Π½Π° основС ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ структуры ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² здСсь, ΠΈ ΠΌΠ½Π΅ ΠΎΡ‡Π΅Π½ΡŒ нравится Π΄ΠΈΠ·Π°ΠΉΠ½, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ позволяСт ΠΌΠ½Π΅ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ Π²Π΅Ρ‰ΠΈ Π² ΠΎΠ΄Π½Ρƒ структуру.

Однако, Ссли систСма ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ ΠΏΠΎΠ·ΠΆΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ β€‹β€‹Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, я ΠΌΠΎΠ³ Π±Ρ‹ просто ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ сСйчас, вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠ»Π°Π³Π°Ρ‚ΡŒ большС усилий (тСкущая рСализация - это всСго лишь быстроС ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ).

@TheNeikos

ОсновноС ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ нСсовмСстимоС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ большС Π½Π΅ смоТСтС ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ элСмСнт (Π²Ρ‹ Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚Π΅ Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² TokenStream). Π― Π±Ρ‹ сказал, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Ρ‡Π΅Π³ΠΎ-Π»ΠΈΠ±ΠΎ, ΠΊΡ€ΠΎΠΌΠ΅ ΠΈΠΌΠΏ, Π½Π΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΎ, Π½ΠΎ Π½ΠΈΡ‡Ρ‚ΠΎ Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Π²Π°ΠΌ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. Π’Π°ΠΌ просто Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ остороТным с ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π°ΠΌΠΈ ΠΈΠΌΠ΅Π½.

Π”Ρ€ΡƒΠ³ΠΎΠ΅ Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ - Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ список ΠΈΠΌΠ΅Π½ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ошибки настраиваСмых Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π² элСмСнтС.

RE: ΠšΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ пространств ΠΈΠΌΠ΅Π½ Π² Diesel. Π― Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½, ΠΎΡ‚ΠΊΠ°ΠΆΡƒΡΡŒ Π»ΠΈ я ΠΎΡ‚ этих макросов ΠΈΠ»ΠΈ Π½Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° эта функция станСт ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠΉ, это Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π΅ΡΡ‚ΡŒ Π»ΠΈ Ρƒ ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ Π΅Ρ‰Π΅ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ бСсплатныС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ компилятора. Π‘ΠΎΠΌΠ½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΎΠ½ всС Π΅Ρ‰Π΅ ΠΏΠΎΠ»Π΅Π·Π΅Π½ для Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ тСстирования, Π½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΠΏΠΎΠ»Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚.

Π― ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚Π΅Ρ€ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ - это прискорбно. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ элСмСнт позволяСт Π½Π°ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ макросы с этой систСмой. Π― понимаю опасСния, Π½ΠΎ стыдно Ρ‚Π΅Ρ€ΡΡ‚ΡŒ ΠΈΠ·-Π·Π° Π½ΠΈΡ… эту ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ.

@TheNeikos @sgrif Моя Ρ‚ΠΎΡ‡ΠΊΠ° зрСния состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ всС, Ρ‡Ρ‚ΠΎ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎ измСняСт Π²Π²ΠΎΠ΄, Π½Π΅ являСтся ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌ ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½Π΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΎ для рассмотрСния здСсь. Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ использованиС настраиваСмых ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… для макросов ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния нСсколько опасно (отсутствиС Π³ΠΈΠ³ΠΈΠ΅Π½Ρ‹ ΠΈ Ρ‚. Π”.), ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ я Π½Π΅ ΡΡ‚Ρ€Π΅ΠΌΠ»ΡŽΡΡŒ ΠΏΠΎΠΎΡ‰Ρ€ΡΡ‚ΡŒ это.

ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ элСмСнт ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ информация ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ элСмСнта сохраняСтся, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… для элСмСнта Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ понятными (это Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ Π²Ρ‹Π²ΠΎΠ΄Π΅ большС Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ элСмСнта, Π° Π½Π° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°). Π― Π½Π΅ Π²ΠΈΠΆΡƒ вСской ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ‚ΡŒ людям Π·Π»ΠΎΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡ‚ΡŒ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, Ссли Π½Π°ΠΌ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ½Ρ‹ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Π΅ макросы.

@TheNeikos Π― Π½Π΅ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ собираСмся Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ созданиС Π½ΠΎΠ²Ρ‹Ρ… структур Ρ‡Π΅Ρ€Π΅Π· наслСдованиС Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π²Ρ‹ Π½Π΅ ΠΌΠΎΡ‚ΠΈΠ²ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ структуру, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅.

Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ я ΡΡ‡ΠΈΡ‚Π°ΡŽ идиоматичСским; Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ - это Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, Π½ΠΎ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π»ΡƒΡ‡ΡˆΠ΅, Ссли эти Ρ‚ΠΈΠΏΡ‹ связаны с Ρ‚ΠΈΠΏΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚Π΅. НапримСр, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ссли Π±Ρ‹ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ IntoIterator для Ρ‚ΠΈΠΏΠ°, это ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎ Π±Ρ‹ создания структуры Iterator . По ΠΈΠ΄Π΅Π΅, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ для этого Ρ‚ΠΈΠΏΠ°, Π½ΠΎ это ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ Β«ΠΈΠΌΠΏΠ»ΠΈΡ†ΠΈΡ‚Π½ΠΎΠΉ Ρ‡Π΅Ρ€Ρ‚ΠΎΠΉΒ».

@sgrif

Π― ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚Π΅Ρ€ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ - это прискорбно. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ элСмСнт позволяСт Π½Π°ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ макросы с этой систСмой. Π― понимаю опасСния, Π½ΠΎ стыдно Ρ‚Π΅Ρ€ΡΡ‚ΡŒ ΠΈΠ·-Π·Π° Π½ΠΈΡ… эту ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ.

Π₯ΠΌ, я ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ ΡΠΎΡ‡ΡƒΠ²ΡΡ‚Π²ΡƒΡŽ, хотя, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ (ΠΊΠ°ΠΊ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ» @nrc ), это Π½Π΅ Ρ‚ΠΎ, для Ρ‡Π΅Π³ΠΎ Π±Ρ‹Π»Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π° систСма, ΠΈ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚Π΅Π½Π΄Π΅Π½Ρ†ΠΈΡŽ ΠΎΠ±Π½Π°ΠΆΠ°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ острыС ΡƒΠ³Π»Ρ‹. ВСроятно, это Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния для Π²Π°ΡˆΠΈΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² использования. Π― ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠΉ вопрос Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ быстро ΠΌΡ‹ смоТСм ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ Ρ‡Π΅ΠΌΡƒ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ "макросов Π²Π·Ρ€Ρ‹Π²Π° 1.1".

PR Π±Ρ‹Π» объСдинСн, поэтому Π²Ρ‹ смоТСтС ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ измСнСния Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²Π΅Ρ‡Π΅Ρ€. Ѐункция proc_macro_derive большС Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ элСмСнт (это Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π΄Π²Π°ΠΆΠ΄Ρ‹), ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ список ΠΈΠΌΠ΅Π½ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π² Π±Π΅Π»Ρ‹ΠΉ список, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ #[proc_macro_derive(Derive, attributes(Foo, Bar)] .

cc @dtolnay , @sgrif ^

К соТалСнию, это скоро Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΏΠΎΠ»ΠΎΠΌΠΊΡƒ

Π”Π°, я ΠΏΠΎΠ΄Π°Π» https://github.com/serde-rs/serde/issues/614, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π½Π° нашСй сторонС.

Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ исправил ΠΏΠΎΠ»ΠΎΠΌΠΊΡƒ Π² Diesel Π² https://github.com/diesel-rs/diesel/pull/493 , Π±ΡƒΠ΄Ρƒ Π·Π½Π°Ρ‚ΡŒ навСрняка, ΠΊΠΎΠ³Π΄Π° снова Π±ΡƒΠ΄ΡƒΡ‚ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π½ΠΎΡ‡Π½Ρ‹Π΅ ΠΊΠ»ΡƒΠ±Ρ‹.

Π˜Ρ‚Π°ΠΊ, Ссли я ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Ρ‡ΠΈΡ‚Π°ΡŽ этот ΠΏΠΎΡ‚ΠΎΠΊ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ макрос proc ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ элСмСнты, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ ΠΊ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΌΡƒ элСмСнту, ΠΎΠ½ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ большС Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ ΠΊ исходному элСмСнту? (Π― Π²ΠΈΠΆΡƒ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΠ΅ ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ «родствСнных Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉΒ», Π½ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ большС ΠΎΠ± этом.)

Π£ мСня Π΅ΡΡ‚ΡŒ макрос #[derive(newtype)] proc Π² ΠΌΠΎΠ΅ΠΌ (ΠΊΡ€ΠΎΡˆΠ΅Ρ‡Π½ΠΎΠΌ, Π½Π΅ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½ΠΎΠΌ) ящикС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ Π΄ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… #[derive()] s Π² зависимости ΠΎΡ‚ структуры, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½ Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΡƒΠ΅Ρ‚. НапримСр, #[derive(newtype)] struct Foo(u64) замСняСтся Π½Π° #[derive(Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)] struct Foo(u64); Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ #[derive(newtype)] struct Foo(::semver::VersionReq) замСняСтся Π½Π° #[derive(Clone, Debug, PartialEq)] struct Foo(::semver::VersionReq); . Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Π»Π΅Π½Ρ‹ структуры Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ этим макросом, Π½ΠΎ ΠΊ Π½Π΅ΠΌΡƒ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ (ΠΎΠ½ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ структуру).

Π’Π°ΠΊΠΈΡ… структур нСсколько дСсятков, ΠΈ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π΅ΡΡ‚ΡŒ ΠΎΠΊΠΎΠ»ΠΎ дСсяти Π½ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… послС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ этого макроса. МнС это нравится, Ссли я понимаю, Ρ‡Ρ‚ΠΎ Ρ…ΠΎΡ‡Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС Ρ‚ΠΈΠΏΡ‹ u64 newtypes Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Π»ΠΈ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ Ρ‡Π΅Ρ€Ρ‚Ρƒ, я ΠΌΠΎΠ³Ρƒ просто ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… Π² ΠΎΠ΄Π½ΠΎΠΌ мСстС Π² ΠΊΠΎΠ΄Π΅ макроса newtype вмСсто ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ структуры.

РаньшС Ρƒ мСня Π±Ρ‹Π» макрос macro_rules newtype! для этого, Π½ΠΎ я ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΡΡ Π½Π° макрос proc, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ:

  • НаличиС ΠΈΠ»ΠΈ отсутствиС ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² ΠΊ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρƒ, Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΈΠ»ΠΈ отсутствиС pub ΠΈ Ρ‚. Π”. ΠžΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ бСсплатно, Π½Π΅ трСбуя ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ количСства ΠΏΠ»Π΅Ρ‡ макроопрСдСлСния.
  • Π”Π°ΠΆΠ΅ Ссли Π±Ρ‹ я написал ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ‚ΠΎΡ€Π½Ρ‹Π΅ ΠΌΠ°ΠΊΡ€ΠΎ-ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€ΡƒΠΊΠΈ, Π±Ρ‹Π»ΠΎ слоТно Π½Π°ΠΉΡ‚ΠΈ Ρ‚Π°ΠΊΠΎΠΉ порядок, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ Π½Π΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ²Π°Π»ΠΈ Π±Ρ‹ Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ.

К соТалСнию, Π½Π΅Ρ‚, Π²Ρ‹ большС Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ это Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Ρ€Π°Π½ΡŒΡˆΠ΅.

Π§Ρ‚ΠΎ касаСтся Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΉ совмСстимости этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, находящСйся Π² ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠΌ состоянии: ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ функция ΠΏΠ»Π°Π³ΠΈΠ½Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ «чистой», Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ это критичСским ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ, Ссли порядок ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ, ΠΈΠ»ΠΈ Ссли rustc Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ компиляция?

@ est31 Если Ρƒ нас Π΅ΡΡ‚ΡŒ врСмя, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΡΠ½ΡΡ‚ΡŒ ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡƒΡŽ Π²Ρ‹ΡˆΠ΅ ΠΈΠ·ΠΎΠ»ΡΡ†ΠΈΡŽ IPC.

Π― постоянно Π²ΠΈΠΆΡƒ Π”Π’Π‘ Π² Π΄ΠΈΠ·Π΅Π»Π΅ послС самых послСдних ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.

../src/librustc_metadata/decoder.rs:490: запись: id Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½: DefIndex (1) Π² ящикС "diesel_codegen" с Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ 28

@sgrif , это Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° # 37788, которая Π±ΡƒΠ΄Π΅Ρ‚ исправлСна ​​с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ # 37793 (Π±ΡƒΠ΄Π΅ΠΌ Π½Π°Π΄Π΅ΡΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° закончится Π·Π°Π²Ρ‚Ρ€Π° Π²Π΅Ρ‡Π΅Ρ€ΠΎΠΌ ...).

@ est31 Π’ этот час ΡƒΠΆΠ΅ слишком ΠΏΠΎΠ·Π΄Π½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π΄ΠΎ Π½Π°Ρ‡Π°Π»Π° Π½ΠΎΡ‡Π½ΠΎΠΉ сборки.

https://github.com/rust-lang/rust/issues/37839 - ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с использованиСм ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° lib, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сам ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ящик proc_macro. AFAICT Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· тСстов Π½Π΅ Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚ этим, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π»ΠΈΠ±ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠ°ΠΊΡ€ΠΎΠΌΠΎΠ΄ΡƒΠ»ΡŒ proc, Π»ΠΈΠ±ΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ макроса proc ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ bin, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π½Π° макрос proc.

Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ: Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ исправлСно!

@Arnavion ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ с # 37839, исправлСна ​​для ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ослоТнСний, Π½ΠΎ остаСтся нСисправной ΠΏΡ€ΠΈ использовании --target , ΠΊΠ°ΠΊ сообщаСтся Π² # 37958. Π― прСдоставил ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ тСстовый ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с использованиСм --target ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ всС Π΅Ρ‰Π΅ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

@rfcbot fcp слияниС

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° функция добавлСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π² Π±Π΅Π»Ρ‹ΠΉ список, я Π΄ΡƒΠΌΠ°ΡŽ, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ это ΡΡ‚Π°Π±ΠΈΠ»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ! Serde, Diesel ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ - Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ссли Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Π΄ΠΈΠ·Π°ΠΉΠ½ Π²Π°ΠΌ Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚. Π·Π½Π°ΠΊ Ρ€Π°Π²Π½ΠΎ

cc @sgrif @erickt

Π§Π»Π΅Π½ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ @nikomatsakis ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ это. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг - ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ:

  • [x] @alexcrichton
  • [x] @aturon
  • [x] @brson
  • [x] @eddyb
  • [x] @japaric
  • [x] @michaelwoerister
  • [x] @nikomatsakis
  • [x] @nrc
  • [x] @pnkfelix
  • [x] @vadimcn
  • [x] @withoutboats
  • [x] @wycats

Π’ настоящСС врСмя Π½Π΅ пСрСчислСно Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ эти Ρ€Π΅Ρ†Π΅Π½Π·Π΅Π½Ρ‚Ρ‹ достигнут консСнсуса, наступит послСдний ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π². Если Π²Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, которая Π½Π΅ поднималась Π½ΠΈ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ этапС этого процСсса, сообщитС ΠΎΠ± этом!

Π‘ΠΌ. Π­Ρ‚ΠΎΡ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ для получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π΄Π°Ρ‚ΡŒ ΠΌΠ½Π΅ Ρ‡Π»Π΅Π½Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ с Ρ‚Π΅Π³Π°ΠΌΠΈ.

Π― Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² блиТайшСм Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ Π±Ρ‹Π»ΠΈ ΠΈΠ·ΡƒΡ‡Π΅Π½Ρ‹ макросы Π²Π·Ρ€Ρ‹Π²Π°. Π₯отя Π²ΠΎΠ·Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π½Π΅Ρ‚.

@rfcbot просмотрСл

Π’ настоящСС врСмя, Ссли TokenStream Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, возвращаСтся пустая ошибка LexError . МоТно Π»ΠΈ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ здСсь Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ сообщСниС ΠΎΠ± ошибкС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°ΠΊΠΎΠΉ Ρ‚ΠΎΠΊΠ΅Π½ Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ? Π₯отя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ вашСй Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, вСроятно, Π½Π΅ хотят Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ….

Π”Π°, это Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΡƒΠ΄ΠΎΠ±Π½ΠΎ для Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² макросов. МнС ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ Π² Ρ„Π°ΠΉΠ» ΠΈ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π΅Π³ΠΎ Π½Π° ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ ΠΏΠ»ΠΎΡ‰Π°Π΄ΠΊΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ошибки.

Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Ρ‚ΠΎΠΆΠ΅ Π²Ρ‹ΠΈΠ³Ρ€Π°ΡŽΡ‚, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±ΡƒΠ΄ΡƒΡ‚ Π»ΡƒΡ‡ΡˆΠ΅ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… Π² макросС.

На https://github.com/rust-lang/rust/pull/38140 ΠΌΡ‹ заставляСм объявлСния настраиваСмого наслСдования Π±Ρ‹Ρ‚ΡŒ общСдоступными. ВСория состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹ Π½Π°ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ частныС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΌΡ‹, вСроятно, Π·Π°Ρ…ΠΎΡ‚ΠΈΠΌ провСсти это Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ Π½Π° основС видимости ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ любом случаС это консСрвативный Π²Ρ‹Π±ΠΎΡ€. Π― ΠΏΠΎΠ΄ΡƒΠΌΠ°Π», Ρ‡Ρ‚ΠΎ ΠΎΡΡ‚Π°Π²Π»ΡŽ Π΅Π³ΠΎ ΠΌΠ°Ρ€ΠΈΠ½ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° дСнь ΠΈΠ»ΠΈ Π΄Π²Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ люди ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ слияниСм, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ стабилизируСм эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

β„–37480 Π·Π°ΠΊΡ€Ρ‹Ρ‚, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΎ Π² Ρ‡Π΅ΠΊ-листС.

Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½Π°

@pnkfelix Π― взял Π½Π° сСбя ΡΠΌΠ΅Π»ΠΎΡΡ‚ΡŒ

: bell: БСйчас наступаСт послСдний ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ для ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² , ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΎΠ±Π·ΠΎΡ€Π΅ Π²Ρ‹ΡˆΠ΅ . : ΠΊΠΎΠ»ΠΎΠΊΠΎΠ»:

psst @nikomatsakis , ΠΌΠ½Π΅ Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΊΡƒ final-comment-period , сдСлайтС это.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ Π»ΠΈ прСдстоящая стабилизация, Ρ‡Ρ‚ΠΎ ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ извСстныС ошибки Π² ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΌ спискС Π²Π²Π΅Ρ€Ρ…Ρƒ Π±ΡƒΠ΄ΡƒΡ‚ исправлСны Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ? Или Ρ‚Π΅ Π½Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ ΡΡ‚Π°Π±ΠΈΠ»ΠΈΠ·Π°Ρ†ΠΈΡŽ?

ΠŸΡ€ΡΠΌΠΎ сСйчас ΠΈΡ… Π΄Π²Π°:

  • # 36935 содСрТит ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ€Π΅ΡˆΠ΅Π½Π°.
  • # 36691 ΠΌΠ½Π΅ Π½Π΅ каТСтся Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ ΠΈΠΌ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒΡΡ Π΄ΠΎ mod foo; ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ, Ссли Π·Π°Ρ…ΠΎΡ‚ΠΈΠΌ, Π½Π΅ Π½Π°Ρ€ΡƒΡˆΠ°Ρ Π½ΠΈΡ‡Π΅Π³ΠΎ, ΠΊΠ°ΠΊ ΠΌΠ½Π΅ каТСтся.

ΠŸΡ€ΠΈΠ²Π΅Ρ‚! Π­Ρ‚ΠΎ Π°ΡƒΠ΄ΠΈΡ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ RFC 1636 . Π­Ρ‚ΠΎ пСрвая ваТная функция, которая стабилизируСтся с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° принятия RFC 1636, ΠΈ Π² этом случаС ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΊΠ°ΠΊ слСдуСт ΠΏΠΎΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π°Π΄ Π΅Π³ΠΎ соблюдСниСм.

RFC гласит:

ΠŸΠ΅Ρ€Π΅Π΄ стабилизациСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

  • ВозмоТности языка:

    • Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ Π² Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊΠ΅ ΠΏΠΎ Rust.

    • Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π½Π° языкС программирования Rust.

    • ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ Π² Rust Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ….

  • ИзмСнСния ΠΊΠ°ΠΊ языковых Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ‚Π°ΠΊ ΠΈ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ:

    • ΠΎΠ΄Π½Π° строка для ΠΆΡƒΡ€Π½Π°Π»Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ

    • Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ описаниС объявлСния ΠΎ выпускС Π² ΠΏΠΎΠ»Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅.

Каков ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ процСсс для этого? Π”ΠΎΠ»ΠΆΠ½Ρ‹ Π»ΠΈ ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ элСмСнты ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ списка Π² Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ для отслСТивания Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ? МнС каТСтся, Ρ‡Ρ‚ΠΎ ΠΊ выпуску 1.15 Ρƒ нас Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ докумСнтация, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰Π°Ρ этим трСбованиям Π² Π²ΠΈΠ΄Π΅ Π΄Π΅Ρ€Π΅Π²Π°.

cc @ rust-lang / docs

Бпасибо @withoutboats ! Π”Π°, это пСрвая ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Π°Ρ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. Π£ мСня Π±Ρ‹Π»ΠΎ это Π² ΠΌΠΎΠ΅ΠΌ спискС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ сСгодня ΡƒΡ‚Ρ€ΠΎΠΌ, ΠΈ Π²ΠΎΡ‚, Ρ‚Ρ‹ мСня ΠΎΠΏΠ΅Ρ€Π΅Π΄ΠΈΠ» πŸ˜„

Π― всСгда прСдставлял сСбС это Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΎ стабилизации ΠΈ фактичСская стабилизация Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Ρ‹. Π’ΠΎ Π΅ΡΡ‚ΡŒ @ rust-lang / lang ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ «это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΌΒ», Π½ΠΎ фиксация Π½Π° ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ шлюза Ρ‚Π°ΠΊΠΆΠ΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ докумСнтация сущСствуСт. Π’ ΠΌΠΈΡ€Π΅, Π³Π΄Π΅ сущСствуСт Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Π°Ρ ΠΊΠ½ΠΈΠ³Π° , это ΠΏΠ΅Ρ€Π΅Ρ‚Π°Ρ‰ΠΈΡ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΎΡ‚Ρ‚ΡƒΠ΄Π° Π² ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹; Π½ΠΎ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€ всС Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ.

Учитывая, Ρ‡Ρ‚ΠΎ Ρƒ нас Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ Π±Ρ‹Π» Ρ€Π΅Π»ΠΈΠ·, я ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π» ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ этого:

  1. ΠŸΠΎΠ΄ΠΎΠΆΠ΄ΠΈΡ‚Π΅, ΠΏΠΎΠΊΠ° это оставит FCP
  2. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠΈΡ‚Π΅ нСсколько Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². (Π― ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π» Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈΡ… Π² этом случаС)
  3. Π‘Π΄Π΅Π»Π°ΠΉΡ‚Π΅ ΡΡ‚Π°Π±ΠΈΠ»ΠΈΠ·Π°Ρ†ΠΈΡŽ ПР.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ сочСтаниС Π΄Π²ΡƒΡ… ΠΈ Ρ‚Ρ€Π΅Ρ….

/ cc @ rust-lang / core, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это мСТгрупповая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°.

@steveklabnik, это Π·Π²ΡƒΡ‡ΠΈΡ‚ Ρ…ΠΎΡ€ΠΎΡˆΠΎ для мСня, ΠΈ я Ρ‚ΠΎΠΆΠ΅ Π±ΡƒΠ΄Ρƒ Π² порядкС, ΠΊΠΎΠ³Π΄Π° Π±ΡƒΠ΄Ρƒ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ (Π΄Π°ΠΆΠ΅ Π΄ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ FCP). Π’ любом случаС FCP здСсь Π²Ρ€ΠΎΠ΄Π΅ ΠΊΠ°ΠΊ псСвдо-Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ случайно заняли ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΠΉΡ‚ΠΈ.

Π’Π°ΠΊΠΆΠ΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΡ… быстро, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ бСзопасный ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ пСрСнос Π² Π±Π΅Ρ‚Π°-Π²Π΅Ρ€ΡΠΈΡŽ 1.15!

Если я ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ, ΠΊΡ‚ΠΎ ΡƒΠ΄Π°Ρ€ΠΈΡ‚ это, это Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊ ΡƒΠΆ ΠΏΠ»ΠΎΡ…ΠΎ, Π½ΠΎ Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΠΌ Π΅Π³ΠΎ Π² список извСстных ошибок: использованиС макроса Ρ‚ΠΈΠΏΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ структуры с настраиваСмой ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΉ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ICE https://github.com/rust-lang/ Ρ€ΠΆΠ°Π²Ρ‡ΠΈΠ½Π° / вопросы / 38706

https://github.com/rust-lang/rust/pull/38737 исправляСт макросы Ρ‚ΠΈΠΏΠ° ICE: heart :. Π•ΡΡ‚ΡŒ Π»ΠΈ шанс пСрСнСсти это Π½Π° Π±Π΅Ρ‚Π°-Π²Π΅Ρ€ΡΠΈΡŽ? ОбоснованиС: каТСтся ΠΏΠ»ΠΎΡ…ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π²Π΅ Π²Ρ‹Π΄Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠ΄Π½Π° ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Ρ‹ΠΏΡƒΡ‰Π΅Π½Π° Π² вСрсии 1.13, Π° другая Π² вСрсии 1.15, приводят ΠΊ сбою компилятора ΠΏΡ€ΠΈ ΠΈΡ… совмСстном использовании.

Π― Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ создал # 38749, ΠΊΠ°ΡΠ°ΡŽΡ‰ΠΈΠΉΡΡ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ящика proc_macro .

Π― нСсколько Ρ€Π°Π· Ρ‡ΠΈΡ‚Π°Π», Ρ‡Ρ‚ΠΎ макросы 1.1 Π±ΡƒΠ΄ΡƒΡ‚ стабилизированы Π² вСрсии 1.15, Π½ΠΎ 1.15.0-beta.1 Π±Ρ‹Π»Π° Π²Ρ‹ΠΏΡƒΡ‰Π΅Π½Π° Π΄Π²Π΅ Π½Π΅Π΄Π΅Π»ΠΈ Π½Π°Π·Π°Π΄, ΠΈ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ extern crate proc_macro; всС Π΅Ρ‰Π΅ поддСрТиваСтся Π² Π½Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΈ Π² Π½ΠΎΡ‡Π½ΠΎΠΌ 4ecc85beb 2016 -12-28. ΠŸΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ Π»ΠΈ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ измСнСния стабилизации?

@SimonSapin: Π΄Π°, это Π±Ρ‹Π» ΠΏΠ»Π°Π½, Π½ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ это ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ!

Π­Ρ‚ΠΎ всС Π΅Ρ‰Π΅ ΠΏΠ»Π°Π½: p

Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΏΠΈΡˆΠ΅Ρ‚ #[derive(Foo)] #[foo_def = "definition.json"] struct MyStruct; ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ макроса Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ возмоТности ΡƒΠ·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Β«Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Β», ΠΈ поэтому Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ definition.json .

Π­Ρ‚ΠΎ сдСлано Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ, ΠΈ поэтому ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ это Π±ΡƒΠ΄Π΅Ρ‚ нСпросто, ΠΈ я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΡƒΠΆΠ΅ слишком ΠΏΠΎΠ·Π΄Π½ΠΎ ΠΈΡΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ это.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² Span -> FileMap -> имя Ρ„Π°ΠΉΠ»Π° -> ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³. ВсС, Ρ‡Π΅Π³ΠΎ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚, - это доступа ΠΊ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Ρ‡Π΅Ρ€Π΅Π· proc_macro .

Π’Π°ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ компилятору Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΊ definition.json Ρ‡Ρ‚ΠΎΠ±Ρ‹ сборка Π±Ρ‹Π»Π° грязной, Ссли ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π°.

ΠœΠ°ΠΊΡ€ΠΎΡ proc ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ env::var("CARGO_MANIFEST_DIR") для получСния ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, содСрТащСго Cargo.toml ящика, содСрТащСго Π²Ρ‹Π·ΠΎΠ² макроса. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ foo_def ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ этого. Π‘ΠΌ. Https://github.com/dtolnay/syn/issues/70#issuecomment -268895281.

@tomaka, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡƒΡ‚Π΅ΠΌ измСнСния FileMap, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊ Π΄Π΅Π»Π°Π΅Ρ‚ это макрос include_str! .

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ foo_def относится ΠΊ этому.

Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡƒΡ‚ΡŒ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Cargo.toml Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ.

это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² FileMap, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊ include_str! макрос Π΄Π΅Π»Π°Π΅Ρ‚ это.

Π”Π°, я знаю, Ρ‡Ρ‚ΠΎ это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Π½ΠΎ этого просто нСльзя ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ API ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… макросов.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ - Item . Π‘Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ для получСния Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΠΈΠ· этого элСмСнта, Π½ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΊ Item Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ компилятор Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ, Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π²Π·Π»ΠΎΠΌΠΎΠΌ IMO.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Span -> FileMap -> filename -> directory.

Π­Ρ‚ΠΈ API (Π² частности, FileMap ) находятся Π½Π° ΠΏΡƒΡ‚ΠΈ ΠΊ стабилизации?

Они Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌΠΈ, Π½Π° самом Π΄Π΅Π»Π΅ я Π±Ρ‹ Π½Π΅ Ρ…ΠΎΡ‚Π΅Π» ΡΡ‚Π°Π±ΠΈΠ»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹. ВмСсто этого ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡ‚Π°Π±ΠΈΠ»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ API, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡŽΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Span (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, строку, столбСц, имя Ρ„Π°ΠΉΠ»Π°).

Π― Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» эту ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² своСм ящикС. Π§Ρ‚ΠΎ происходит?

`` error: Cannot use #! [Feature (proc_macro)] and #! [Feature (custom_attribute)] ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ
`` ''

@alexreg Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ #[derive] , Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ½ стабилСн. Π’Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ #![feature(proc_macro)] .

@alexreg
proc_macro_derive s (макросы 1.1) Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ - Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ просто ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ #![feature(proc_macro)] .

#[proc_macro_attribute] Π½Π΅Π΄Π°Π²Π½ΠΎ призСмлился Π·Π° Π²ΠΎΡ€ΠΎΡ‚Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ #![feature(proc_macro)] ; ΠΎΠ½ΠΈ нСсовмСстимы с #![feature(custom_attribute)] . #![feature(custom_attribute)] Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌ послС установки Π·Π°ΠΌΠ΅Π½Ρ‹ (https://github.com/rust-lang/rfcs/pull/1755).

@jseyfried Π― Π΄ΡƒΠΌΠ°ΡŽ, Π½Π°ΠΌ слСдуСт ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ отслСТивания Π½Π° proc_macro ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° Π·Π°ΠΊΡ€Ρ‹Ρ‚Π° ΠΈ Π½Π΅ содСрТит ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

Бпасибо рСбята. Π’ этом Π΅ΡΡ‚ΡŒ смысл.

@abonander Π”Π°, #![feature(proc_macro)] ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° # 38356 - я Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Π» ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² этом ΠΏΡ€ΠΈ просмотрС # 38842. НС ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²Ρ‹ ΠΏΠΎΠ΄Π°Ρ‚ΡŒ PR?

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ

Π‘ΠΌΠ΅ΠΆΠ½Ρ‹Π΅ вопросы

overvenus picture overvenus  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

dnsl48 picture dnsl48  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

eddyb picture eddyb  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

modsec picture modsec  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

mcarton picture mcarton  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ