为什么我可以访问存储在抽象类型集合中的特定结构的属性?

Why can I access the attribute of a specific struct when it's stored in a collection of abstract types?

abstract type Elf end 

struct LightElf <: Elf
    name::String 
    life::Int32
end 

struct DarkElf <: Elf
    name::String
    life::Int32
    # This attribute is only in DarkElf.
    enchantment::Int32
end

amber = LightElf("Amber",100)
charles = DarkElf("Charles",20,45)

elves = Elf[]
push!(elves,amber,charles)
charles = DarkElf("Charles",20,45)
println(elves[2].enchantment)

> 45

为什么我可以从 charles 访问存储在抽象数组 Elf objects 中的 enchantment 字段?

在像 C#Java 这样的语言中,parent 不知道该子 class 的任何特定属性。显然,我们没有 abstract classes,所以我们不知道哪些属性会生成泛型 Elf。我想你可能会问,Julia 是如何知道 struct?

中的属性的?

这里的答案是,Julia 本质上是一种动态语言,而像 C# 和 Java 这样的语言本质上是静态的。在 Julia(和大多数动态语言)中,变量没有类型。对象做。当你在静态语言中取 elves[2] 时,你会得到一个 Elf 类型的变量。当你这样做是 Julia 时,你会得到一个 DarkElf.