2011-12-16 4 views
6

저는 루비와 ROR을 동시에 배우고 다른 사람의 코드에서 한 가지를 발견했습니다. 때로는이 두 가지 방식으로 정의되는 메서드를 볼 수 있습니다.`def self.myMethod`와`def myMethod` 사이에 어떤 차이점이 있습니까?

class SomeClass < SomeInheritance::Base 

    def self.myMethod 
    end 

    def myOtherMethod 
    end 

end 

차이가 있습니까? 즉, 메서드 정의에서 self을 사용하면 메서드가 어떻게 작동하는지에 영향을 줍니까? 어떤 계발도 환영합니다.

+0

아니요, 자기. 클래스 수준 메서드는 자체가없는 반면 인스턴스 메서드는 만듭니다. 그래서 '자아'. 하나는 SomeClass.myMethod로 호출 될 수 있지만 다른 하나는 SomeClass의 인스턴스가 필요합니다. – aishwarya

+3

http://scotland-on-rails.s3.amazonaws.com/2A04_DaveThomas-SOR.mp4 – cristian

+0

@ Octopus-Paul 링크를 주셔서 감사합니다 – marcio

답변

20

def self.method_name는 인스턴스 메서드가 아닌 클래스 메소드를 정의합니다 - 것이다

class << self; def foo; end; end

같은 주제에 대한 좋은 게시물 카츠

예를 들어

예후에서 this post입니다 :

class Foo 
    def method_1 
     "called from instance" 
    end 

    def self.method_2 
     "called from class" 
    end 

    class << self 
     def method_3 
     "also called from class" 
     end 
    end 
end 

> Foo.method_1 
NoMethodError: undefined method 'method_1' for Foo:Class 

> Foo.method_2 
=> "called from class" 

> Foo.method_3 
=> "also called from class" 

> f = Foo.new 
=> #<Foo:0x10dfe3a40> 

> f.method_1 
=> "called from instance" 

> f.method_2 
NoMethodError: undefined method 'method_2' for #<Foo:0x10dfe3a40> 

> f.method_3 
NoMethodError: undefined method 'method_3' for #<Foo:0x10dfe3a40> 
+0

그래서'method_2'와'method_3'는 정적 메소드와 비슷합니까? – marcio

+2

+1 좋은 답변 : 예를 들면 1000 단어의 설명이 가치가 있습니다. – wallyk

+1

@marcioAlmada - 정적 메서드처럼 작동합니다. Foo는 f와 같은 객체이고 method_2는 Foo의 (메타) 클래스에 정의 된 메소드입니다. 더 나은 설명을 위해 링크 된 게시물을 읽으십시오. – klochner

1

이 코드를 사용하면 :

class SomeClass 
    p self 
end 

'SomeClass'가 인쇄됩니다. self이 SomeClass 객체를 참조하기 때문입니다 (예, clases는 Ruby의 객체이기도합니다). (이 실제로 개체의 메타 클래스에 정의되어 있지만 ...) 자기와

, 당신은 즉 , 클래스 객체에 메소드를 class_method를 정의 할 수 있습니다 : 루비에 대해 알고 훨씬 더있다

class SomeClass 
    def self.class_method 
    puts "I'm a class method" 
    end 

    def instance_method 
    puts "I'm an instance method" 
    end 
end 

SomeClass.class_method # I'm a class method 

개체 모델. 데이브 토머스 (Dave Thomas)는이 주제에 대해 탁월한 발언을했습니다. @ Octopus-Paul의 링크를 참조하십시오.

+0

이미'self'가 다른 언어의'this'와 같았으므로 클래스 메소드 (다른 언어의 정적 메소드와 동등)를 선언하는 데 사용되었다는 것을 알아 내지 못했습니다. +1 – marcio

+0

@marcioAlmada'self'는 실제로 컨텍스트에 따라 그 의미를 변경합니다. :) 일단'self'를 이해하면 Ruby 객체 모델을 이해합니다. – maprihoda

관련 문제