我有大约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
但是,由于我无法理解该纪录片,因此我无法自行生成此数据类型。谢谢你的帮助!
最佳v。
在这种情况下,我认为创建类型不是必需的:我只是简单地@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
将抽象数之一作为子类型,则可以大大简化此任务类型并遵循相关界面)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句