そのクラスに関連が深いものの、
一つ一つのインスタンスに含まれるデータは使わないメソッドを定義したい場合
があります。そのような場合はクラスメソッドを定義した方が使い勝手が良くなります。
クラスメソッドの呼び出し方
クラスメソッドを呼び出す場合は以下のように、クラス名の直後にドット(.)を付けてメソッドを呼び出します。
クラス名.メソッド名
クラスメソッドの書き方
class クラス名 def self.クラスメソッド # クラスメソッドの処理 end end
class クラス名 class << self def クラスメソッド # クラスメソッドの処理 end end end
メソッド名の表記法について
Rubyではインスタンスメソッドを表す場合に、
クラス名#メソッド名
と書くことがあります。例えばString#to_iであれば、「Stringクラスのto_Iというインスタンスメソッド」と表します。
また、クラスメソッドの場合はクラス名.メソッド名
(またはクラス名::メソッド名
)と書きます。例えばFile.exit?(またはFile::exist?)であれば、「Fileクラスのexit?というクラスメソッド」を表します。
- File.exit?、File::exist?というクラスメソッドの呼び出し方がある
irb(main):001* class User
irb(main):002* def initialize(name)
irb(main):003* @name = name
irb(main):004* end
irb(main):005*
irb(main):006* def self.create_users(names)
irb(main):007* names.map do |name|
irb(main):008* User.new(name)
irb(main):009* end
irb(main):010* end
irb(main):011*
irb(main):012* def hello
irb(main):013* "Hello, I am #{@name}."
irb(main):014* end
irb(main):015> end
=> :hello
irb(main):016> names = ["Alice", "Bob", "Carol"]
=> ["Alice", "Bob", "Carol"]
irb(main):017> users = User.create_users(names)
=> [#<User:0x0000000108bc4fb8 @name="Alice">, #<User:0x0000000108bc4f68 @name="Bob">, #<User:0x0000000108bc4f40 @name="Carol">]
irb(main):018* users.each do |user|
irb(main):019* puts user.hello
irb(main):020> end
Hello, I am Alice.
Hello, I am Bob.
Hello, I am Carol.
=> [#<User:0x0000000108bc4fb8 @name="Alice">, #<User:0x0000000108bc4f68 @name="Bob">, #<User:0x0000000108bc4f40 @name="Carol">]
irb(main):036* class User2
irb(main):037* def initialize(name)
irb(main):038* @name = name
irb(main):039* end
irb(main):040* class << self
irb(main):041* def create_users(names)
irb(main):042* names.map do |name|
irb(main):043* User.new(name)
irb(main):044* end
irb(main):045* end
irb(main):046* end
irb(main):047* def hello
irb(main):048* "Hello, I am #{@name}."
irb(main):049* end
irb(main):050> end
=> :hello
irb(main):051> names = ["Alice", "Bob", "Carol"]
=> ["Alice", "Bob", "Carol"]
irb(main):052> names2 = ["Alice", "Bob", "Carol"]
=> ["Alice", "Bob", "Carol"]
irb(main):053> users = User2.create_users(names2)
=> [#<User:0x00000001089bdee0 @name="Alice">, #<User:0x00000001089bdeb8 @name="Bob">, #<User:0x00000001089bde90 @name="Carol">]
irb(main):054* users.each do |user|
irb(main):055* puts user.hello
irb(main):056> end
Hello, I am Alice.
Hello, I am Bob.
Hello, I am Carol.
=> [#<User:0x00000001089bdee0 @name="Alice">, #<User:0x00000001089bdeb8 @name="Bob">, #<User:0x00000001089bde90 @name="Carol">]
- 試しに書いてみたが同じように動作した