2013-06-24 4 views
0

Я не думаю, что существует отличная разница между переменной класса и переменная экземпляра. Переменная класса также может рассматриваться как переменная экземпляра . Я прав?Разница между переменной класса Ruby и переменной экземпляра

Например:

class Test 
    @class_var = 'hello world' 

    def self.show_class_var 
    @class_var 
    end 

    def show_class_var 
    puts self.class.show_class_var 
    end 
end 

Итак, я полагаю, мы можем рассматривать переменную класса в качестве переменной экземпляра текущего класса (Test). Если мы определим @@class_var = 'hello world', единственным преимуществом является то, что мы можем напрямую ссылаться на метод @@class_var. Я просто хочу знать, прав ли я. Я?

+7

То, что вы называете "переменная класса" не является переменной класса. Это переменная экземпляра объекта класса. Переменные реального класса добавляются с помощью '@@' –

+0

возможного дубликата [переменной экземпляра, переменной класса и разностью между ними в ruby] (http://stackoverflow.com/questions/7329954/instance-variable-class-variable-and -the-difference-between-them-in-ruby) – quetzalcoatl

+0

Спасибо, ребята, за ответ на мой вопрос :) Переменная класса можно увидеть в подклассе, в то время как переменная экземпляра не может. Я думаю, что это основное отличие. (я не ожидал ссоры по моему вопросу ... я не знаю, что произойдет.но я все равно благодарю вас за ваше терпение) – ruanhao

ответ

3

Я думаю, что "instance variable, class variable and the difference between them in ruby" имеет хорошую expla нации различия между локальными, экземплярами и переменными класса.

+1

Вместо того, чтобы сказать «этот пост», который так же плох, как «нажмите здесь», используйте что-то более описательное для якорного текста. Это помогает тем, кто читает ваш ответ, решить, хотят ли они следовать ему, и помогает, когда ответ индексируется поисковой системой. См. Рекомендацию W3 «[Не используйте« здесь »в качестве текста ссылки] (http://www.w3.org/QA/Tips/noClickHere)« –

1

Я не думаю, что существует отличная разница между переменной класса и переменной экземпляра.

Нет тонкой разницы. Как утверждает Уэйн Конрад в his answer here:

Переменная класса (@@) разделяется между классом и всеми его потомками.

Переменная экземпляра класса (@) не разделяется потомками класса.

@@: переменная класса (. Я рекомендую использовать class instance variable вместо того, чтобы говорить class variable, что позволит избежать путаницы, что новичку люди обычно делали.)

class Foo;end 
#setting class variable @@var 
Foo.class_variable_set(:@@var, "good morning!") 
#getting class variable @@var via Foo 
Foo.class_variable_get(:@@var) # => "good morning!" 
class Bar < Foo ;end 
#getting class variable @@var via Bar subclass of Foo 
Bar.class_variable_get(:@@var) # => "good morning!" 

@: пример переменная

class Foo;end 
foo = Foo.new 
#setting instance variable @var 
foo.instance_variable_set(:@var, "good morning!") 
#getting instance variable @var via foo object 
foo.instance_variable_get(:@var) # => "good morning!" 
class Bar < Foo ;end 
bar = Bar.new 
#getting instance variable @var via bar object,whose class is a subclass of Foo 
bar.instance_variable_get(:@var) # => nil 
1

+1 Ответ OMG, с завихрением: не забывайте, что классы являются собственными объектами, что означает, что есть третий неточно-класс, но не точно, но на самом деле тип экземпляра переменной, для самого класса.

Пример:

class A 
    # instance variable of objects of class A (and its subclasses) 
    # not shared between instances 
    def foo; @foo; end 
    def foo=(foo); @foo = foo; end 

    class << self 
    # instance variable of class A 
    # not available to subclasses of A 
    def bar; @bar; end 
    def bar=(bar); @bar = bar; end 
    end 

    # class variable of A 
    # shared by subclasses of A 
    def baz; @@baz; end 
    def baz=(baz); @@baz = baz; end 
end 

class B < A; end 

Используя выше, вы получите:

a = A.new 
b = B.new 

a.foo = :foo 
a.class.bar = :bar 
a.baz = :baz 

p a.foo   # :foo 
p a.class.bar # :bar 
p a.baz   # :baz 

p b.foo   # nil 
p b.class.bar # nil 
p b.baz   # :baz 
+0

Спасибо, что упомянули то же самое, я был на полпути для то же, но теперь удалили эти строки из моего редактора. Спасибо за помощь :)) –

+0

Зачем это произошло? –

+0

Я не проголосовал ... Но его сильный дождь сейчас-в-днях .. Я полностью разочарован тем же .. Я сделал * + 1 * вам .. нет причины для голосования в прямом эфире Я думаю :( –