复制 Julia 示例
Replicating a Julia example
我正在尝试学习 Julia,并且我阅读了 this article 关于 Julia 快速成功的文章。在文章的最后一页,作者做了一个小例子来展示多重分派的好处。他们定义了一个自定义的 class Spect
并为其定义了一个 plot()
函数。然后,对于类型为 Spect
的对象 sqw
,他们可以调用 plot(sqw)
而无需编辑原始绘图函数。此外,此定义还会影响类似的绘图功能,因此您也可以毫无问题地调用 scatter(sqw)
。我的问题是作者没有显示代码,所以我不明白你怎么能做到这一点。我特别感兴趣的是,只需为这个新的 class 定义 plot()
就足以调用其他函数,如 scatter()
而无需为新的 class.[= 定义它们19=]
谁能像文章那样写一个这样的小例子,让我明白这一切是如何实现的?提前谢谢你。
交叉发布我在 Discourse 中的回答:
很遗憾这篇文章没有 link 代码。这是我粗略的复制尝试。我的版本使用了 dct 和 idct,所以我没有得到很好的谐波,但我认为它很好地展示了这些想法。
using RecipesBase, FFTW
struct Spect
points :: AbstractRange
weights :: Vector{Float64}
end
function Spect(f::Function, min, max, n)
points = range(min, max, n)
Spect(points, dct(f.(points)))
end
@recipe function f(S::Spect)
S.points, idct(S.weights)
end
这些定义足以
using Plots
squarewave(x) = iseven(floor(x)) ? 1.0 : 0.0
sqw = Spect(squarewave, 0, 5, 20);
plot(sqw)
scatter(sqw)
和
我正在尝试学习 Julia,并且我阅读了 this article 关于 Julia 快速成功的文章。在文章的最后一页,作者做了一个小例子来展示多重分派的好处。他们定义了一个自定义的 class Spect
并为其定义了一个 plot()
函数。然后,对于类型为 Spect
的对象 sqw
,他们可以调用 plot(sqw)
而无需编辑原始绘图函数。此外,此定义还会影响类似的绘图功能,因此您也可以毫无问题地调用 scatter(sqw)
。我的问题是作者没有显示代码,所以我不明白你怎么能做到这一点。我特别感兴趣的是,只需为这个新的 class 定义 plot()
就足以调用其他函数,如 scatter()
而无需为新的 class.[= 定义它们19=]
谁能像文章那样写一个这样的小例子,让我明白这一切是如何实现的?提前谢谢你。
交叉发布我在 Discourse 中的回答: 很遗憾这篇文章没有 link 代码。这是我粗略的复制尝试。我的版本使用了 dct 和 idct,所以我没有得到很好的谐波,但我认为它很好地展示了这些想法。
using RecipesBase, FFTW
struct Spect
points :: AbstractRange
weights :: Vector{Float64}
end
function Spect(f::Function, min, max, n)
points = range(min, max, n)
Spect(points, dct(f.(points)))
end
@recipe function f(S::Spect)
S.points, idct(S.weights)
end
这些定义足以
using Plots
squarewave(x) = iseven(floor(x)) ? 1.0 : 0.0
sqw = Spect(squarewave, 0, 5, 20);
plot(sqw)
scatter(sqw)
和