Как использовать пользовательский атрибут пространства-имени для макроса имен вместо типа внутри?

Что-то вроде этого должно работать:

var testObj = {
    test: 'testValue',
    test1: 'testValue1',
    test2: {
        test2a: 'testValue',
        test2b: 'testValue1'
    }
}

function searchObj (obj, query) {

    for (var key in obj) {
        var value = obj[key];

        if (typeof value === 'object') {
            searchObj(value, query);
        }

        if (value === query) {
            console.log('property=' + key + ' value=' + value);
        }

    }

}

Если вы выполните searchObj(testObj, 'testValue');, он будет записывать на консоль следующее:

property=test value=testValue
property=test2a value=testValue

Очевидно, вы можете заменить console.log с тем, что вы хотите, или добавьте параметр обратного вызова в функцию searchObj, чтобы сделать его более многоразовым.

EDIT: добавлен параметр query, который позволяет вам указать желаемое значение для поиска, когда вы вызываете функцию.

1
задан Shepmaster 27 February 2019 в 16:36
поделиться

1 ответ

Пространство имен, объявленное в атрибуте proc_macro_derive, полностью игнорируется , и это известная ошибка . Из-за этой ошибки следующий код может быть скомпилирован, хотя это не должно быть.

#[derive(Example)]
#[attr]             // Works (but shouldn't)
struct Demo {
    #[lolwut::attr] // Works (but shouldn't)
    field: i32,
}

До тех пор, пока ошибка не будет устранена, вы должны продолжать использовать форму без пространства имен (example_attr).

Кроме того, согласно этому отчету об ошибках, начиная с Rust 1.33.0, нет способа добиться того, что OP хочет через proc-macros, и как разрешить #[example::attr] работать все еще в разработке.

0
ответ дан kennytm 27 February 2019 в 16:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: