用法:
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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。