Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Расширение синтаксиса Rust и особенности

Автор вопроса: 3HrenОтветов: 1

Я застрял, когда пытался реализовать черты программно, используя расширения синтаксиса.

Я написал минимальный пример здесь. Я надеюсь, что кто-то может помочь (или указать мне в правильном направлении).

// Just some methods collection I want to implement programmatically.
trait TraitToHack {
    fn implement_me(&self) -> int; // Say, I'd like to implement this method programmatically to return 42.
}

// I create dummy struct and wrap it with special attribute.
#[AttributeToHack(TraitToHack)]
struct StructToHack;

// I register syntax extension based on Decorator. Its signature is something like this:
// fn expand(cx: &mut ext::base::ExtCtxt, span: codemap::Span, mitem: &ast::MetaItem, item: &ast::Item, push: |P<ast::Item>|) { .. }
// This is where I got stuck :(
fn main() {
    let hack = StructToHack;
    hack.implement_me(); // Must return 42.
}

Вопросы:

  • как получить идентификатор черты из контекста AST?
  • как получить имена методов из этого идентификатора и как реализовать их, используя расширение синтаксиса?

rustmetaprogrammingtraits

Ответы

Ответ 1 · рейтинг 2 · DK.

Вы не можете.

Расширения синтаксиса, такие как макросы и атрибуты, раскрываются до разрешения имен. Это означает, что хотя вы можете получить идентификатор TraitToHack, вы не сможете извлечь из него какую-либо информацию о свойстве.

Следующим лучшим способом является реализация атрибута специально для признака, который имеет жестко закодированное понимание указанного признака (т.е. поскольку атрибут предназначен для TraitToHack, он знает это должен реализовать implement_me). Примерно так работает deriving: для каждой поддерживаемой черты есть отдельная функция расширения.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы