коллекции классов ruby - PullRequest
0 голосов
/ 18 мая 2010

как это работает?

в irb:

>> class A
>>   b = [1, 2,3]
>> end
=> [1, 2, 3]

Является ли переменная экземпляра? переменная класса? как бы я получить доступ к б из вне класса? Используется ли он для метапрограммирования?

Ответы [ 2 ]

6 голосов
/ 18 мая 2010

Является ли переменная экземпляра? переменная класса?

Нет, это локальная переменная внутри области действия class ... end.

как бы я получил доступ к б вне класса?

Вы бы не стали. Он выходит из области видимости (и, следовательно, недоступен), как только достигает end.

Используется ли он для метапрограммирования?

Это может быть. Пример:

class A
  b = [1,2,3]
  b.each do |i|
    define_method("foo#{i}") do end
  end
end

Теперь я определил методы foo1, foo2 и foo3.

Конечно, все было бы иначе, если бы я не создал переменную b и просто сделал [1,2,3].each напрямую. Таким образом, создание локальной переменной само по себе ничего не дает, оно позволяет писать более чистый код (так же, как использование локальных переменных в методе).

1 голос
/ 18 мая 2010

b - это простая переменная block , вы не можете получить к ней доступ снаружи блока.

Вы можете использовать класс следующим образом:

class Building
  @@count=0                        #This is a class variable
  MIN_HEIGHT=50                    #This is a constant
  attr_accessor :color, :size      #grant access to instance variables
  def initialize options
    @color=options[:color]         #@color is an instance variable
    @size=options[:size]           #@size too
    @@count=@@count+1
  end

  def self.build options           #This is a class method
    # Adding a new building
    building=Building.new options
  end
end
#[...]
Building.build({:color=>'red', :size=>135})
blue_building=Building.new({:color=>'blue', :size=>55})
puts blue_building.color          # How to use an instance variable
#                          => 'blue'
puts "You own  #{Building.count.to_s} buildings !"     # How to use a class variable
#                          => 'You own 2 buildings !'
puts Building::MIN_HEIGHT          # How to use a constant
#                          => 50
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...