For now, Julia isn't so flexible in updating attributes based on other ones. But, gladfully, it's possible to simulate the expected behavior. For this, you need to define a custom getproperty
function. Suppose I have defined a mutable composite type as follows:
julia> Base.@kwdef mutable struct Param
x::Float64=0.1
end
Param
Now I want to settle the situation to simulate the expected behavior. For this, I go for defining a custom getproperty
function specifically for Param
:
julia> function Base.getproperty(the_type::Param, prop::Symbol)
if prop == :y
return 1/the_type.x
end
return getfield(the_type, prop)
end
Now I create an instance of type Param
holding the default value:
julia> instance = Param()
Param(0.1)
The output shows just the value of one field (x
). But meanwhile, we can have the y
property as we defined our custom getproperty
function recently:
julia> instance.y
10.0
Now let's update the x
field and observe if the y
field gets updated automatically or not:
julia> instance.x = 0.2
0.2
julia> instance.y
5.0
Yes, it does!
Further setting
But still, I can't utilize the autocomplete ability of the REPL by hitting the Tab key to write instance.y
. For this, I can define a custom propertynames
function specifically for my composite type Param
:
julia> Base.propertynames(the_type::Param) = (:x, :y)
julia> instance. #Hit Tab
x y
Now I can benefit from the autocomplete option in the REPL for y
as well.