답변

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

그래서 그들 사이의 차이점은 무엇입니까 :

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 출력입니까? –

0

나가 원래 포스트 최종 답변을하지 않았다. I 재 러스 올센 (Russ Olsen)의 책 "Eloquent Ruby"를 천천히 읽으므로 여기에 나의 테이크 아웃을 추가하기로 결정했습니다.

첫 번째 예제가 단일 @ 변수를 정의하는 범위는 클래스 범위입니다. 즉, 키워드 자체이 메소드 정의 외부에 나타나지만 여전히 클래스 정의 내에 나타나면 객체를 참조합니다 Document, Class 클래스의 인스턴스입니다.

첫 번째 예는 클래스 인스턴스 변수를 정의합니다. 즉, @default_font 변수는 클래스 객체 인 객체 Document의 인스턴스 변수입니다.

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 
:

이 클래스의 인스턴스 변수는 클래스 수준의 접근 방법,는 예를 들어, 오히려 말보다 Document.default_font, an_instance_of_Document.default_font

그래서 당신이 attr_accessors 정의하는 경우를 통해 액세스 할 수 있어야

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> 

사실이 두 번째 예에서 원본 게시물에는 메소드 정의 외부에 단일 @ 변수 정의가 포함되어 있지 않습니다. @default_font는 인스턴스 변수이며 Document 클래스의 인스턴스화 된 객체에서만 참조 할 수 있습니다.

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 
관련 문제