2013-07-01 5 views
-1

function이라는 메서드를 정의하려고합니다.Ruby에서 인스턴스 메소드를 정의하는 방법은 무엇입니까?

a = A.new 

def a.function 
    puts 100 
end 

하지만이 방법은 에 대한 모든 인스턴스 변수뿐 아니라 a을 작업 할 : 나는이 작업을 수행 할 때 작동합니다. 예를 들어 Aa이 아닌 다른 인스턴스에서 function을 호출하면 아무 일도 발생하지 않습니다. 그래서 a.function 대신 함수를 정의하기 위해 A::f을 사용했습니다.

class A 
    attr_accessor :function 
    attr_accessor :var 
end 

def A::function 
    self.var = 0x123 
end 

a = A.new 
a.function 

puts a.var 

이 코드는 정상적으로 컴파일되지만 함수를 호출 할 때 오류가 발생합니다. 왜 효과가 없으며 내가 시도하고있는 것을 어떻게 할 수 있습니까?

+3

입문용 Ruby 튜토리얼을 보았습니까? – Chuck

+0

그렇지 않으면 사람을 혼동시킬 수 있기 때문에 제목을 편집했습니다. @GabrielePetronella와 혼동 스러울 것 같아요. 당신이 생각하는 인스턴스 메서드를 원하지만 클래스에 메서드를 정의하지 마십시오. 그것은 클래스 메소드가 될 것이고 완전히 다른 것입니다.) – Telemachus

답변

5

당신은 입니다. 실제는입니다. 나는 당신이 _why's poignant guide to ruby을 체크 아웃하고 여기에 무슨 일이 일어나고 있는지에 관해 알아볼 것을 제안한다. 바로,하지만 당신을 조종하려는 시도로

...

  • a예를 변수가 아닙니다. A 인스턴스를 참조 할 때 사용하는 로컬 변수입니다.
  • def a.fooa의 고유 클래스에 대한 방법을 정의합니다.
  • attr_accessor :function는 이미 정의 A#function (즉, function라고 A에서 인스턴스 메서드) 기본적으로 다음과 같습니다 def function; @function; end
  • def A::functionA에 클래스 메소드를 정의하면 A.function를 통해 액세스 할 수있는 (안처럼 A의 인스턴스 당신이 예상 할 수처럼 a.function.
  • MRI 정말 루비를 컴파일하지 않습니다. 그것은 그것을 실행, 동적으로 실시간으로 문장 해석.

아마은 기존 방식으로 표준 인스턴스 메서드를 정의하고 "function"을 예약어로 사용하고 다른 언어에서는 특별한 의미가 있으므로 "function"을 자리 표시 자 이름으로 사용하지 않는 것이 좋습니다.

그것 뿐이다
class A 
    def foo 
    'Awww foo.' 
    end 
end 

, 당신은 지금 A (a = A.new)의 인스턴스를 생성하고 (a.foo)에 foo를 호출 할 수 있습니다 그리고 당신은 다시 'Aww foo.'를 얻을 수 있습니다 : 여기 "foo는"을 사용합니다.

+0

_why가 완전히 특이한 스타일의 재미를 찾지 못했다면, [Ruby in Twenty Minutes] (http : //www.ruby-lang. org/ko/documentation/quickstart)에서 [Ruby-lang.org] (https://www.ruby-lang.org)를 방문하십시오. – Telemachus

4
class A 

    def function 
    puts 100 
    end 

end 

a = A.new 
a.function #=> "100" 

이것은 고전적인 인스턴스 방법입니다. 그게 네가 찾고있는거야, 아니면 내가 놓친거야?

0

메서드를 동적으로 정의하려는 경우 Class#define_method을 사용할 수 있습니다. 그렇지 않으면 클래스에 대한 메소드를 정의하려는 경우 클래스 A의 범위에서 정의하는 것만으로 충분합니다.

어쨌든, 성취하고자하는 목표와 어떤 종류의 오류가 있습니까?

관련 문제