Ruby-переменная уровня класса - PullRequest
3 голосов
/ 22 августа 2010

Итак, я проводил переподготовку на Ruby и увидел блог этого парня о создании переменной экземпляра уровня класса в Ruby.Я все еще пытаюсь понять, что код на самом деле делает здесь.Его блог можно найти здесь

http://railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/

, и я создал простой код на его примере, чтобы показать, что я пытаюсь понять

class Polygon
  class << self; attr_accessor :sides end
  @sides = 10
  def initialize
  end
end

class Triangle < Polygon
  @sides = 3
  class << self; attr_accessor :sides end
  def initialize
  end
end

puts Triangle.sides #3
puts Polygon.sides #10

линия, которую я действительно хочу понять, - это (наверное, вы, ребята, догадались),

class << self; attr_accessor :sides end

Что это действительно делает?что он добавляет себя в класс?тогда класс это массив?Пожалуйста, опишите как можно больше.Спасибо.

1 Ответ

6 голосов
/ 22 августа 2010

<< не является методом (который не является эксклюзивным для Array BTW), но является синтаксисом для определения метакласса

По сути, метакласс - это класс отдельного объекта (некоторые люди называют их одноэлементными классами). Например, если вы определите

x = Foo.new
y = Foo.new
class << x
  def quack
    "Quack!"
  end
end

затем вызов x.quack вернет "Кряк", но y.quack выдаст NoMethodError. Таким образом, код оценивается только на метаклассе X.

Но ... классы тоже объекты, верно? Итак, когда вы оцениваете эту строку, это эквивалентно выполнению

class << Triangle
  attr_accessor :sites
end

, который просто определит переменную экземпляра в метаклассе треугольника . Это класс Triange, который также является объектом, будет иметь переменную экземпляра с именем sides

Больше информации в этом и этом ссылках. Как только вы поймете идею, перейдите к ближайшей консоли IRB и поэкспериментируйте с этим.

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