tomtom
1
we know that optional positional arguments must occur at end, however, functions like zeros()
and ones()
seems to violate the rule:
zeros([T=Float64,] dims...)
ones([T=Float64,] dims...)
I tried to understand how it works, but the source tells me nothing:
function zeros end
function ones end
what’s the trick? thanks
tomtom
2
what I could imagine is to define two functions:
function ones(T::Type, dims...)
# some code depends on T
end
function ones(dims...)
# some code with the knowledge of "T == Float64"
end
is it the way to do?
I think that is correct.
for (fname, felt) in ((:zeros, :zero), (:ones, :one))
@eval begin
$fname(dims::DimOrInd...) = $fname(dims)
$fname(::Type{T}, dims::DimOrInd...) where {T} = $fname(T, dims)
$fname(dims::Tuple{Vararg{DimOrInd}}) = $fname(Float64, dims)
$fname(::Type{T}, dims::NTuple{N, Union{Integer, OneTo}}) where {T,N} = $fname(T, map(to_dim, dims))
$fname(::Type{T}, dims::NTuple{N, Integer}) where {T,N} = fill!(Array{T,N}(undef, map(to_dim, dims)), $felt(T))
$fname(::Type{T}, dims::Tuple{}) where {T} = fill!(Array{T}(undef), $felt(T))
end
end
1 Like
Yes, pretty much.
ones(dims...) = ones(Float64, dims...)
1 Like