2017-08-02 28 views
0

如何调用函数dxdt?我不知道如何定义p作为调用函数的参数。如何从Julia中的函数调用参数列表

type Params 
    a::TypeOfA 
    b::TypeOfB 
    c::TypeOfC 
end 

_unpack(p::Params) = (p.a, p.b, p.c) 

function dxdt(x, p::Params) 
    a, b, c = _unpack(p) 
    a*x^2 + b*x + c 
end 
+3

这对我来说并不明显,你在这里问。你提供的代码运行得很好(假设'a','b'和'c'是'Number'的子类型)。例如,如果'a','b'和'c'为'Int',则'dxdt(10,Params(1,2,3))'有效。 –

+0

例如params有很多变量,当我想调用函数时我不想写所有的变量,我该怎么办? – ReD

+1

'dxdt(x,p :: Params)= p.a * x^2 + p.b * x + p.c' < - 这样做有什么问题吗? –

回答

1

是你的问题,你是如何定义Params类型的变量p? 对于= 1.0,B = 2.0,C = 3.0:

p = Params(1.0,2.0,3.0) 

可在下列方式使用:

type Params 
     a::Float64 
     b::Float64 
     c::Float64 
end 

p = Params(1.0,2.0,3.0) 

_unpack(p::Params) = (p.a, p.b, p.c) 

function dxdt(x, p::Params) 
     a, b, c = _unpack(p) 
     a*x^2 + b*x + c 
end 

dxdt(1.0,p) 
6.0 

我想这就是你在问什么,但我不当然。

1

结账Parameters.jl。它有一个用更多的糖和更少的打字来做到这一点的宏。我想这就是你要找的东西?

using Parameters 

@with_kw type A 
    a::Int = 6 
    b::Float64 = -1.1 
    c::UInt8 
end 

# Safe Way 
function dxdt(x, p) 
    @unpack a,b,c = p # This works on any type 
    a*x^2 + b*x + c 
end 

# Easy Way 
function dxdt(x, p) 
    @unpack_A p # This only works on instances of A 
    a*x^2 + b*x + c 
end 
+0

你为什么要告诉'安全的方式'?如何以及为什么在第一个时候用'@'调用一个函数? – ReD

+1

编程时通常认为更为安全。 '@unpack_A p'不会告诉你(在那个函数内部)究竟是什么值被解压缩,因为它是自动的。这使得它更容易覆盖意外事件。 –

相关问题