如何检查类型是否可变

Chr*_*kas 8 types mutable julia

有没有办法检查一个类型是可变的还是不可变的?这个检查是否可以在编译时完成(即将分支if ismutable(T)编译为仅使用代码路径进行可变性或不变性)?

Sal*_*apa 9

DataTypes有一个mutable字段,所以你可以定义is_mutableis_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
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)

为它们创建一个type和一个immutable和实例:

julia> type Foo end

julia> f = Foo()
Foo()

julia> immutable Bar end

julia> b = Bar()
Bar()
Run Code Online (Sandbox Code Playgroud)

检查可变性:

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

julia> is_mutable(Bar), is_mutable(b)
(false,false)
Run Code Online (Sandbox Code Playgroud)

检查不变性:

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

julia> is_immutable(Bar), is_immutable(b)
(true,true)
Run Code Online (Sandbox Code Playgroud)

为了提高性能,还要考虑将这些功能声明为@pure:

Base.@pure is_mutable(x::DataType) = x.mutable
Run Code Online (Sandbox Code Playgroud)

  • 定义一个`is_immutable`函数,它的行为与内置的`isimmutable`不同 - 所以`isimmutable(Bar)`给出了false但是`is_immutable(Bar)`给出了真 - 似乎是一个坏主意. (4认同)
  • 好吧,`isimmutable`正在做一些不同的事情 - 它传递的对象Bar与其他任何值一样有效,并且*它是*可变的.(代码是`isimmutable(x :: ANY)=(@_ pure_meta;(isa(x,Tuple)||!typeof(x).mutable))`.) (2认同)
  • 好吧,从文档/歧义消除/代码清晰的角度来看,我同意DSM的观点,也许您的函数至少应被称为“ isimmutabletype”而不是“ isimmutable”,因为DataType实例是可变的,而诸如“ isimmutable(String)”之类的东西`绝对应该返回false(而isimmutabletype(String)`应该返回true)。 (2认同)