templates - Julia 函数签名和子类型,特别是 String、ByteString

标签 templates types julia dispatch

(使用 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/

相关文章:

Julia 中的 boolean 矩阵乘法

julia - 计算每个字母的单词数

c++ - 使用迭代器执行对象操作的函数

c++ - 当涉及参数包时,我可以依赖具有默认值的参数类型被推断为空包这一事实吗?

c++ - 将一串数字转换为任何形式的 int

mysql - Go SQL 驱动程序获取接口(interface){}列值

c++ - 用模板替换 boost::function 和 boost::bind

c++ - 如何学习c++泛型编程和模板?

c - 我们什么时候应该使用 stdint.h 中定义的整数类型?

parallel-processing - Julia:如何将数据复制到 Julia 中的另一个处理器