я не видел окончательного ответа на исходное сообщение , Недавно я прочитал книгу «Красноречивый рубин» Руса Олсена, поэтому решил добавить сюда мой прием.
Область применения, в которой первый пример определяет переменную [email protected], представляет собой область видимости класса, то есть, если ключевое слово должно было появляться вне метода def, но все еще в определении класса, оно ссылалось бы на объект Документ, который, в свою очередь, является экземпляром класса Class.
Первый пример поэтому определяет переменную экземпляра класса, т. Е. Переменная @default_font является переменной экземпляра объекта Document, объекта класса.
Эта переменная экземпляра класса должны быть доступны только через методы доступа на уровне класса, например, Document.default_font, а не скажем, an_instance_of_Document.default_font
Так что, если вы определяете attr_accessors:
class Document
@default_font = :Arial # this is a class instance variable,
# def self.default_font
# @default_font
# end
#
# def self.default_font=(font)
# @default_font = font
# end
# or replace the above two class methods with the following
class << self
attr_accessor :default_font
end
end
Вот некоторые IRB выход:
1.9.3p429 :002 > require './document.rb'
=> true
1.9.3p429 :004 > Document.default_font
=> :Arial
1.9.3p429 :005 > Document.default_font = :Times
=> :Times
1.9.3p429 :006 > Document.default_font
=> :Times
1.9.3p429 :007 > doc = Document.new
=> #<Document:0x007fe6730d8228>
1.9.3p429 :008 > doc.default_font
NoMethodError: undefined method `default_font' for #<Document:0x007fe6730d8228>
Тот факт, что второй exampl e в исходном сообщении не содержит определения одной переменной @ вне метода def, указывает, что здесь @default_font является переменной экземпляра, на которую может ссылаться только экземпляр объекта класса Document.
class Document
def default_font=(font)
@default_font = font # this defines and set an instance variable
end
def default_font
@default_font # this defines an instance variable
end
# or above two defs can be replaced by the following
attr_accessor :default_font # this defines the instance variable and access methods
end
Вот некоторые IRB выход:
1.9.3p429 :001 > require './document.rb'
=> true
1.9.3p429 :002 > Document.default_font
NoMethodError: undefined method `default_font' for Document:Class
1.9.3p429 :003 > doc = Document.new
=> #<Document:0x007ffbf1136f88>
1.9.3p429 :004 > doc.default_font
=> nil
1.9.3p429 :005 > doc.default_font = :Arial
=> :Arial
1.9.3p429 :006 > doc.default_font
=> :Arial
Так какая разница между ними? –