Обычно каждый хочет определить их типы строгими и оставляя свободные ограничения типа для методов (так как последние будут автоматически специализироваться, поэтому нет увеличения производительности). Таким образом, я знаю, что для определения функций использование ::Base.Callable
является хорошей практикой. Однако, как насчет хранения функций внутри типов?Хранение функций внутри типов
В v0.5, Function
и Base.Callable
являются абстрактными типами, и поэтому типа
type TestType
f::Base.Callable # or ::Function
end
не будет строго типизированным. Его можно было бы строго напечатать, используя
type TestType{T<:Base.Callable}
f::T
end
, который затем будет производить разные типы для каждой функции.
Каковы преимущества и недостатки различных подходов? Похоже, что второй метод заставит любой g(t::TestType)
перекомпилировать для каждой функции ввода, тогда как первый метод не будет иметь строго типизированный код f
. Так будет второй лучше, если вы хотите встроить функции (и эти типы «довольно постоянны»), и первое будет лучше, если вы будете много менять функции? Или я переусердствую это?
Лично я пошел бы дальше и рекомендовал 'Any' вместо' Base.Callable', чтобы захватить такие ситуации, как 'Polynomial'. –
Да, это компромиссы. Не уверен, что за этим стоит ответ. –