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

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

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

// 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?
  • как получить имена методов из этого идентификатора и как реализовать их, используя расширение синтаксиса?

person 3Hren    schedule 28.11.2014    source источник


Ответы (1)


Вы не можете.

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

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

person DK.    schedule 28.11.2014
comment
Я предполагаю, что это также означает, что нельзя разрешить значение констант в пользовательских атрибутах и ​​т. д.? - person eggyal; 27.11.2018
comment
@eggyal Нет, ты не можешь. - person DK.; 28.11.2018