stringify! e assert!
Nesta página
stringify! é um macro embutido que converte a forma sintática de uma
expressão em string — não o valor, mas o código que você escreveu. Isso é
especialmente útil para mensagens de depuração e erro que mostram o que estava
no código, não apenas o resultado numérico.
O padrão dbg! abaixo combina stringify! com o valor avaliado para produzir
saídas como [dbg] count * 2 = 14:
stringify! embutido e macro dbg! que mostra código-fonte junto ao valor.
// Feature: `stringify!` — converts an expression into a source string
// Syntax: `stringify!(expr)` — built-in macro
// When to use: assert/debug messages that show the original code, not
// just the value. Pairs beautifully with custom macros.
// `stringify!` captures the syntactic form of the expression.
let s = stringify!(1 + 2 * 3)
print(s)
// expected: 1 + 2 * 3
// Works with identifiers, calls, any expression.
let n = stringify!(hello_world)
print(n)
// expected: hello_world
let call = stringify!(foo(1, 2))
print(call)
// expected: foo(1, 2)
// Useful pattern: dbg! shows "expr = value".
macro dbg(x) {
print("[dbg] {stringify!($x)} = {$x}")
}
let count = 7
dbg!(count)
dbg!(count * 2)
dbg!(count > 5)
// expected:
// [dbg] count = 7
// [dbg] count * 2 = 14
// [dbg] count > 5 = true
Com stringify! disponível, é direto construir macros de asserção que exibem
a expressão que falhou. assert! aborta com a forma textual da condição;
assert_eq! mostra lados esquerdo e direito separadamente:
assert! e assert_eq! com mensagens de falha automáticas via stringify!.
// Feature: Practical macros — `assert!` and `expect!`
// Syntax: combines `stringify!` with the expression for rich messages
// When to use: inline tests and validations with syntactic context.
// assert!: aborts if the condition is false, showing the original code.
macro assert(cond) {
if !$cond {
panic("assertion failed: {stringify!($cond)}")
}
}
assert!(1 + 1 == 2)
assert!("zolo".len() == 4)
print("all asserts passed")
// expected: all asserts passed
// assert_eq!: equality with a useful message on failure.
macro assert_eq(actual, expected) {
if $actual != $expected {
panic("assert_eq failed: {stringify!($actual)} != {$expected}, got {$actual}")
}
}
let result = 2 * 21
assert_eq!(result, 42)
print("ok")
// expected: ok
Desafio
Escreva um macro assert_gt!(a, b) que falha com a mensagem
"esperado {stringify!($a)} > {stringify!($b)}, mas {$a} <= {$b}" quando
a <= b. Teste com assert_gt!(5, 3) (passa) e assert_gt!(2, 10) (deve
abortar).
Veja também