0

Ну, как название показано на рисунке, в чем разница между этими двумя переменными экземпляра класса нижеВ чем разница между определением переменной экземпляра класса в классе и методом. Зачем?

class Document 
    @default_font = :Arial 
    ... 
end 

И

class Document 
    def foo 
    @default_font = :Arial 
    end 
    ... 
end 

Есть ли кто-нибудь может объяснить мне. Большое спасибо.

ответ

0

В вашем первом случае переменная не является переменной класса (которая должна была начинаться с @@ или переменной экземпляра. Это просто локальная переменная, недоступная вне текущей области, даже в пределах методов экземпляра.

Вторая переменная экземпляра.

class Document 
    attr_accessor :var1, :var2 
    @var1 = 1 
    puts @var1 + 2 

    def initialize 
    @var2 = 4 
    puts @var2**2 
    #puts @var1 + 6 
    end 

end 

1.9.2p0 :208 > class Document 
1.9.2p0 :209?>  attr_accessor :var1, :var2 
1.9.2p0 :210?>  @var1 = 1 
1.9.2p0 :211?>  puts @var1 + 2 
1.9.2p0 :212?> 
1.9.2p0 :213 >  def initialize 
1.9.2p0 :214?>   @var2 = 4 
1.9.2p0 :215?>   puts @var2**2 
1.9.2p0 :216?>   #puts @var1 + 6 
1.9.2p0 :217 >   end 
1.9.2p0 :218?> 
1.9.2p0 :219 >  end 
3 
=> nil 
1.9.2p0 :220 > d = Document.new 
16 
=> #<Document:0x1a2f0c @var2=4> 

@var1 + 6 внутри метод экземпляра выдает ошибку.

1

Второй сценарий не является переменной экземпляра класса. Это простая переменная экземпляра экземпляра.

+0

Так какая разница между ними? –

0

я не видел окончательного ответа на исходное сообщение , Недавно я прочитал книгу «Красноречивый рубин» Руса Олсена, поэтому решил добавить сюда мой прием.

Область применения, в которой первый пример определяет переменную [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 
Смежные вопросы