rand
适用于范围:
rand(1:10)
我想做rand
与...一起工作Array
,以及任何可索引且具有length
:
import Base.Random
rand(thing) = thing[rand(1:length(thing))]
array = {1, 2, 3}
myRand(array)
range = 1:8
myRand(range)
tupple = (1, 2, 3, "a", "b", "c")
myRand(tupple)
…但是如果我尝试这样做,我的实现堆栈就会溢出,大概是因为它是完全通用的并且匹配传递的所有内容,所以它最终会调用自身?
有没有办法来解决这个问题?我想更好地理解 Julia 的多态函数,而不是修复这个特定的(可能是愚蠢的)函数专门化。
是否还有一个工具可以发现可用的各种实现,并调试将使用特定参数调用的实现?
好吧,一些挖掘。这很有趣…
我将启动一个新的 REPL,并且:
julia> import Base.Random
julia> rand(thing) = thing[rand(1:length(thing))]
rand (generic function with 1 method)
julia> rand({1,2,3})
ERROR: stack overflow
in rand at none:1 (repeats 80000 times)
…天哪,这就是我所说的递归调用和堆栈溢出。
但是,请注意这一点。我杀死 Julia 并再次启动 REPL。这次我import Base.Random.rand
:
julia> import Base.Random.rand
julia> rand(thing) = thing[rand(1:length(thing))]
rand (generic function with 33 methods)
julia> rand({1,2,3})
3
它有效 - 它将我的新实现添加到所有其他实现中,并选择了正确的实现。
所以,我的第一个问题的答案似乎是——“它确实有效”。这太棒了。这是如何运作的?!
但是有一个关于模块的听起来不太有趣的问题,为什么import Base.Random
不拉进来rand
方法或给出错误,但是import Base.Random.rand
does.