Как в Julia определить оператор для более чем двух структур?

В Юлии у меня есть своя структура, скажем 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, у меня ошибка. Как мне поступить в таком случае?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
201
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вот правильный способ определения оператора * для пользовательского типа данных:

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.:* в определении метода, нет необходимости явно импортировать оператор, как указано ниже.

import Base.:* в этом случае не нужен, так как вы все равно добавляете к нему префикс Base. при определении метода.
Bogumił Kamiński 25.12.2022 18:28

да, извините, первая строка на самом деле не требуется, так как я явно определил метод с помощью Base.: *

jbytecode 25.12.2022 18:33

Чтобы добавить к ответу jbytecode, причина, по которой ваш исходный код не работает, заключается в том, что вы определяете новую функцию * в основном модуле вместо расширения функции Base.:*.

Base.:* имеет много методов, один из которых обрабатывает такие выражения, как a*b*c.

Определенная вами функция имеет только 1 метод для *(MyNumber,MyNumber)

На самом деле такое определение функции до того, как вы запустите какой-либо *, сломает использование * для других типов ниже в вашем коде. (И если вы использовали * перед определением своего собственного * , Джулия попросит вас импортировать Base.:*, чтобы расширить его)

мерси и 1 голос вверх!

Leonard Neon 25.12.2022 19:12

Другие вопросы по теме