Julia 朱莉娅:有两种输出类型的函数不工作

Julia 朱莉娅:有两种输出类型的函数不工作,julia,Julia,我有一个函数,它接受Float64类型或CValue类型(这是我定义的自定义类型) 该功能的形式如下: function _Ke(T,ρ,kf,r1,r2,r3) Ke[r1] = _Ke_r1(T,ρ)*(1.0E-06) kb[r1] = _kb_r1(kf[r1],Ke[r1],ρ) Ke[r2] = _Ke_r2(T)*(1.0E-06) kb[r2] = _kb_r2(kf[r2],Ke[r2],ρ) Ke[r3] = _Ke_r3(T)*(1.

我有一个函数,它接受
Float64
类型或
CValue
类型(这是我定义的自定义类型)

该功能的形式如下:

function _Ke(T,ρ,kf,r1,r2,r3)
    Ke[r1] = _Ke_r1(T,ρ)*(1.0E-06)
    kb[r1] = _kb_r1(kf[r1],Ke[r1],ρ)
    Ke[r2] = _Ke_r2(T)*(1.0E-06)
    kb[r2] = _kb_r2(kf[r2],Ke[r2],ρ)
    Ke[r3] = _Ke_r3(T)*(1.0E-06)
    kb[r3] = _kb_r3(kf[r3],Ke[r3],ρ)
    return Ke, Kb
end
其中
kf
在本例中由
one(Float64,Nr)
初始化,其中
Nr=3

我正在尝试设置函数,以便它可以根据函数的输入将
Ke
kb
输出为Float64或CValue,但声明:

Ke = Vector{CValue}(undef,Nr)
kf = Vector{CValue}(undef,Nr)
在调用此函数之前,当我希望只使用Float64而不是CValue的值时,它似乎会影响函数。 删除它们会产生错误:
error:LoadError:UndefVarError:Ke未定义


如何修改我的函数,使其能够无缝地接受Float64或CValue,而无需在函数中明确引用这两个值?

要学究式地使用词汇。 您需要为
函数设置
方法

julia
根据提供的类型在函数上分派方法

在简单的英语中,这意味着函数是具有可以调用的名称的东西。每个函数至少需要一个方法。方法是具有指定类型的函数

要在两个场景中使用一个函数,每个场景使用一种类型,您真正需要做的是写下函数两次。 每种类型一次

为了澄清这一点,最好在参数列表的开头或结尾写下您分派的主要类型。我只是把它放在最后

function _Ke(T,ρ,r1,r2,r3,kf::CValue)
    return kF*foo
end
function _Ke(T,ρ,r1,r2,r3,kf::Float64)
    return kF*foo
end

我假设您的目标是让输入参数的类型决定输出类型。我还假设CValue是一种浮点数;但是,如果不是这样,您可以删除或修改“where”条款以满足您的需要

您可以通过以下方式执行此操作:

function foo(a::T) where {T<: AbstractFloat}
    return Vector{T}(undef, 5)
end

# here is how your type could be defined:
struct CValue <: AbstractFloat
    c::Int64
    v::Int64
end

#and you could call your function in these ways:
foo(3.)
foo(CValue(2,4))

函数foo(a::T)其中{TCan您可以澄清一下:
Ke
Kf
是否可以同时包含
Float64
CValue
,或者是一个还是另一个?输出类型依赖于什么,它们依赖于输入值还是输入类型?因此,我使用了两组变量:bkb、bkf和bKe是Float64 kb类型,Kf和Ke是Float64 kb类型C值它们将是一个或另一个。抛出错误的原因是您试图更改
Ke
Kf
的内容,但它们不会出现在参数中。如果这些是全局变量,则将它们作为第一个参数放入,并明确表示您将更改它们(Julia约定使用bang(
)在函数名的末尾)。什么是
bkb
bkf
bKe
?它们不会出现在您的代码示例中。到目前为止,我避免编写重复的函数。当我明确定义Ke和kb数组中的值时,该函数通常会工作,即编写
Ke_
,而不是Ke>[r1]
,并让函数返回一长行
Ke
kb
值,这是我试图避免的