最初提出这个问题时,宏扩展器(即使用 macro 关键字定义的函数,被调用以将传递给宏的表达式转换为单个输出表达式)不是通用函数,而是一个匿名函数,这是 Julia 0.4 及更早版本中的另一种函数。那时,编写可以用于一个或两个参数的匿名函数签名的唯一方法是使用尾随 varargs 参数,这就是为什么使用此模式来定义字符串宏的原因。在 Julia 0.5 中,所有函数都变成了通用函数,包括匿名函数和宏扩展器。因此,您现在可以通过多种方式编写宏,包括在字符串参数之后使用 varargs 参数的旧方式:
# old style
macro rm_str(raw, rest...)
remove = isempty(rest) ? "aeiouy" : rest[1]
replace(raw, collect(remove), "")
end
# new style with two methods
macro rm_str(raw)
replace(raw, ['a','e','i','o','u','y'], "")
end
macro rm_str(raw, remove)
replace(raw, collect(remove), "")
end
# new style with default second argument
macro rm_str(raw, remove="aeiouy")
replace(raw, collect(remove), "")
end
这些都会导致相同的非标准字符串文字行为:
julia> rm"foo bar baz"
"f br bz"
julia> rm"foo bar baz"abc
"foo r z"
字符串文字生成的字符串中去掉了标记的字母,默认去掉所有的 ASCII 元音(“aeiouy”)。在这种情况下,使用带有默认值的第二个参数的新方法是最简单和最清晰的,因为在许多情况下都会如此,但现在您可以使用最适合这种情况的方法。