我有大约50个函数,它们应该只使用偶数正数。现在,我每次都用"如果"来检查输入的数字是否为零:
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
然而,由于我无法理解这部纪录片,我无法自己制作这种数据类型。谢谢你的帮助!
Best诉
在这种情况下,我不认为创建类型是有必要的:我只需要@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
编辑:如果真的想要创建一个强制执行此类约束的类型,这是可能的。这样做的方法是
- 创建一个类型(可能是
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
s执行任何操作:您需要打开它们(在本例中使用val()
(,或者定义对它们的操作(如果您将EvenInt
作为抽象数字类型之一的子类型并遵循相关接口,则可以大大简化此任务(。
所有整数乘以2都是偶数,因此重新定义函数,使其取当前数的一半。
function grof2(halfx::Int)
x=2*halfx
println("good")
end