LoginSignup
0
0

More than 1 year has passed since last update.

ruby インスタンス変数

Last updated at Posted at 2021-11-04

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つが同じクラスにあるからかなと思う。(これは間違えているかも)

←どうやらこの仕組みは裏側でインスタンス変数をコピーする仕組みが働いているらしい。
詳しくはコメント欄の確認をお願いします。

またもしクラスのインスタンス変数を出力したい場合は

①インスタンスメソッドとして変数を返り値として出力する
②アクセサメソッドを定義してプロパティにアクセスする

がありそう

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0