Я пытаюсь вызвать общий метод из конкретного, но не могу понять, как это сделать.
function fn(x)
# generic
...
end
function fn(x :: String)
# I want to call the generic version here
val = fn(x)
# do something with val and then return it
...
end
Это возможно?
Обходной путь заключается в использовании вспомогательной функции, которую можно вызывать как из общих, так и из специальных методов. например
function helper(x)
# main work is here
...
end
function fn(x)
# generic
helper(x)
end
function fn(x :: String)
val = helper(x)
# now use the val to do something
...
end
Есть ли способ управлять отправкой без использования таких помощников, чтобы выбрать конкретный метод для использования? Есть ли что-то вроде :before
и :after
ключевых слов и call-next-method
из лиспа CLOS в Джулии?
Вы можете использовать функцию invoke
:
julia> function fn(x)
@info "generic $x"
end
fn (generic function with 1 method)
julia> function fn(x :: String)
@info "before"
invoke(fn, Tuple{Any}, x)
@info "after"
end
fn (generic function with 2 methods)
julia> fn(10)
[ Info: generic 10
julia> fn("10")
[ Info: before
[ Info: generic 10
[ Info: after
(просто для ясности - печать "before"
и "after"
предназначена только для выделения того, что выполняется в какой последовательности - единственное, что здесь связано с отправкой метода, - это функция invoke
)
да, и этот шаблон очень часто используется в Джулии.
Чаще всего вы будете использовать invoke
, если вам нужно вызвать определенный метод в модуле, которым вы не владеете.
Обратите внимание, что, хотя вы можете это сделать, метод
helper
, вероятно, является гораздо лучшим решением.