Julia中对应Java类与实例变量的实现方案是什么?
Julia中避免重复传递结构体的实现方式
方法1:用闭包捕获实例
闭包能自动捕获外部作用域的结构体实例,让函数调用时不用重复传参:
struct Param foo::Int bar::Bool end function build_funcs(param::Param) g(n::Int) = n + param.foo h(n::Int) = n * param.foo + param.bar return g, h end # 使用示例 my_param = Param(5, true) g, h = build_funcs(my_param) println(g(3)) # 输出8 println(h(2)) # 输出11
这里g和h会记住my_param的内容,后续调用只需要传业务参数就行。
方法2:为自定义类型扩展方法(Julia惯用写法)
Julia的核心是多派发,更推荐的方式是为Param类型定义方法,或者用默认参数减少重复:
带默认参数的方法
如果有固定的默认配置,可以声明一个const的全局实例,给函数加默认参数:
struct Param foo::Int bar::Bool end const DEFAULT_PARAM = Param(5, true) # 加const避免性能损耗 g(n::Int, param::Param=DEFAULT_PARAM) = n + param.foo # 使用示例 println(g(3)) # 用默认参数,输出8 println(g(3, Param(10, false))) # 传自定义参数,输出13
把实例作为调用对象
可以让Param实例本身成为可调用的函数,写法更贴近“实例方法”的感觉:
struct Param foo::Int bar::Bool end # 定义实例的调用逻辑 function (p::Param)(n::Int) return n + p.foo end # 使用示例 my_param = Param(5, true) println(my_param(3)) # 输出8
关于“将函数包含在结构体内部”是否是常规做法?
Julia里不推荐把函数直接作为结构体字段,这不符合它的多派发设计哲学。Julia的方法是和类型绑定的,而不是封装在类型内部(像Java类那样)。
如果硬要这么写,虽然可行,但会丢失多派发的优势,性能也不如闭包或类型方法,只有在需要动态替换函数逻辑的特殊场景才会用到:
struct Param foo::Int bar::Bool g::Function end my_param = Param(5, true, n->n+5) println(my_param.g(3)) # 输出8
内容的提问来源于stack exchange,提问作者Brandon
相关产品推荐
相关产品推荐

