内部构造函数调用的函数如何获取所属struct类型(等价this实现)
实现方案
你可以通过两种常用方式实现需求,第一种是性能最优的显式传参方案,第二种是无需修改调用侧的栈回溯方案:
方案1:显式传入类型标识(最为推荐)
这种方式无额外运行时开销,也不会受代码编译优化影响,实现最简单:
# 修改foo函数,新增类型参数 function foo(arg, struct_type) println("当前被调用的struct是:", struct_type) # 其余原有逻辑 end struct A arg function A(arg) # 调用时传入当前struct的类型 foo(arg, A) return new(arg) end end struct B arg function B(arg) foo(arg, B) return new(arg) end end
测试效果:
julia> A(1) 当前被调用的struct是:A A(1) julia> B(2) 当前被调用的struct是:B B(2)
方案2:通过栈回溯自动获取(无需修改调用侧代码)
如果不能改构造函数里的foo调用写法,可以用stacktrace()读取调用栈信息实现:
function foo(arg) # 读取调用栈,第2帧就是调用foo的上层函数(第1帧是foo本身) st = stacktrace() caller_func_name = st[2].func # Julia内部构造函数的名称和struct名一致,直接提取即可 println("当前被调用的struct是:", caller_func_name) # 其余原有逻辑 end struct A arg function A(arg) foo(arg) return new(arg) end end struct B arg function B(arg) foo(arg) return new(arg) end end
注意:栈回溯方案会有一定性能损耗,且如果代码开了激进的编译优化可能会导致调用栈信息丢失,生产环境更推荐方案1
内容的提问来源于stack exchange,提问作者ahm5
相关产品推荐
相关产品推荐

