2011-09-27 8 views

Odpowiedz

1

Aby zdefiniować zmienną klasy, użyć @@:

class User 
    @@description = "I am a User class variable" 

    def print 
     puts @@description 
    end 
end 
0

Zmienne instancji musi być poprzedzony liczbą @ i nie są dostępne z zewnątrz. Zmienne klasy należy poprzedzać prefiksem @@.

Przy pierwszym użyciu tej zmiennej w dowolnym miejscu kodu zostanie ona zainicjowana. Jeśli chcesz uzyskać dostęp do wartości z zewnątrz:

attr_reader :description 

http://rubylearning.com/satishtalim/tutorial.html

+1

'attr_reader 'działa tylko dla zmiennych instancji, a nie zmiennych klas. Jeśli używasz Railsów, możesz użyć 'cattr_reader', aby to zrobić. – zetetic

+0

ale widziałem przykład kodu użyłem zmiennej tak jak ja, więc czy to jest legalne? – user875883

+1

@ user875883 To byłby dziwny przykład kodu. Może chodziło o pokazanie, w jaki sposób lokalna zmienna zdefiniowana na poziomie klasy NIE jest objęta zakresem metod. –

4

W twoim przypadku, description jest tylko zmienna lokalna. Można zmienić ten zakres używania znaków specjalnych @, @@, $:

a = 5 
defined? a 
=> "local-variable" 

@a = 5 
defined? @a 
=> "instance-variable" 

@@a = 5 
defined? @@a 
=> "class variable" 

$a = 5 
defined? $a 
=> "global-variable" 

dla własnych celów, myślę, że może być używany w ten sposób

class User 
    def initialize(description) 
    @description = description 
    end 

    def print 
     puts @description 
    end 
end 

obj = User.new("I am User") 
obj.print 
# => I am User 
2

można uzyskać dostęp do klasy zakres używając define_method .

class User 
    description = "I am User class variable" 
    define_method :print do 
     puts description 
    end 
end 

> User.new.print
Jestem klasa użytkownika zmienna
=> nil

Nie sądzę, że to dobry pomysł, choć :)

Powiązane problemy