julia@printf更改我的变量

julia@printf更改我的变量,julia,Julia,我发现很难用Julia设置数字格式: b = 1.111111 bb = @printf "test : %5.2f" b bb test : 1.11 那很好 using PyPlot annotate(@printf "test : %5.2f" b, xy=[1;1]) test : type: non-boolean (Array{Bool,1}) used in boolean context while loading In[16], in expression star

我发现很难用Julia设置数字格式:

b = 1.111111
bb = @printf "test : %5.2f" b
bb

test :  1.11
那很好

using PyPlot 
annotate(@printf "test : %5.2f" b, xy=[1;1])

test : 
type: non-boolean (Array{Bool,1}) used in boolean context
while loading In[16], in expression starting on line 2
我不明白,因为我希望@printf的结果是字符串。如果有人能解释我该怎么做

"test : %5.2f" % b
在Python中

最后,这里是一件奇怪的事情:

b
1
b已被转换为Int。你会称之为bug吗

我将Julia 0.3.2与Jupyter 3.1一起使用,宏解析(特别是在函数调用的上下文中)有点挑剔。你可以简单地引用一下Julia是如何解析的:

julia> :(annotate(@printf "test : %5.2f" b, xy=[1;1]))
:(annotate(@printf "test : %5.2f" (b,xy) = [1,1]))
如您所见,宏比函数参数“更贪婪”。整个
b,xy=[1;1]
部分作为
@printf
宏的唯一参数。这就解释了为什么
b
的值会发生变化,
=
的上下文已从表示关键字参数变为一般元组赋值

在更复杂的表达式中使用宏时,我强烈建议对宏使用类似函数的语法,如下所示:

annotate(@sprintf("test : %5.2f", b), xy=[1;1])

最后,请注意,我已将
@printf
更改为
@sprintf
。前者返回
nothing
并简单地输出值,而后者返回一个字符串,您可以将其传递给函数。

感谢您的回答和了解Julia如何解析宏的技巧。