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

Reopening class and adding instance variables

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

Here 是文档页面。

在那个页面上,它给出了以下代码:

class Person
  @age = 0

  def initialize(@name : String)
  end
end

这之后是以下声明:

This will initialize @age to zero in every constructor. This is useful to avoid duplication, but also to avoid the Nil type when reopening a class and adding instance variables to it.

有人可以解释一下,或者给我看一个粗体行为的例子吗?我不确定我是否理解 "reopening a class and adding an instance variable to it".

的含义

这里是重新打开一个 class 并向其添加实例变量的示例:

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= 中的字符串,但在构造函数中未对其进行初始化,这意味着它也可以是 [=17] =].

但是,我们可以给@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 类型,因为它在构造 Person 时被初始化为 "unknown"。由于通常会避免 Nil 类型,因此这是一个重要的工具。