インスタンス変数と静的変数
CoddyのGDScriptジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 9/65。
クラス内の通常のvarはインスタンス変数です。各オブジェクトがそれぞれ独自の値を持ちます。一方、static varはクラスに属し、値は1つだけで、すべてのオブジェクトで共有されます。
# student.gd
class_name Student
extends RefCounted
static var school: String = "Godot High"
static var count: int = 0
var student_name: String
func _init(new_name: String) -> void:
student_name = new_name
count += 1var ada := Student.new("Ada")
var bo := Student.new("Bo")
print(Student.count) # 2
print(ada.student_name, " and ", bo.student_name) # Ada and Bo
Student.school = "Godot Academy"
print(ada.school) # Godot Academy
print(bo.school) # Godot AcademyStudent.count のように、オブジェクトを使わずにクラス名を通じて静的変数を読み取ります。クラス内ではその名前を使います。_init() 内の count += 1 は、これまでに作成された学生の数を数えます。
Student.schoolを変更すると、すべての生徒について一度に変更されます。ada.school = "Night School"でも同じことが起こります。schoolは1つしかないため、クラス名を使って書くとそのことが明確になります。
constも同じように共有されますが、変更することはできません。カウンターやすべてのオブジェクトに適用される設定など、プログラムの実行中に変化する共有データにはstatic varを使います。
チャレンジ
簡単bank_account.gd のクラス BankAccount を完成させてください。
- すべてのアカウントで共有され、初期値が
2の静的なint変数interest_percent - 初期値が
0の静的なint変数account_count。コンストラクターは、新しいアカウントを作成するたびにこれに1を加えます。 describe()は、アカウントのholderとbalance、および共有のinterest_percentを使ってHOLDER: $BALANCE at PERCENT%を返します。
提供されているコードは、後続するアカウントの数と、それぞれの holder balance の行を読み取り、その後、新しい利率を読み取ります。BankAccount.account_count とすべてのアカウントを出力し、BankAccount.interest_percent を新しい利率に設定してから、すべてのアカウントをもう一度出力します。Alice 1000、Bob 2000、利率 3 の場合、次のように出力されます。
Accounts opened: 2
Alice: $1000 at 2%
Bob: $2000 at 2%
After the rate change:
Alice: $1000 at 3%
Bob: $2000 at 3%コードは bank_account.gd に記述してください。main.gd には提供された入出力コードがあり、編集できません。
自分で試してみよう
extends Node
func _ready():
# 提供された入出力コード:そのままにしてください
var accounts: Array[BankAccount] = []
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
accounts.append(BankAccount.new(parts[0], int(parts[1])))
print("Accounts opened: %d" % BankAccount.account_count)
for account in accounts:
print(account.describe())
BankAccount.interest_percent = int(OS.read_string_from_stdin())
print("After the rate change:")
for account in accounts:
print(account.describe())
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: GDScriptオンラインコンパイラ