本文主要是介绍julia-符号标识符Core.Symbol(第12讲),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
符号标识符Core.Symbol1.1.定义:用于表示已解析julia代码(AST)中的标识符的对象类型。也经常用作名称或标签来标识实体(如作为字典键)
1.2.说明:能够将自定义的语言代码表示为语言本身的数据结构;Symbol是不可变;是不支持对字符进行迭代的“原子”或“标量”实体在表达式上下文中符号用于指示对变量的访问;当计算表达式时,在适当的范围内,符号将替换为绑定到该符号的值1.3.用途:符号用于表示元编程中的变量;可将赋值、函数调用 、文本表达式表示成符号
2.1.创建:# 用:语法符号名称必须是有效标识符:foo # :foo# 有时需在参数周围加括号:以免在解析时产生歧义::(:) # :(:):(::) # :(::)#Symbol(x...) -> Symbol将参数字符串连接在一起来创建Symbol("foo") # 构造函数创建:#:fooSymbol("x", 1) # :x1Symbol(:var,'_',"sym")# :var_sym2.2.比较::foo===Symbol("foo") # 高效-只能比较指针 true
2.3.计算:实例1:显示标签内容foo="hello",eval(:foo)#"hello"x = 42,eval(:x) # 42实例2:更改标签内容sym = :foo# :foo eval(sym) #"hello"ex = :($sym = "world"; 1 + 2):(beginfoo = "world"1 + 2end)eval(ex)# 3foo # "world"
实例3:通过字符串调用函数time()fn = "time"
Symbol(fn)#:timegetfield(Main, Symbol(fn))()# 1.580791892769e9 ,相当于调用 time() 函数
eval(Meta.parse("$fn()")) # 1.591600693101e9 不安全
实例4:迭代递归动态调用函数fn = "deg2rad" # 将角度转为弧度# 为了获得最佳性能,必须使用常量绑定f
const f = getfield(Main, Symbol(fn))#进行const绑定function fast(n)t = 0.0for i = 1:nt += f(i)# 递归中使用endreturn t
end@time fast(10^6) # 第一次使用会执行JIT编译 0.001049 seconds
@time fast(10^6) # 第二次会更快 0.001006 seconds #查看代码执行情况
@code_llvm fast(100000)
# ...
# ; ┌ @ math.jl:245 within `deg2rad'
# ...# 如需在多个地方动态指定函数将函数f作为参数传递:
function fast(f,n)t = 0.0for i = 1:nt += f(i)endreturn t
end@time fast(getfield(Main, Symbol(fn)), 10^6)# 0.001661 seconds (6 allocations: 192 bytes)
@time fast(getfield(Main, Symbol(fn)), 10^6)#0.001014 seconds (2 allocations: 32 bytes)
这篇关于julia-符号标识符Core.Symbol(第12讲)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!