用法:
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 参数(作为Ptr 或Ref 类型)传递时,Ref 对象将转换为指向它所引用数据的本机指针。对于大多数 T ,或者在转换为 Ptr{Cvoid} 时,这是指向对象数据的指针。当T 是isbits 类型时,该值可以安全地变异,否则变异是严格未定义的行为。
作为一种特殊情况,设置 T = Any 将导致在转换为 Ptr{Any} 时创建指向引用本身的指针(如果 T 是不可变的,则为 jl_value_t const* const*,否则为 jl_value_t *const * )。当转换为 Ptr{Cvoid} 时,它仍将返回指向数据区域的指针,就像任何其他 T 一样。
Ptr 的 C_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相关用法
- Julia Core.NamedTuple用法及代码示例
- Julia Core.ifelse用法及代码示例
- Julia Core.isa用法及代码示例
- Julia Core.typeof用法及代码示例
- Julia Core.UnionAll用法及代码示例
- Julia Core.nfields用法及代码示例
- Julia Core.Function用法及代码示例
- Julia Core.DomainError用法及代码示例
- Julia Core.undef用法及代码示例
- Julia Core.UndefVarError用法及代码示例
- Julia Core.isdefined用法及代码示例
- Julia Core.invoke用法及代码示例
- Julia Core.Array方法用法及代码示例
- Julia Core.getfield用法及代码示例
- Julia Core.ErrorException用法及代码示例
- Julia Core.Vararg用法及代码示例
- Julia Core.NTuple用法及代码示例
- Julia Core.@big_str用法及代码示例
- Julia Core.Type用法及代码示例
- Julia Core.Task用法及代码示例
- Julia Core.Union用法及代码示例
- Julia Core.AssertionError用法及代码示例
- Julia Core.BoundsError用法及代码示例
- Julia Core.Float64方法用法及代码示例
- Julia Core.InexactError用法及代码示例
注:本文由纯净天空筛选整理自julialang.org 大神的英文原创作品 Core.Ref — Type。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。
