我想创建一个创建新变量的函数,我的目标是:
struct Test
setArg(varName,Float64,10.1,1.2)
end
应该返回一个结构体Test
和一个参数varName
,来自类型Float64
,最大10.1
和最小1.2
。我的问题是知道如何使该函数返回一个变量。
或者我想用另一种方法:
struct Test
varName::setArg(Float64,10.1,1.2)
end
这里的函数应该只定义一个类型和参数的max和min,这是可以的,但如果Julia可以这样做,我更喜欢第一个。
所以问题是我的函数/类型setArg
应该是什么样的?
您可以创建一个不完整的可变结构体:
struct MyTest{T} #to allow different types while maintaining performance
min::T
max::T
val::T
valueset::Bool #to check if the struct is initialized
sym::Symbol #to access
end
允许用户使用提供的标识符访问值,我们为MyTest
结构体重载Base.getproperty
:
function Base.getproperty(val::MyStruct, sym::Symbol)
#identifier matches and the value was set
if val.sym==sym & val.valueset
return val.val
else
throw(error("oops")
end
end
最后,用setArg:
创建结构体function setArg(sym, type, min, max)
min = convert(type, min)
max = convert(type, max)
dummyval = zero(type) #
return MyTest(min, max, dummyval, false, sym)
end
最后,通过调用结构体:
创建一个设置值的函数。function (val::MyTest)(value) #a functor
if val.min <= value <= val.max
val.val = value
val.valueset = true
else
throw(error("out of bounds"))
end
return val
end
我想象用例是这样的:
constructor = setArg(:myname, Float64, 0.2, 0.5)
val1 = constructor(0.4)
val2 = constructor(0.5)
val3 = constructor(0.6) #error
val2.myname == 0.5