for循环中的重载功能

时间:2015-10-06 18:31:44

标签: julia

假设我想实现一个提供自定义向量类的模块,并为它重载所有基本的一元操作(round,ceil,floor,...)。在朱莉娅,这应该是相当简单的:

module MyVectors
export MyVector
immutable MyVector{T} data::Vector{T} end

# This is the tricky part
for f in (:round, :ceil, :floor)
    @eval Base.$f(x::MyVector) = MyVector($f(x.data))
end

end

不幸的是,这不起作用。我收到以下错误:

ERROR: error compiling anonymous: syntax: prefix $ in non-quoted expression
 in include at ./boot.jl:245
 in include_from_node1 at ./loading.jl:128
while loading /home/masdoc/Desktop/Julia Stuff/MyVectors.jl, in expression starting on line 6

问题似乎是Base.$f部分,因为如果我删除Base.,那么它就会编译。我想重载Base.round而不是创建新的round方法,因此这不是一个有效的解决方案。

1 个答案:

答案 0 :(得分:1)

Requests.jl可能是您尝试做的一个很好的例子,循环符号以生成函数。以下是使循环工作的方法:

module MyVectors
export MyVector
immutable MyVector{T} data::Vector{T} end

# This is the tricky part
for f in (:round, :ceil, :floor)
    @eval (Base.$f)(x::MyVector) = MyVector(($f)(x.data))
end

end

using MyVectors
v = MyVector([3.4, 5.6, 6.7])

println(round(v))
println(ceil(v))
println(floor(v))

您可能还会发现有关元编程的this视频和julia中的宏很有用。