Rubyの変数のスコープ

Rubyインスタンス変数の取り扱いについて考えている。

  • Cartクラスでアクセサとしてitemsを設定(同一オブジェクトからitemsを呼び出せる)
  • Store_ControllerクラスでnewしてCartインスタンス生成。これをStore_Controllerクラスのインスタンス変数@cartに格納
  • 同じStore_Controllerクラスのメソッドではインスタンス変数@cartを使いまわせる
  • よって、=からはitemsを呼び出せるはず...
#! /usr/bin/env ruby
# -*- coding: utf-8 -*-
class Cart
    attr_reader :items
    def initialize
        @items = [{:id=>1,:name=>'hoge'},{:id=>2,:name=>'foo'},{:id=>3,:name=>'bar'}]
    end
end
class Store_Controller
    def index
        @cart = Cart.new
    end
    def show
        @cart.items
    end
end
sc = Store_Controller.new
p sc.show

出力結果

bash-3.2$ ruby instance_test.rb 
instance_test.rb:19:in `show': undefined method `items' for nil:NilClass (NoMethodError)
	from instance_test.rb:25

まちがえた。
Store_Controllerの生成時に@cartが対応していない。

def initialize
    @cart = Cart.new
end

するか、

sc = Store_Controller.new
sc.index
p sc.show

とすることで、

bash-3.2$ ruby instance_test.rb 
[{:name=>"hoge", :id=>1}, {:name=>"foo", :id=>2}, {:name=>"bar", :id=>3}]

できた。