コンテンツへスキップ

メソッドとインスタンス変数

メソッドパラメータをインスタンス変数に代入するためのより短い構文を使用することで、コンストラクタを簡略化できます

class Person
  def initialize(@name : String)
    @age = 0
  end

  def age
    @age
  end
end

現在、名前で作成する以外に、人に対してできることはあまりありません。年齢は常にゼロになります。そこで、人を年を取らせるメソッドを追加してみましょう

class Person
  def initialize(@name : String)
    @age = 0
  end

  def age
    @age
  end

  def become_older
    @age += 1
  end
end

john = Person.new "John"
peter = Person.new "Peter"

john.age # => 0

john.become_older
john.age # => 1

peter.age # => 0

メソッド名は小文字で始まり、慣例として小文字、アンダースコア、数字のみを使用します。

ゲッターとセッター

Crystalの標準ライブラリは、ゲッターおよびセッターメソッドの定義を簡略化するマクロを提供します

class Person
  property age
  getter name : String

  def initialize(@name)
    @age = 0
  end
end

john = Person.new "John"
john.age = 32
john.age # => 32

ゲッターおよびセッターマクロの詳細については、Object#getterObject#setter、およびObject#propertyの標準ライブラリドキュメントを参照してください。

ちなみに、become_olderを元のPerson定義内、または別の定義で定義できます。Crystalはすべての定義を単一のクラスに結合します。以下は正常に動作します

class Person
  def initialize(@name : String)
    @age = 0
  end
end

class Person
  def become_older
    @age += 1
  end
end

メソッドの再定義とprevious_def

メソッドを再定義した場合、最後の定義が優先されます。

class Person
  def become_older
    @age += 1
  end
end

class Person
  def become_older
    @age += 2
  end
end

person = Person.new "John"
person.become_older
person.age # => 2

previous_defを使用して、以前に再定義されたメソッドを呼び出すことができます

class Person
  def become_older
    @age += 1
  end
end

class Person
  def become_older
    previous_def
    @age += 2
  end
end

person = Person.new "John"
person.become_older
person.age # => 3

引数または括弧なしの場合、previous_defはメソッドのすべてのパラメータを引数として受け取ります。それ以外の場合は、渡す引数を受け取ります。

包括的な初期化

インスタンス変数は、initializeメソッドの外部でも初期化できます

class Person
  @age = 0

  def initialize(@name : String)
  end
end

これにより、すべてのコンストラクタで@ageがゼロに初期化されます。これは重複を避けるのに便利ですが、クラスを再度開き、インスタンス変数を追加するときにNil型を回避するのにも便利です。