(我指的是朱莉娅0.5) 让我们说我定义一个函数:
class LocaleRepository extends EntityRepository
{
public function myCustomFunction()
{
....
}
}
我想在指定类型时调用它,但不通过参数指定它。例如。我想要做:
f{T<:Real}(x::T=one(T), y::T=one(T)) = x+y
在控制台中,这会给出错误:
f{Float64}()
那么,是否可以在函数调用期间使用
ERROR: TypeError: Type{...} expression: expected Type{T}, got #f
语法调用任何函数(除参数类型的构造函数外)?
编辑:我提出这个问题的原因是因为我想使用默认参数但同时指定类型,例如{}
。
答案 0 :(得分:4)
如果您不介意编写f(BigFloat)
而不是f{BigFloat}()
,则可以将函数定义更改为:
f{T}(args::T...) = f(T, args...)
f{T<:Real}(::Type{T}, x::T=one(T), y::T=one(T)) = x+y
允许您在必要时指定类型,同时仍允许您编写f(1,2)
。
答案 1 :(得分:2)
乔治,
当您调用参数化函数时,参数“拾取”的值由您放置在函数调用中的参数值[s]的类型[s]确定。信息流是从给定参数到符号类型参数。所以你不应该试着打电话给f{AbstractFloat}(some_kind_of_number)
。在这种情况下,some_kind_of_number
可以是例如Float64,那就是合适的;但它可能是例如Int64,然后你就发生了冲突。
如果要强制数字变量采用特定的数字类型,正确的方法是直接转换它或定义该情况的转换(如果它已经不存在)。如果你想捕获那种不匹配,那么正确的方法是传入你想要指定的类型和数字变量:
# below
# x is of type Real or of any subtype of Real
# T is Real or any type that is a subtype of Real
# so T may or may not equal typeof(x)
function f{T<:Real}(::Type{T}, x::Real)
y = convert(T, x)
return g(y)
end
function f{T<:Real}(::Type{T}, x::Real)
if typeof(x) == T
#...
else
throw(ErrorException("msg"))
end
end
如果你想要完成别的事情,请告诉我具体细节。