//ruby/1 Rubyクラス定義の一例↓
class Order < ActiveRecord::Base
has_many :line_items
def self.find_all_unpaid
find(:all, 'paid = 0')
end
def total
sum = 0
line_items.each {|li| sum += li.total}
end
end
クラス内メソッドの先頭にself.をつけると、クラスメソッドとなる。(staticと同様)
通常の形式でメソッドを定義すると、インスタンスメソッドとなる。(dynamicと同様)
呼び方は下記
puts "合計は #{order.total}"
インスタンス変数は、クラス内全てのインスタンスメソッドで使用できる。各オブジェクトが持つインスタンス変数のセットは、それぞれのオブジェクト専用。
class Greeter
def initialize(name)
@name = name
end
def say(phrase)
puts "#{phrase}、#{name}"
end
end
g1 = Greeter.new("Fred")
g2 = Greeter.new("Wilma")
g1.say("こんにちは") #=> こんにちは、Fred
g2.say("やあ") #=> やあ、Wilma
クラス外部からは、インスタンス変数に直接アクセスできない。インスタンス変数の値を外部で使うには、その値を返すメソッドを定義する必要がある。
class Greeter
def initialize(name)
@name = name
end
def name
@name
end
def name=(new_name)
@name = new_name
end
end
g = Greeter.new("Barney")
puts g.name #=>Barney
g = Greeter.new("Betty")
puts g.name #=>Betty
※Rubyには、このようなアクセサメソッドを自動的に作成してくれる便利なメソッドが用意されている。
class Greeter attr_accessor :name #読込用と書き込み用のメソッドを作成 attr_reader :greeting #読み込み用のメソッドのみを作成 attr_writer :age #書き込み用のメソッドのみを作成