2017-10-05 9 views
0

として複合型のフィールドを渡すと、私はそれではなく、オブジェクト全体のfieldに取ることができることをtestFunc2!このような機能を作成する次の例ジュリア:引数

struct valueStruct 
    a::Vector{Float64} 
    a2::Vector{Float64} 
end 

values = valueStruct(ones(10), ones(10)); 
values2 = 1:10; 

function testFunc!(values, values2) 
    values.a .= values.a .* values2; 
end 

を考えてみましょう。例:testFunc2!(values.a, values2)。しかし、私はこのエラーが発生し続ける:

LoadError: LoadError: syntax: "values.a" is not a valid function argument name

私の実際のコードではtestFunc!をループの中で再帰的に構造体valuesに適用したいと思います。 testFunc!(values.a2, values.a)

function testFunc!(values, values2, n) 
    values.a .= values.a .* values2; 
    for i = 1:n 
     values.a2 .= values.a; 
    end 
end 

しかし、それは私が欲しいものではないことを私は知っています。実際のコードでは、型のフィールドに適用できるような柔軟な関数を用意する必要があります。それは可能ですか?

答えて

1

私はこの問題を理解していません。これは正常に動作します:

struct ValueStruct 
    a::Vector{Float64} 
    a2::Vector{Float64} 
end 

function testfunc!(a, b) 
    a .*= b 
end 

values = ValueStruct(ones(10), ones(10)) 
values2 = 1:10 
testfunc!(values.a, values2) 

がところで:ValueStruct、ないvalueStruct:そのタイプ名は大文字べきであるジュリアに強い慣例があります。関数名はすべて小文字でなければならないという慣習もありますが、それはそれほど厳密ではないようです。