【问题标题】:Reopening class and adding instance variables重新打开类并添加实例变量
【发布时间】:2019-05-16 16:16:32
【问题描述】:

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

Here 是文档页面。

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

class Person
  @age = 0

  def initialize(@name : String)
  end
end

这之后是以下语句:

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

有人可以解释一下,或者给我看一个粗体行为的例子吗?我不确定我理解“重新打开一个类并向它添加一个实例变量”是什么意思。

【问题讨论】:

    标签: crystal-lang


    【解决方案1】:

    这里是一个重新打开一个类,并向它添加一个实例变量的例子:

    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=中的一个字符串,但它没有在构造函数中初始化,也就是说它也可以是nil

    但是,我们可以为@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 类型,因此这是一个重要的工具。

    【讨论】:

    • 啊,谢谢!
    猜你喜欢
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2010-09-14
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    相关资源
    最近更新 更多