2017-10-05 23 views
0

考慮下面的例子朱莉婭:傳遞的複合類型的字段作爲參數

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!,使得它可以在一個field而不是整個對象。例如:testFunc2!(values.a, values2)。但是,我不斷收到此錯誤:

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

我想這樣做是因爲在我的實際代碼中,我想遞歸地在結構values的循環中應用testFunc!,例如, 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) 

BTW:有一個在朱莉婭硬性約定類型名稱應該大寫:ValueStruct,不valueStruct。還有一個約定,函數名應該全部小寫,儘管這似乎不太嚴格。