当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Julia Core.Ref用法及代码示例


用法:

Ref{T}

一个安全地引用 T 类型数据的对象。此类型保证指向正确类型的有效Julia-allocated 内存。只要引用Ref 本身,就会保护底层数据不被垃圾Collector释放。

在 Julia 中,Ref 对象使用 [] 取消引用(加载或存储)。

Ref 创建为 T 类型的值 x 通常写为 Ref(x) 。此外,为了创建指向容器的内部指针(例如 Array 或 Ptr),可以编写 Ref(a, i) 以创建对 i - a 的第一个元素的引用。

Ref{T}() 创建对 T 类型值的引用,无需初始化。对于位类型 T ,该值将是当前驻留在分配的内存中的任何值。对于非位类型 T ,引用将未定义,尝试取消引用将导致错误“UndefRefError: access to undefined reference”。

要检查 Ref 是否是未定义的引用,请使用 isassigned(ref::RefValue) 。例如,如果T 不是位类型,则isassigned(Ref{T}())false。如果T 是位类型,则isassigned(Ref{T}()) 将始终为真。

当作为ccall 参数(作为PtrRef 类型)传递时,Ref 对象将转换为指向它所引用数据的本机指针。对于大多数 T ,或者在转换为 Ptr{Cvoid} 时,这是指向对象数据的指针。当Tisbits 类型时,该值可以安全地变异,否则变异是严格未定义的行为。

作为一种特殊情况,设置 T = Any 将导致在转换为 Ptr{Any} 时创建指向引用本身的指针(如果 T 是不可变的,则为 jl_value_t const* const*,否则为 jl_value_t *const * )。当转换为 Ptr{Cvoid} 时,它仍将返回指向数据区域的指针,就像任何其他 T 一样。

PtrC_NULL 实例可以传递给 ccall Ref 参数以对其进行初始化。

用于广播

Ref 有时用于广播,以便将引用的值视为标量。

例子

julia> Ref(5)
Base.RefValue{Int64}(5)

julia> isa.(Ref([1,2,3]), [Array, Dict, Int]) # Treat reference values as scalar during broadcasting
3-element BitVector:
 1
 0
 0

julia> Ref{Function}()  # Undefined reference to a non-bitstype, Function
Base.RefValue{Function}(#undef)

julia> try
           Ref{Function}()[] # Dereferencing an undefined reference will result in an error
       catch e
           println(e)
       end
UndefRefError()

julia> Ref{Int64}()[]; # A reference to a bitstype refers to an undetermined value if not given

julia> isassigned(Ref{Int64}()) # A reference to a bitstype is always assigned
true

julia> Ref{Int64}(0)[] == 0 # Explicitly give a value for a bitstype reference
true

相关用法


注:本文由纯净天空筛选整理自julialang.org 大神的英文原创作品 Core.Ref — Type。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。