Julia Language
Совместимость с несколькими версиями
Поиск…
Синтаксис
- использование сокетов
- Compat.String
- Compat.UTF8String
- @compat f. (x, y)
замечания
Иногда очень сложно получить новый синтаксис, чтобы хорошо играть с несколькими версиями. Поскольку Julia все еще активно развивается, часто полезно просто отказаться от поддержки старых версий и вместо этого нацелить только более новые.
Номера версий
У Джулии есть встроенная реализация семантического управления версиями, открытая через тип VersionNumber
.
Чтобы построить VersionNumber
как литерал, можно использовать строковый макрос @v_str
:
julia> vers = v"1.2.0"
v"1.2.0"
В качестве альтернативы можно вызвать конструктор VersionNumber
; обратите внимание, что конструктор принимает до пяти аргументов, но все, кроме первого, являются необязательными.
julia> vers2 = VersionNumber(1, 1)
v"1.1.0"
Номера версий можно сравнивать с помощью операторов сравнения и, следовательно, их можно сортировать:
julia> vers2 < vers
true
julia> v"1" < v"0"
false
julia> sort([v"1.0.0", v"1.0.0-dev.100", v"1.0.1"])
3-element Array{VersionNumber,1}:
v"1.0.0-dev.100"
v"1.0.0"
v"1.0.1"
Номера версий используются в нескольких местах по всей Юлии. Например, константа VERSION
является VersionNumber
:
julia> VERSION
v"0.5.0"
Это обычно используется для оценки условного кода, в зависимости от версии Julia. Например, для запуска другого кода на v0.4 и v0.5 можно сделать
if VERSION < v"0.5"
println("v0.5 prerelease, v0.4 or older")
else
println("v0.5 or newer")
end
Каждый установленный пакет также связан с текущим номером версии:
julia> Pkg.installed("StatsBase")
v"0.9.0"
Использование Compat.jl
Пакет Compat.jl позволяет использовать некоторые новые функции и синтаксис Julia со старыми версиями Julia. Его функции документированы на его README, но ниже приводится описание полезных приложений.
Унифицированный тип строки
В Julia v0.4 было много разных типов строк . Эта система считалась слишком сложной и запутанной, поэтому в Julia v0.5 остается только тип String
. Compat
позволяет использовать тип и конструктор String
версии 0.4 под именем Compat.String
. Например, этот код v0.5
buf = IOBuffer()
println(buf, "Hello World!")
String(buf) # "Hello World!\n"
могут быть непосредственно переведены на этот код, который работает как с v0.5, так и с v0.4:
using Compat
buf = IOBuffer()
println(buf, "Hello World!")
Compat.String(buf) # "Hello World!\n"
Обратите внимание, что есть некоторые оговорки.
- На v0.4,
Compat.String
typealiased вByteString
, который являетсяUnion{ASCIIString, UTF8String}
. Таким образом, типы сString
полями не будут стабильными по типу. В этих ситуациях рекомендуетсяCompat.UTF8String
, так как это будет означатьString
на v0.5 иUTF8String
на v0.4, оба из которых являются конкретными типами. - Нужно быть осторожным, чтобы использовать
Compat.String
илиimport Compat: String
, потому что самаString
имеет значение в v0.4: это устаревший псевдоним дляAbstractString
. Знак того, чтоString
был случайно использован вместоCompat.String
, если в любой момент появляются следующие предупреждения:
WARNING: Base.String is deprecated, use AbstractString instead.
likely near no file:0
WARNING: Base.String is deprecated, use AbstractString instead.
likely near no file:0
Компактный синтаксис вещания
Julia v0.5 вводит синтаксический сахар для broadcast
. Синтаксис
f.(x, y)
для broadcast(f, x, y)
. Примеры использования этого синтаксиса включают sin.([1, 2, 3])
чтобы взять синус из нескольких чисел одновременно.
На v0.5 синтаксис можно использовать напрямую:
julia> sin.([1.0, 2.0, 3.0])
3-element Array{Float64,1}:
0.841471
0.909297
0.14112
Однако, если мы попробуем то же самое на v0.4, мы получим ошибку:
julia> sin.([1.0, 2.0, 3.0])
ERROR: TypeError: getfield: expected Symbol, got Array{Float64,1}
К счастью, Compat
делает этот новый синтаксис применимым и от v0.4. Еще раз добавим using Compat
. На этот раз мы окружаем выражение @compat
:
julia> using Compat
julia> @compat sin.([1.0, 2.0, 3.0])
3-element Array{Float64,1}:
0.841471
0.909297
0.14112