如何使一个函数创建一个变量?



我想创建一个创建新变量的函数,我的目标是:

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

相关内容

  • 没有找到相关文章

最新更新