Обновите это утверждение для Юлии 1.0 - PullRequest
0 голосов
/ 11 мая 2019

Может кто-нибудь объяснить, как обновить это для Julia 1.0

function _encode_zigzag{T <: Integer}(n::T)
    num_bits = sizeof(T) * 8
    (n << 1) ⊻ (n >> (num_bits - 1))
end

А также в чем разница:

function _encode_zigzag(n::Integer)
    num_bits = sizeof(T) * 8
    (n << 1) ⊻ (n >> (num_bits - 1))
end

1 Ответ

2 голосов
/ 11 мая 2019

Во-первых, в Julia 1.x ограничения подтипа для параметров типа указываются после параметров и сопровождаются зарезервированным словом where.

function _encode_zigzag(n::T) where {T <: Integer}
    num_bits = sizeof(T) * 8
    (n << 1) ⊻ (n >> (num_bits - 1))
end

Фигурные скобки не нужны, когда есть только один тип параметра, но рекомендуется сохранить для ясности.

Теперь по второму вопросу. В версии вашего метода, где n - целое число, sizeof не будет работать, так как размер абстрактного типа не определен. В этом случае установление ограничения подтипа помогает убедиться в том, что данный аргумент будет иметь определенный размер, в то же время предоставляя гибкость для различных типов. Юлия скомпилирует разные версии функции; по одному на каждый переданный целочисленный подтип.

Это более эффективно, чем объявление функции с n, имеющим конкретный тип, такой как Int64, поскольку это будет означать, что аргумент должен быть преобразован в тот же тип перед выполнением функции.

Подробнее об этом можно прочитать в документации Джулии .

...