Джулия: определите метод для пользовательского типа

#methods #julia #custom-type

#методы #Джулия #пользовательский тип

Вопрос:

Прошу прощения, если на этот вопрос уже был дан ответ, я не нашел прямого ответа на этот вопрос в результатах поиска.

Я просматриваю «Learn Julia The Hardway» и не могу найти, в чем разница в моем коде по сравнению с примером в книге. Всякий раз, когда я его запускаю, я получаю следующую ошибку:

 TypeError: in Type{...} expression, expected UnionAll, got a value of type typeof( )
 

Вот код:

 struct LSD
    pounds::Int
    shillings::Int
    pence::Int

    function LSD(l,s,d)
        if l<0 || s<0 || d<0
            error("No negative numbers please, we're british")
        end
        if d>12 error("That's too many pence") end
        if s>20 error("That's too many shillings") end
        new(l,s,d)
    end
end

import Base. 
function  {LSD}(a::LSD, b::LSD)
    pence_s = a.pence   b.pence
    shillings_s = a.shillings   b.shillings
    pounds_s = a.pounds   b.pounds
    pences_subtotal = pence_s   shillings_s*12   pounds_s*240
    (pounds, balance) = divrem(pences_subtotal,240)
    (shillings, pence) = divrem(balance,12)
    LSD(pounds, shillings, pence)
end
 

Еще один быстрый вопрос, я еще не добрался до главы «функции», но мое внимание привлекает то, что в конце функций нет «возврата», я предполагаю, что если не указано, что функция вернет последнее оцененное значение, я прав?

Ответ №1:

Похоже, что здесь используется очень старый синтаксис Julia (я думаю, из версии 0.6). Я думаю, вы просто хотите function (a::LSD, b::LSD)

Комментарии:

1. Спасибо, Оскар, ты прав. Извините, я пока не могу проголосовать. Я думаю, это одно из предостережений при принятии молодого языка, такого как Julia. Тем не менее, я в восторге от этого!

2. Добро пожаловать в сообщество!. Julia 1.0 была выпущена в августе 2018 года, поэтому я бы порекомендовал попробовать использовать что-то новее. Все, начиная с версии 1.0 или новее, должно отлично работать в текущих версиях.

3. Я не думаю, что это было бы правильно, даже до версии 0.6. Он используется LSD как параметр типа, а не как тип, поэтому это никогда не было бы правильным.