julia @printf改变我的变量

时间:2015-05-21 15:54:04

标签: 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 starting on line 2

我不明白,因为我希望@printf的结果是一个String。所以,如果有人可以解释我应该怎么做

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

总而言之,这是奇怪的事情:

b
1

b已被强制转换为Int。你会称那个错误吗?

我使用Julia 0.3.2和Jupyter 3.1

1 个答案:

答案 0 :(得分:12)

宏解析(特别是在函数调用的上下文中)有点挑剔。您可以通过引用它来了解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并简单地输出值,而后者返回一个可以传递给函数的字符串。