Что если вы поместите @x = 5 сразу после определения класса? - PullRequest
0 голосов
/ 22 мая 2018

1) Какова роль @x в этом коде?Это не переменная экземпляра, верно?Потому что в моем коде не было ни attr_accessor, ни метода инициализации.(если я правильно помню)

2) Как я могу просмотреть данные в х?Как я могу достичь этого?

Вот код:

class A
@x = 5
// some other things here
end

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Объект класса сам по себе является экземпляром Class.

A.class
#=> Class

Так что это действительно переменная экземпляра, только в самом классе A, а не в экземплярах A.Без метода доступа вы получите значение, подобное этому:

A.instance_variable_get('@x')
#=> 5

Разница между переменными класса (@@x) и переменными экземпляра класса (@x) состоит в том, что первые разделяются с подклассами, тогда как последниене являются:

class Test1 ; @@x = 5 ; end
class Test2 < Test1 ; end

Test2.class_variable_get('@@x')
#=> 5
Test1.class_variable_set('@@x', 1)
#=> 1
>> Test2.class_variable_get('@@x')
#=> 1

Этого не происходит с переменными экземпляра класса:

class Test3 ; @x = 5 ; end
class Test4 < Test 3 ; end

Test3.instance_variables
#=> [:@x]
>> Test4.instance_variables
#=> []
0 голосов
/ 22 мая 2018

Это не переменная экземпляра для объектов класса A, но является переменной экземпляра для самого класса.Класс - это просто объект в ruby, поэтому у него могут быть свои собственные переменные экземпляра.

class A
  @x = 5
  def self.show_my_var
    @x
  end
end

A.show_my_var
=> 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...