(使用 Julia 0.3.11)
我在正确地对某些代码进行类型注释时遇到了麻烦,在初始版本中,我们一直使用 ASCIIString
- 注释任何字符串,以“避免”抽象类型,但让我们从示例开始,这可能与我在此处的一些讨论中看到的“三角调度”有关:
# How to type annotate this (sortof "Dictionary with default)
function pushval!(dict, key, val)
key in keys(dict) ? push!(dict[key], val) : dict[key] = [val]
return dict
end
d1 = Dict{ASCIIString, Vector{Int}}()
d2 = Dict{String, Vector{Int}}()
pushval!(d1, "a", 1)
pushval!(d2, "a", 1)
好的(首先 - 如果有更惯用的方法来构造带有默认值的字典,在本例中是一个空数组,我很想听听)
现在,我尝试输入注释:
function pushval!{K, V} (dict::Dict{K, Vector{V}} , key, val)
更多的文档和工作。 但现在来了更棘手的部分 - 我希望“key”是 K 的任何子类型,而 val - V 的任何子类型(对吗?)例如 - 我想制作一个 String 字典 - 这是一个抽象类型,但是使用具体键 - ASCIIString/ByteString/UTF8String,
我认为我应该写以下内容之一:
function pushval!{K, V} (dict::Dict{K, Vector{V}} , key::KK <: K, val:: VV <: V)
function pushval!{K, V, KK <: K, VV <: V} (dict::Dict{K, Vector{V}} , key::KK, val::VV)
一种解决方案是( Can I use a subtype of a function parameter in the function definition? )中建议的带有“转换”的内容。
但这整件事让我对我正在编写的 Julia 代码感到好奇,我已经开始编写一个系统 - 使用 String、FloatingPoint、Number 和此类抽象类型,当我实际尝试运行它时,我已经恢复了将所有内容转换为具体类型只是为了让现在运行......
是否有推荐的代码库可供阅读,作为惯用的 Julia 代码的引用? 甚至就像 Julia 的字典分配运算符的实现一样。标准库中是否有一部分可以作为引用?谢谢
最佳答案
虽然我不太喜欢这个解决方案(性能低下),但它可能会有所帮助:
function pushval!{K, V} (dict::Dict{K, Vector{V}} , key , val)
fun = function inner{tt1<:K,tt2<:V}(key::tt1,val::tt2)
key in keys(dict) ? push!(dict[key], val) : dict[key] = [val]
return dict
end
return fun(key,val)
end
# => pushval! (generic function with 1 method)
d1 = Dict{ASCIIString, Vector{Int}}()
# => Dict{ASCIIString,Array{Int32,1}} with 0 entries
d2 = Dict{String, Vector{Int}}()
# => Dict{String,Array{Int32,1}} with 0 entries
pushval!(d1, "a", 1)
# => Dict{ASCIIString,Array{Int32,1}} with 1 entry:
# "a" => [1]
pushval!(d2, "a", 1)
# => Dict{String,Array{Int32,1}} with 1 entry:
# "a" => [1]
关于templates - Julia 函数签名和子类型,特别是 String、ByteString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32934222/