После правильной загрузки xml-файла с помощью SimpleXML objecto вы можете сделать print_r($xml_variable)
, и вы можете легко найти, к каким атрибутам вы можете получить доступ. Как говорили другие пользователи, $xml['id']
также работал для меня.
#[macro_use]
mod foo {
macro_rules! bar {
() => ()
}
}
bar!(); // works
Если вы хотите использовать макрос в том же ящике, для вашего макроса, определенному в нем, нужен атрибут #[macro_use]
.
Если вы хотите использовать макрос в других ящиках, сам макрос также нуждается в атрибуте #[macro_export]
.
Если вы хотите использовать макросы из других ящиков, инструкция extern crate xxx;
требует атрибута #[macro_use]
для импорта всех макросов из этого ящика или #[macro_use(cat, dog)]
, чтобы использовать только макросы cat
и dog
].
Макросы могут использоваться только после того, как они были определены. Это означает, что это не работает:
bar!();
#[macro_use]
mod foo {
macro_rules! bar {
() => ()
}
}
Дополнительная информация доступна в Приложение D: Макросы в Язык программирования ржавчины .
Этот ответ устарел от Rust 1.1.0-stable.
Вам нужно добавить #![macro_escape]
вверху macros.rs
и включить его с помощью mod macros;
, как указано в Руководство по макросам .
$ cat macros.rs
#![macro_escape]
#[macro_export]
macro_rules! my_macro {
() => { println!("hi"); }
}
$ cat something.rs
#![feature(macro_rules)]
mod macros;
fn main() {
my_macro!();
}
$ rustc something.rs
$ ./something
hi
Для справок в будущем
$ rustc -v
rustc 0.13.0-dev (2790505c1 2014-11-03 14:17:26 +0000)
#[macro_export]
здесь не нужен. Это необходимо только в том случае, если макрос должен быть экспортирован во внешние пользователи ящиков. Если макрос используется только внутри ящика, #[macro_export]
не требуется.
– Vladimir Matveev
4 November 2014 в 11:30
something.rs
использует другие модули, например, с mod foobar;
, и этот модуль foobar
использует макросы из macro.rs
, тогда вы должны поместить mod macro;
до i> mod foobar;
для компиляции программы. Мало того, но это не очевидная ИМО.
– conradkdotcom
6 February 2015 в 14:26
Добавление #![macro_use]
к вершине вашего файла, содержащего макросы, приведет к выталкиванию всех макросов в main.rs.
Например, предположим, что этот файл называется node.rs:
#![macro_use]
macro_rules! test {
() => { println!("Nuts"); }
}
macro_rules! best {
() => { println!("Run"); }
}
pub fn fun_times() {
println!("Is it really?");
}
Ваши main.rs будут выглядеть примерно так:
mod node; //We're using node.rs
mod toad; //Also using toad.rs
fn main() {
test!();
best!();
toad::a_thing();
}
Наконец, скажем, у вас есть файл с именем toad.rs, который также требует этих макросов:
use node; //Notice this is 'use' not 'mod'
pub fn a_thing() {
test!();
node::fun_times();
}
Обратите внимание, что после того, как файлы втянуты в main.rs с помощью mod
, остальные ваши файлы имеют доступ к ним с помощью ключевого слова use
.
macros
иfoo
(который использует макрос изmacros
), и вы указываете их в алфавитном порядке в ваших lib.rs или main.rs, foo будет загружен перед макросами и код не будет компилироваться. – neverfox 15 August 2017 в 02:55