メソッドとインスタンス変数¶
メソッドパラメータをインスタンス変数に代入するためのより短い構文を使用することで、コンストラクタを簡略化できます
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#getter、Object#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
型を回避するのにも便利です。