Есть несколько способов достичь этого. Проще всего было бы просто пропустить тип a
T, тогда ваш метод выглядел бы так:
function twice(a) a + a end
Это эквивалентно
function twice(a::Any) a + a end
Но, возможно, вы не хотите чтобы определить это для всех типов, или у вас уже есть другое определение для twice(a::Any)
, так что вы можете ограничить свое определение общим супертипом Int64
и Float64
. Этот общий супертип можно найти с помощью typejoin(Float64, Int64)
и даст результат Real
, поэтому ваше определение теперь будет
function twice(a::Real) a + a end
. Это также создает метод для других подтипов Real
, таких как a::Int32
, так что если вы действительно хотите метод только для Int64
и Float64
, вы можете создать тип объединения. Тогда метод будет выглядеть следующим образом:
function twice(a::Union{Int64, Float64}) a + a end
Наконец, действительно возможно достичь того, чего вы хотели достичь с помощью макроса. В этом случае это не имеет смысла, но в более сложных случаях часто используется либо функция eval
, либо макрос @eval
. Ваш код может выглядеть следующим образом:
for T in (Int64, Float64)
@eval function twice(a::$T) a + a end
end
Если вы только начали изучать Юлию, я бы не советовал использовать eval
, так как с использованием eval
связаны некоторые опасности / анти-паттерны. .