首页 > 解决方案 > 如何制作一个创建变量的函数?

问题描述

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

   struct Test

  setArg(varName,Float64,10.1,1.2)

   end

这应该返回一个结构Test,其中一个参数varName来自Float64具有 max10.1和 min的类型1.2。我的问题是知道如何使该函数返回一个变量。

或者我正在考虑采用这样的另一种方法:

struct Test

      varName::setArg(Float64,10.1,1.2)

  end

在这里,函数应该只为参数定义一个类型和最大值和最小值,这没关系,但如果可以在 Julia 中做到这一点,我会更喜欢第一个。

所以问题是我的函数/类型应该是什么setArg样子?

标签: functionstructtypesjulia

解决方案


您可以创建一个不完整的可变结构:

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

为了允许用户使用提供的标识符访问值,我们Base.getpropertyMyTest结构重载:

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

推荐阅读