chunk!() { /* proc-macro */ }
macros
only.Expand description
Create a type that implements AsChunk
and can capture Rust variables.
This macro allows to write Lua code directly in Rust code.
Rust variables can be referenced from Lua using $
prefix, as shown in the example below.
User’s Rust types needs to implement UserData
or ToLua
traits.
Captured variables are moved into the chunk.
use mlua::{Lua, Result, chunk};
fn main() -> Result<()> {
let lua = Lua::new();
let name = "Rustacean";
lua.load(chunk! {
print("hello, " .. $name)
}).exec()
}
Syntax issues
Since the Rust tokenizer will tokenize Lua code, this imposes some restrictions. The main thing to remember is:
-
Use double quoted strings (
""
) instead of single quoted strings (''
).(Single quoted strings only work if they contain a single character, since in Rust,
'a'
is a character literal). -
Using Lua comments
--
is not desirable in stable Rust and can have bad side effects.This is because procedural macros have Line/Column information available only in nightly Rust. Instead, Lua chunks represented as a big single line of code in stable Rust.
As workaround, Rust comments
//
can be used.
Other minor limitations:
-
Certain escape codes in string literals don’t work. (Specifically:
\a
,\b
,\f
,\v
,\123
(octal escape codes),\u
, and\U
).These are accepted: :
\\
,\n
,\t
,\r
,\xAB
(hex escape codes), and\0
. -
The
//
(floor division) operator is unusable, as its start a comment.
Everything else should work.