重新打开 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
类型,因此这是一个重要的工具。
我正在自学 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
类型,因此这是一个重要的工具。