function - 如何制作一个创建变量的函数?
问题描述
我想创建一个创建新变量的函数,我的目标是:
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
样子?
解决方案
您可以创建一个不完整的可变结构:
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.getproperty
为MyTest
结构重载:
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
推荐阅读
- angular - Firebase Cloud FireStore 数据更新错误
- java - GoogleApiClient.ConnectionCallbacks [已弃用] android studio
- node.js - 错误监听 EADDRINUSE: 地址已在使用 :::19000
- python - 如何在 Django 中将条件放入 ALL 或 Something 的链式过滤器中
- objective-c - 我们可以在使用 DICOM 导入记录时设置多个 DCM_SpecificCharacterSet 吗?
- logging - boost::filesystem::create_directories: 功能未实现
- python - 当我点击一个用 html(vs code) 编写的按钮时,它将运行一个用 python 编写的代码。我可以这样做吗?
- kendo-ui - 减小 kendo Scheduler 框的大小
- mysql - 数据库或数据仓库中的事实表和暗表?
- javascript - Angular 7 添加 innerHTML 动态绑定