我正在自学Crystal-lang,遇到了我不太了解的文档部分。
Here是文档页面。
在该页面上,它提供以下代码:
class Person
@age = 0
def initialize(@name : String)
end
end
其后是以下语句:
这将在每个构造函数中将@age初始化为零。 这对于避免重复很有用,但在重新打开类并向其添加实例变量时也可以避免使用Nil类型。
有人可以解释一下,还是给我看一个大胆行为的例子?我不确定“重新打开类并向其中添加实例变量”是什么意思。
答案 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
类型,因此这是一个重要的工具。