rails
で当たり前のように扱っているインスタンス変数
上記の自動販売機プログラムで改めて考えた
class VendingMachine
MONEY = [10, 50, 100, 500, 1000].freeze
def initialize
@slot_money = 3
end
def current_slot_money
@slot_money
end
def slot_money(money)
return false unless MONEY.include?(money)
@slot_money += money
end
def return_money
puts @slot_money
@slot_money = 0
end
end
上みたいな自販機プログラムを書く
その上で irb で
>> require '/Users/isamutatsuya/workspace/vending_machine/vm.rb' #=> true
>> a = VendingMachine.new #=> #<VendingMachine:0x00007fc1e22d19e0 @slot_money=3>
ここで irb 上で @slot_money
を出力すると
>> @slot_money #=> nil
となる。
なんとなく 3 が出力されそうな雰囲気があるけど結果は nil
これはなんでかというと 伊藤淳一さんの ruby 本には
インスタンス変数はクラスの外部から参照することができません。もし参照したい場合は参照用メソッドを定義する必要があります
引用 プロを目指す人のための Ruby 入門 著 伊藤淳一
とある。
クラス内部でしかインスタンス変数は参照できないらしい
rails
ではコントローラーで定義したインスタンス変数を
当たり前のように同名の View
使っていたので
ここでインスタンス変数のスコープの理解があいまいだったことに気づいた
インスタンス変数のスコープはあくまで同じクラス内
これはどの参考書読んでも同じだった
したがって rails
において、
コントローラー内と同名ビュー内で同じインスタンス変数が使えるのは
上記の2つが同じクラスにあるからかなと思う。(これは間違えているかも)
←どうやらこの仕組みは裏側でインスタンス変数をコピーする仕組みが働いているらしい。
詳しくはコメント欄の確認をお願いします。
またもしクラスのインスタンス変数を出力したい場合は
①インスタンスメソッドとして変数を返り値として出力する
②アクセサメソッドを定義してプロパティにアクセスする
がありそう