Как проверить тип на изменчивость

есть ли способ проверить, является ли тип изменяемым или неизменяемым? Может ли эта проверка выполняться во время компиляции (т. е. иметь ветви if ismutable(T) скомпилировать, чтобы просто использовать путь кода для изменчивости или неизменяемости)?

1 ответов


DataTypes есть mutable поле, так что вы можете определить is_mutable и is_immutable используя это, так как делать это вместо прямого доступа к этому полю более Джулиан.

использование версии Julia 0.5.0:

               _
   _       _ _(_)_     |  By greedy hackers for greedy hackers.
  (_)     | (_) (_)    |  Documentation: http://docs.julialang.org
   _ _   _| |_  __ _   |  Type "?help" for help.
  | | | | | | |/ _' |  |
  | | |_| | | | (_| |  |  Version 0.5.0 (2016-09-19 18:14 UTC)
 _/ |\__'_|_|_|\__'_|  |  Official http://julialang.org/ release
|__/                   |  x86_64-w64-mingw32

julia> DataType.    # <TAB> to auto complete
abstract         hastypevars       instance          layout            llvm::StructType  name              parameters        super             uid
depth            haswildcard       isleaftype        llvm::DIType      mutable           ninitialized      size              types

julia> is_mutable(x::DataType) = x.mutable
is_mutable (generic function with 1 method)

julia> is_mutable(x) = is_mutable(typeof(x))
is_mutable (generic function with 2 methods)

julia> is_immutable(x) = !is_mutable(x)
is_immutable (generic function with 1 method)

создать type и immutable и экземпляры для них обоих:

julia> type Foo end

julia> f = Foo()
Foo()

julia> immutable Bar end

julia> b = Bar()
Bar()

проверить переменчивости:

julia> is_mutable(Foo), is_mutable(f)
(true,true)

julia> is_mutable(Bar), is_mutable(b)
(false,false)

проверить неизменность:

julia> is_immutable(Foo), is_immutable(f)
(false,false)

julia> is_immutable(Bar), is_immutable(b)
(true,true)

для производительность, также рассмотрите объявление этих функций как @pure:

[email protected] is_mutable(x::DataType) = x.mutable