В Юлии у меня есть своя структура, скажем MyNumber
. Я хотел бы определить оператор, например. оператор продукта *
для моей структуры. Вот что я пробовал.
struct MyNumber
name::String
value::Int
end
x1 = MyNumber("postive", 4)
x2 = MyNumber("postive", 3)
# define product operator for MyNumber
a::MyNumber * b::MyNumber = MyNumber("no_name", a.value + b.value)
y = x1*x2
println(y) # ok here, output: MyNumber("no_name", 7)
Это работает очень хорошо. Однако, когда я пытаюсь применить продукт более чем к 2 входам, например. z=x1*x2*x1*x2*x2
, у меня ошибка. Как мне поступить в таком случае?
Вот правильный способ определения оператора *
для пользовательского типа данных:
import Base.:*
struct MyNumber
name::String
value::Int
end
x1 = MyNumber("postive", 4)
x2 = MyNumber("postive", 3)
# define product operator for MyNumber
Base.:*(a::MyNumber, b::MyNumber)::MyNumber = MyNumber("no_name", a.value + b.value)
y = x1*x2
println(y) # ok here, output: MyNumber("no_name", 7)
Оператор должен быть явно импортирован из пакета Base.
Редактировать: поскольку я использовал Base.:*
в определении метода, нет необходимости явно импортировать оператор, как указано ниже.
да, извините, первая строка на самом деле не требуется, так как я явно определил метод с помощью Base.: *
Чтобы добавить к ответу jbytecode, причина, по которой ваш исходный код не работает, заключается в том, что вы определяете новую функцию *
в основном модуле вместо расширения функции Base.:*
.
Base.:*
имеет много методов, один из которых обрабатывает такие выражения, как a*b*c
.
Определенная вами функция имеет только 1 метод для *(MyNumber,MyNumber)
На самом деле такое определение функции до того, как вы запустите какой-либо *, сломает использование * для других типов ниже в вашем коде. (И если вы использовали * перед определением своего собственного * , Джулия попросит вас импортировать Base.:*, чтобы расширить его)
мерси и 1 голос вверх!
import Base.:*
в этом случае не нужен, так как вы все равно добавляете к нему префиксBase.
при определении метода.