我有大约 50 个函数,它们应该只消耗偶数正数。现在我每次都用“if”检查输入的数字是否为零:
function grof(x::Int)
if (x % 2) == 0
println("good")
else
throw("x is not an even number!!!!!!!!!!!!! Stupid programmer!")
end
end
理想情况下,我希望有一个自动生成此数据的数据类型,即
function grof(x::EvenInt)
println("good")
end
但是,我无法自己生成此数据类型,因为我无法理解记录 https://docs.julialang.org/en/v1/manual/types/index.html。感谢您的帮助!
Best, v.
我不认为在这种情况下创建一个类型是有必要的:我只是@assert https://docs.julialang.org/en/v1/base/base/#Base.@assert在函数开始时验证条件。 (有趣的是,检查一个数字是否为偶数是文档中选择的示例来说明@assert
)
例如:
julia> function grof(x::Int)
@assert iseven(x) "Stupid programmer!"
println("good")
end
grof (generic function with 1 method)
julia> grof(2)
good
julia> grof(3)
ERROR: AssertionError: Stupid programmer!
Stacktrace:
[1] grof(::Int64) at ./REPL[5]:2
[2] top-level scope at REPL[7]:1
编辑:如果你really想要创建一个强制执行这种约束的类型,这是可能的。这样做的方法是
- 创建一个类型(可能是其中一个的子类型
Number
抽象类型;或许Signed
)
- 定义一个内部构造函数,确保此类类型不能包含奇数值
一个非常简单的构建示例如下:
# A wrapper around an even integer value
struct EvenInt
val :: Int
# inner constructor
function EvenInt(val)
@assert iseven(val)
new(val)
end
end
# Accessor to the value of an EvenInt
val(x::EvenInt) = x.val
# A method working only on even numbers
grof(x::EvenInt) = println("good: $(val(x)) is even")
你可以像这样使用它:
julia> x = EvenInt(42)
EvenInt(42)
julia> grof(x)
good: 42 is even
julia> y = EvenInt(1)
ERROR: AssertionError: iseven(val)
Stacktrace:
[1] EvenInt(::Int64) at ./REPL[1]:5
[2] top-level scope at REPL[6]:1
但请注意,您无法执行任何操作EvenInt
还没有:你需要打开它们(使用val()
在这种情况下),或定义对它们的操作(如果您使该任务可以大大简化EvenInt
抽象数字类型之一的子类型并遵循相关接口)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)