АО
Size: a a a
АО
VG
struct Foo{Bar}
parent::Bar
end
Отчасти так сделаны многие обертки над массивами, те же таблицы:using IndexedTablesВернут:
a = table((x=1:100, y=randn(100)))
typeof(a)
IndexedTable{StructArrays.StructArray{NamedTuple{(:x, :y),Tuple{Int64,Float64}},1,NamedTuple{(:x, :y),Tuple{Array{Int64,1},Array{Float64,1}}},Int64}} - NamedTuple, обернутый в StructArray, обернутый в IndexedTableAK
АО
julia> mutable struct Foo
n::Int
end
julia> function f!(x)
x.n += 1
end
f! (generic function with 1 method)
julia> foo = Foo(1)
Foo(1)
julia> f!(foo)
2
julia> foo
Foo(2)
АО
IOStream немного отдельная штука, внутри себя он содержит указатель (дескриптор файла? прошу прощения могу немного путаться в терминологии) и при работе с ним просто вызывает соответствующие C функции. Поэтому если внутри какой-то функции вы закрываете IOStream, то вызывается соответствующая C функция и работать с ним дальше уже нельзя.IOStream можно скопировать при помощи deepcopy например, но при этом не откроется новый дескриптор файла, а будет скопирован предыдущий, поэтому при закрытии копии, файл будет закрыт глобально.АО
echo "Hello" > /tmp/test.txt
# Iteration 1: normal flow
julia> io = open("/tmp/test.txt")
IOStream(<file /tmp/test.txt>)
julia> read(io, String)
"Hello\n"
julia> read(io, String)
""
julia> close(io)
# Iteration 2: io copy
julia> io = open("/tmp/test.txt")
IOStream(<file /tmp/test.txt>)
julia> io2 = deepcopy(io)
IOStream(<file /tmp/test.txt>)
julia> read(io2, String)
"Hello\n"
julia> read(io, String)
""
julia> close(io2)
julia> close(io)
double free or corruption (!prev)
АО
f(x) = x + 1
function g()
res = 0
for i in 1:10
res += f(res)
end
end
function g()
res = 0
for i in 1:10
res += res + 1
end
return res
end
f и как следствие передачи по ссылке или не по ссылке, вообще нет.АО
АО
AK
AZ
VG
struct Foo{T}
x::T
end
f = Foo(10)
typeof(f) # нужен не Foo{Int}, а просто IntA
RS
julia> type(s::Foo) = typeof(s.x)
julia> type(Foo("123"))
String
julia> type(Foo([1,2,3]))
Array{Int64,1}
julia> type(Foo(1))
Int64
VG
АО
struct Foo{T}
x::Vector{T}
endVG
foo_type(::Foo{T}) = TАО
АО