2012-06-06 7 views

답변

7

attr_accessor :somevar 변수 @somevar을 참조하십시오. 인스턴스 변수 앞에는 @ 부호가 와야합니다. 메서드에 @ 기호가없는 'somevar'와 같은 다른 모든 변수는 해당 메서드 또는 범위에 대한 로컬 변수이며 객체의 인스턴스 변수가 아닙니다. 방법의 첫 번째 행을 변경 따라서

, "A"

@somevar = 'something' 

가 예상이 질문에 발생합니다.

관련 메모 : Ruby에서 인스턴스 변수를 선언 할 필요가없는 경우 @somevar 유형 표기법으로 인스턴스 변수를 만듭니다. attr_accessor 메서드는 해당 인스턴스 변수에 대한 setter 및 getter를 만듭니다.

Ruby의 메소드가 객체에 첨부되어 있으므로 클래스 A가 자체 somevar setter 메소드를 호출하려면 self.somevar = 'something'을 작성해야합니다. 그렇지 않으면 Ruby 파서는 사용자가 로컬 변수를 작성한다고 생각합니다.

방금 ​​수행하여, b에서 방법 a를 호출 할 수 있기 때문에 이것은 혼란 스러울 수 :

def b 
    send :somevar=,'something' 
    puts @somevar 
    a # would invoke its own method 'a' 
end 

을하지만 setter 메소드 somevar=이 같은 표기법으로 로컬 변수를 만드는 모호 :

somevar='something' # Ruby assumes you want to create a local variable 

somevar setter 메서드를 호출하려면 다음과 같이 자체 메서드를 호출한다고 명시해야합니다.

self.somevar = 'something' 

send :somevar=,'something'을 호출 할 때도 somevar 인스턴스 메소드를 호출하고있었습니다.

+0

그러나 메소드 (setter) 대신 로컬 변수가 작성된 이유는 무엇입니까? – Kuraga

+1

Ruby의 메소드가 객체에 첨부되어 있기 때문에 클래스 A가 자신의 somevar setter 메소드를 호출하려면'self.somevar = 'something''을 써야합니다. 그렇지 않으면 Ruby 파서는 당신이 단지 로컬 변수를 작성한다고 생각합니다. 위의 답변을 더 자세히 설명하기 위해 업데이트했습니다. – quux00

+0

Ok thanx :)))))))))) – Kuraga

1

메서드 a는 somevar라는 로컬 변수를 만들기 때문에 발생합니다. 루비의 작은 단점 중 하나입니다. self.somevar = 'something' 또는 @somevar = 'something'을 사용하여이 문제를 해결할 수 있습니다.

+0

하지만 왜? 동일한 이름의 메소드가 종료되었지만 로컬 변수가 생성 되었습니까? – Kuraga

+1

아마 안전상의 이유로. 'somevar'라는 setter 메소드를 가지고 있고 그것을 사용하기 시작했다는 것을 알지 못한다면, 당신이 그것을 알지 못하면이 값을 덮어 쓸 것입니다. –

관련 문제

 관련 문제