在Julia中将变量名保存为字符串

9
在 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

在上面的例子中,我刚刚编写了一个名为“Name”的函数,它将变量的名称作为字符串返回。在Julia中是否有现成的函数可以执行与我想象中的示例函数“Name”相同的操作?
2个回答

14

你可以使用这样的宏:

macro Name(arg)
   string(arg)
end

variablex  = 6

a = @Name(variablex)

julia> a
"variablex"

来源及更多细节: SO Q&A。

编辑:更多细节/解释:来自Julia 文档

宏将其参数作为表达式、文字或符号接收

因此,如果我们尝试使用函数(而不是宏)创建相同的效果,就会出现问题,因为函数将其参数作为对象接收。然而,对于宏,variablex(在此示例中)作为符号传递,例如输入:variablex等效。并且,string()函数可以对符号进行操作,将其转换为字符串。

简而言之,您可以将符号视为一种非常特殊的字符串类型,它与特定对象绑定并引用该对象。再次引用Julia文档

符号是一个内部化的字符串标识符

因此,在Julia的基本代码中,我们利用了宏的设置,为我们提供了一种获取与给定变量关联的符号的简便方法(通过将该变量作为宏的参数传递),然后利用了符号是一种特殊类型的字符串的事实,相对直接地将它们转换为更标准的字符串类型。

有关Julia符号的更详细分析,请参阅这个著名的SO问题:Julia中的“符号”是什么?

有关宏的更多信息,请参见此SO问题:在Julia中,为什么@printf是一个宏而不是函数?


请问您能解释一下这是怎么运作的吗?在这里用了什么函数来获取名称?例如,如果我不创建宏,只尝试使用string(variablex),我只会得到它的值作为字符串,那么上述代码的哪个部分给出了它的名称而不是它的值? - lara
@user3061923,我在尝试的简单测试案例中没有遇到同样的问题。由于您描述的问题与您在原始问题中发布的(根据您在该问题中提供的可重现代码)不同,我建议您创建一个新问题,指定新问题,并提供一个可重现的代码片段,就像您为原始问题所做的那样。 - Michael Ohlrogge
1
如果我想在函数内部使用这个宏来处理传递到函数中的变量,似乎无法正常工作。例如,函数如下:function ret(variable) println(variable) varname = @Name(variable) return varname end 当我使用以下代码时:in: tree = 6; in: ret(tree) out: varname=variable,而不是预期的varname = tree。 - lara
抱歉,我在你回复之前正在编辑我的评论。如果您阅读了修改后的评论仍然有相同的感觉,请告诉我,我会按照您建议的做。 - lara
@user3061923 好的,我明白你的意思。是的,我建议你将其作为一个单独的问题提出。但首先,请查看我在答案中链接的问题,因为它似乎正在询问与您几乎相同的事情。如果您对此有疑问或遇到实现问题,则可以针对这些问题具体提出问题,以便不会被标记为重复。 - Michael Ohlrogge

1
对于 Julia 1.0 及以上版本:
macro name(arg)
    x = string(arg)
    quote
        $x
    end
end

用法:

a = @name variablex #macro syntax
a = @name(variablex) #called as a function

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接