【问题标题】:Getting default value for certain DataType in Julia在 Julia 中获取某些 DataType 的默认值
【发布时间】:2022-08-11 08:29:12
【问题描述】:

有没有办法获得具有DataType 的默认值?

“默认”是指类似于 Golang 的东西:

var message string
// Default value: \"\"

var age int
// Default value: 0

var isValid bool
// Default value: false

我试图以同样的方式在 Julia 中做到这一点:

function get_default_value(t::DataType)
    x::t
    return x
end

function main()
    println(get_default_value(Integer))
end

main()

但得到了UndefVarError: x not defined

任何想法如何做到这一点?

    标签: julia


    【解决方案1】:

    我首先要澄清的一个误解是x::Int 没有定义一个名为x 的新Int 变量,它断言x 包含的值是Int 类型。那条线是不是创建一个名为x 的新变量。

    此外,变量本身在 Julia 中通常没有固有类型,因此您不能为变量设置默认值。 (有a couple of ways 将变量声明为仅包含特定类型的值,但即使是那些也仅声明变量名称,而不将它们定义为存在;因此,那里也没有默认值。)

    我在下面提到的函数对类型进行操作,并定义“加法身份”和“乘法身份”而不是默认值。当其他语言为其变量提供默认值时,它们通常倾向于使用该类型的加法标识,因此在大多数情况下,zero 填补了该角色。

    因此,要获得与您提到的结果相似的结果,zero 适用于数字类型、Date 类型等。

    julia> zero(Dates.Time)
    0 nanoseconds
    
    julia> zero(Bool)
    false
    
    julia> zero(Int)
    0
    
    julia> zero(Float64)
    0.0
    

    zero 没有为 String 类型定义,因为你使用 one 方法:

    julia> one(String)
    ""
    
    julia> one(Int)
    1
    
    julia> one(Bool)
    true
    

    原因是 Julia 中的字符串连接是使用 * 运算符完成的,而 one 是 Julia 中返回 * 的标识(“默认”)值的函数。

    还有在某些情况下有用的oneunit 函数。

    【讨论】:

    • 谢谢!有没有办法知道zero 在调用它之前是为给定的DataType 定义的?
    • 是的,您可以使用hasmethod 函数:hasmethod(zero, Tuple{String}) 返回falsehasmethod(one, Tuple{String}) 返回true
    • 我建议强调这个问题的主要答案:那里Julia 中的大多数类型都没有默认值。只有当 T 类型的方法 T() 时,才会有类似的东西。 zero 是一个合理的替代值,但它并不是真正的默认值。
    • @DNF 我已根据您的建议重新安排了答案,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 2021-09-16
    • 1970-01-01
    相关资源
    最近更新 更多