2017-02-19 24 views
2

Я создал мой неизменны Tensor_field и функция nabla, которая действует на тензор (т.е. nabla(a::Tensor_field) = do somethingМогу ли я добавить метод к функции для получения в качестве аргумента другой конкретной функции?

Я добавил метод функционировать dot для тензора:.. Base.dot(a::Tensor_field, b::Tensor_field) = do something...

Теперь я хочу определить новое поведение для функции dot с nabla в качестве аргумента. что-то вроде Base.dot(nabla::function, a::Tensor_field) = do something different.

Я знаю, в Джулии мы можем передавать функции в качестве аргументов других функций, но я не мог найти в документы, как определить метод для «функционального» аргумента.

Если я печатаю typeof(nabla) выход My_Module_Name.#nabla, а не реальный DataType ...

+2

Просто уточнить: 'My_Module_Name. # Nabla' _is_ настоящий DataType. Имя является странным и не может быть нормально доступным (поскольку '#' запускает комментарий), но все равно можно получить доступ через 'getfield (My_Module_Name, Symbol (" # nabla "))'. –

ответ

5

Если вы хотите, чтобы работать любой функции, вы можете сделать

Base.dot(f::Function, a::Tensor_field) = do something different 

Если вы только хотите, чтобы он работал для функции nabla, которая уже определена, вы можете воспользоваться тем, что обнаружили, а именно, что каждая функция имеет уникальный тип:

Base.dot(f::typeof(nabla), a::Tensor_field) = do something different 

Это будет соответствовать только функцию под названием nabla, которая теперь будет называться f внутри функции dot.

Обратите внимание, что вы можете написать ∇ как \nabla<TAB> и использовать его в своем коде вместо слова nabla. Если ваше тензорное поле вызывается, например. (написано как \mbfv<TAB>), вы можете написать ∇⋅ в своем коде Юлии! (Центрированная точка написана как \cdot<TAB> и является псевдонимом для функции dot.)