メソッドには処理が書かれていなければならない。書いてないのは文法的にout
publicメソッド クラスの内部、外部から呼び出せるメソッド
privateメソッド クラスの内部からしか呼び出せないメソッド
class Car
def run
set_fuel
end
private
def set_fuel
puts "燃料を減らします"
end
end
car1 = Car.new
car1.set_fuel #privateメソッドからは呼び出せない
car1.run #runメソッドからは呼び出せる。
メソッドを定義してから、呼び出すの一連の動作の確認
class Car
attr_reader :x, :fuel
def initialize
@x = 0
@fuel = 100
end
def run(distance)
@x += distance
set_fuel(@fuel - distance)
end
private
def set_fuel(litre)
@fuel = litre
end
end
my_car = Car.new
puts "何km走りますか?"
distance = gets.chomp.to_i
my_car.run(distance) #5
puts "走行距離: #{my_car.x}km"
puts "ガソリン量: #{my_car.fuel}リットル"
・attr_readerにfuel(燃料)のゲッターを定義
・initializeメソッドに@fuel = 100を代入しインスタンス生成時に燃料を100にする.
これでインスタンス生成時に@x = x(最初の走行距離が0)と@fuel = 100が呼び出される。
・private宣言下に、set_fuel(litre)メソッドを定義し、@fuelにlitreを代入する。
・runメソッドにset_fuelメソッドで呼び出し、(@fuel - distance)を定義
・newコマンドでインスタンスを生成する。(initializeメソッドが呼ばれる)
・my_car.fuel(ゲッターメソッド)を定義する。
ユーザーが入力をした時に、initializeメソッド、runメソッドが呼び出され、(燃料100-入力された値)が実行される。
注意
set_fuelメソッドに@fuelのように単独でインスタンス変数が存在することはない。
なぜなら、何も処理を記述していないメソッドはrubyの文法としてあり得ない
例
def ponpoko
end
のようにメソッドの内部処理を定義していないのでエラーになる。
def ponpoko
endなら良い