Сохранить имя переменной как строку в Юлии
В Julia 0.4 у меня есть переменная с именем variablex где
in: variablex = 6
out: 6
in: typeof(variablex)
out: Int64
Я хотел бы сохранить имя переменной в виде строки, поэтому я хотел бы получить что-то похожее на переменную "a", ниже которой хранится имя переменной "variablex" в виде строки.
in: a = Name(variablex)
out: variablex
in: typeof(a)
out: ASCIIString
В приведенном выше примере я только что создал функцию "Имя", которая возвращает имя переменной в виде строки. Есть ли в Джулии существующая функция, которая делает то же самое, что и мой воображаемый пример функции "Имя" выше?
1 ответ
Вы можете использовать макрос как это:
macro Name(arg)
string(arg)
end
variablex = 6
a = @Name(variablex)
julia> a
"variablex"
Кредит (и более подробная информация): это так Q&A.
Изменить: Подробнее / Объяснение: Из документации Юлия:
макросы получают свои аргументы в виде выражений, литералов или символов
Таким образом, если бы мы попытались создать такой же эффект с помощью функции (вместо макроса), у нас возникла бы проблема, потому что функции получали свои аргументы в виде объектов. С макросом, однако, variablex
(в этом примере) передается как символ (например, эквивалент ввода :variablex
). И, string()
Функция может воздействовать на символ, превращая его, в общем, в строку.
В короткой версии вы можете думать о символе как об особом типе строки, которая связана с конкретным объектом и ссылается на него. Из документации Юлии снова:
Символ является идентификатором интернированной строки
Таким образом, мы пользуемся тем фактом, что в базовом коде Юлии настройка макросов уже дает нам готовый способ получить символ, связанный с данной переменной (путем передачи этой переменной в качестве аргумента макросу), а затем принять Преимущество в том, что, поскольку символы представляют собой особый тип строки, относительно просто преобразовать их в более стандартный тип строки.
Для более детального анализа символов в Юлии, см. Этот знаменитый вопрос. Что такое "символ" в Юлии?
Подробнее о макросах см. В этом вопросе. Вопрос: В Julia почему @printf - это макрос, а не функция?
Для Юлии 1.0 и выше:
macro name(arg)
x = string(arg)
quote
$x
end
end
Применение:
a = @name variablex #macro syntax
a = @name(variablex) #called as a function