重新打开类并添加实例变量

时间:2019-05-16 16:16:33

标签: crystal-lang

我正在自学Crystal-lang,遇到了我不太了解的文档部分。

Here是文档页面。

在该页面上,它提供以下代码:

class Person
  @age = 0

  def initialize(@name : String)
  end
end

其后是以下语句:

  

这将在每个构造函数中将@age初始化为零。 这对于避免重复很有用,但在重新打开类并向其添加实例变量时也可以避免使用Nil类型。

有人可以解释一下,还是给我看一个大胆行为的例子?我不确定“重新打开类并向其中添加实例变量”是什么意思。

1 个答案:

答案 0 :(得分:6)

以下是重新打开类并向其中添加实例变量的示例:

class Person
  @age = 0

  def initialize(@name : String)
  end
end

# Usually in another file

class Person
  def gender=(gender : String)
    @gender = gender
  end

  def gender
    @gender
  end
end

person = Person.new("RX14")

typeof(person.gender) # => String | Nil
person.gender # => nil

person.gender = "???"

person.gender # => "???"

我们添加了@gender实例变量,该变量未在def initialize中初始化。编译器推断@gender的类型为String | Nil,因为它已分配给gender=中的字符串,但未在构造函数中初始化,这意味着它也可以是{{1 }}。

但是,我们可以向nil实例变量添加默认值,该值适用于 all 构造函数,在默认值之前或之后定义:

@gender

这避免了class Person @age = 0 def initialize(@name : String) end end # Usually in another file class Person @gender = "unknown" def gender=(gender : String) @gender = gender end def gender @gender end end person = Person.new("RX14") typeof(person.gender) # => String person.gender # => "unknown" person.gender = "???" person.gender # => "???" 变量获得@gender类型,因为在构造String | Nil时将其初始化为"unknown"。由于通常会避免使用Person类型,因此这是一个重要的工具。