Как правильно повторить строку формата в Julia? - PullRequest
1 голос
/ 28 мая 2020

У меня есть массив чисел с плавающей запятой x, и я хотел бы вывести последнюю строку на экран как целые числа. Следующий код не работает и дает ArgumentError: @printf: first or second argument must be a format string. Как я могу печатать со строкой переменного формата?

using Printf
@printf("%i "^length(x[end,:]), x[end,:]...)

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Использование @eval для компиляции простого оператора печати каждый раз - действительно плохой подход. Функциональные возможности для строк формата Dynami c et c отсутствуют. потому что у Джулии есть широкий спектр других хороших инструментов для достижения тех же целей:

julia> join(stdout, (round(Int, y) for y in x[end, :]), " ")
1 0 1

И печать массива на самом деле не то, что сделано printf для (даже не в C).

Это не означает, что функция printf, принимающая строку формата времени выполнения, не будет хорошей вещью, но см. здесь для объяснения причин создания макроса. Я никогда не пропускал printf, но если вы действительно пропустите, есть Formatting.jl , который обеспечивает всю функциональность, которую вы можете себе представить.

0 голосов
/ 28 мая 2020

Наши «константы» по-прежнему являются значениями времени выполнения - они предназначены для однократной записи, а не константы времени компиляции, как в C.

В качестве хака, пока Джулия не получит реальную поддержку строк формата времени выполнения, это работает:

using Printf
const fmt = "%i "^length(x[end,:])
@eval @printf($fmt, x[end,:]...)
...