2017-07-15 15 views
0

私はクラスを持っている:ルビー - クラスとインスタンス変数変数

class Foo 

    def self.test 
    @test 
    end 

    def foo 
    @test = 1 
    bar 
    end 

    private 

    def bar 
    @test = 2 
    end 
end 

object = Foo.new.foo 
Foo.test 

# => nil 

私は出力にそれを得ることができる唯一の方法は、「2」@testクラス変数を作ることです。インスタンス変数を使用してFoo.testで表示できる方法はありますか?

+0

は 'クラスメソッドであるFoo.test'は、インスタンス変数にアクセスすることはできません。 –

+0

@HoManだからこそ私は '@@ test'を使うのは簡単だが「コードの匂い」と考えているからだ。クラスインスタンス変数を使用する必要があります。 – YoloSnake

+1

本当の目標は何ですか?異なるオブジェクトを使用しているので、明らかに同じインスタンス変数にアクセスすることはできません。 –

答えて

1

あなたが達成したいこと、そしてなぜそれが本当にわかりません。次に、「クラスインスタンス変数」を使用した例を示します。それはあなたが探しているものかもしれません:

class Foo 
    class << self 
    attr_accessor :test 
    end 

    attr_accessor :test 

    def foo 
    @test = 1 
    bar 
    end 

    private 

    def bar 
    Foo.test = 2 
    end 
end 

foo = Foo.new 
foo.foo 
p foo.test 
#=> 1 
p Foo.test 
#=> 2 
+0

あなたは私と同時にLOLとコメントしました。さて、この質問の目的は@@を使用するのを避ける方法ですが、同じ結果を得ることです。私のバージョンは少し違います。 – YoloSnake

0

だから「コードのにおい」とみなされる@@(クラス変数)を使用しているので、あなたの代わりに、クラスのインスタンス変数を使用する必要があります。

class << self 
     attr_accessor :test 
end 

をそして、あなたはクラスのように書き換える: あなたは追加することによってそう

class Foo 

    class << self 
    attr_accessor :test 
    end 

    def foo 
    Foo.test = 1 
    bar 
    end 

    private 

    def bar 
    Foo.test = 2 
    end 
end 

object = Foo.new.foo 
Foo.test 

# => 2 
関連する問題