Ruby의 단일 메소드 및 단일 클래스 상세 정보

단일 방법
Ruby는 단일 객체에만 적용되는 단일 객체 추가 방법을 단일 방법이라고 합니다.
예제 코드

str = “just a regular string”

def str.title?
  self.upcase == self
end

str.title? # => false
str.methods.grep(/title?/) # => [:title?]
str.singleton_methods  #=> [:title?]

str.class # => String
String.title? #=> NoMethodError

또한 위에서 사용한 정의 방법 외에 Object#define_를 통해singleton_method 방법으로 단일 방법 정의
단일 방법과 유형 방법
앞의 노트에는 루비에서 클래스도 대상이고 클래스 이름은 상량이기 때문에 클래스에서 호출하는 방법은 사실 대상에서 호출하는 방법과 같다고 나와 있다.
유형 방법의 실질은 하나의 유형의 단일 방법이다. 실제로 단일 방법의 정의와 유형 방법의 정의를 비교하면 사실 양자가 같다는 것을 발견할 수 있다.
 

def obj.a_singleton_method; end
def MyClass.another_class_method; end
둘 다 def 키워드로 정의를 했어요.

def object.method
  # 
end
위의object는 * 대상의 인용, 상량 클래스 이름 또는self일 수 있습니다.
클래스 매크로attr_accessor
Ruby 대상은 속성이 없습니다. 만약 속성과 같은 것을 얻으려면 각각 읽는 방법과 쓰는 방법(즉 자바,objc의 set와 get 방법)을 정의해야 합니다. 가장 직접적인 것은 다음과 같습니다.
예제 코드

class MyClass
  def my_attribute=(value)
    @my_attribute =value  
  end
  def my_attribute
    @my_attribute
  end
end

obj = MyClass.new
obj.my_attribute = ‘x'
obj.my_attribute  #=> ‘x'

그러나 위의 이런 작법은 속성이 많으면 Repeat Yourself가 존재하는데 이때 다음 세 가지 유형의 매크로를 사용할 수 있다.
  • Module#attr_reader는 읽는 방법을 생성합니다
  • Module#attr_writer는 쓰기 방법을 생성합니다
  • Module#attr_accessor는 읽는 방법과 쓰는 방법을 동시에 생성합니다
  • 예제 코드
    
    class MyClass
      attr_accessor :my_attribue
    end
    
    이렇게 하면 훨씬 간결하지 않을까요?물론 사용 방법(읽기와 쓰기)은 위의 실현과 일치한다.
    단품류
    우리는 루비에서 대상을 찾는 방법의 순서를 알고 있다. 먼저 오른쪽으로, 다시 위로 올라가면 그 의미는 먼저 오른쪽으로 대상을 찾는 클래스이고, 먼저 클래스의 실례 방법에서 찾으려고 시도하고, 만약 찾지 못하면 조상의 체인을 따라 계속 찾는 것이다.
    앞편에서 하나의 방법을 소개한 적이 있다. 하나의 방법은 특정한 대상만을 대상으로 효과적인 방법을 가리킨다. 만약에 하나의 대상을 위해 하나의 방법을 정의한다면 이 하나의 방법의 검색 순서는 어떻게 해야 하는가?
    
    class MyClass
      def my_method; end
    end
    
    obj = MyClass.new
    
    def obj.my_singleton_method; end
    
    
    우선, 하나의 방법은 obj에 있지 않습니다. 왜냐하면obj는 하나의 종류가 아니기 때문입니다. 그 다음은 MyClass에 있지 않습니다. 그러면 모든 MyClass는 이 방법을 공유하고 호출할 수 있고 하나의 종류로 구성할 수 없습니다.같은 이치로 한 가지 방법도 조상 체인의 어느 위치(superclass: Object 유사)에 있을 수 없다.정확한 위치는 단일 클래스입니다. 이 클래스는 사실irb에서 대상에게 클래스를 물었을 때 (obj.class) 얻은 클래스입니다. 다른 것은 일반적인 클래스와 약간 다른 클래스입니다.원류 또는 본징류라고도 할 수 있다.
    단일 클래스 열기
    Ruby는 두 가지 방법으로 단일 클래스의 인용을 얻었다. 하나는 전통적인 키워드 class를 통해 특수한 문법을 결합하는 것이다
    법일
     
    
    class << an_object
      #  
    end
    
    obj = Object.new
    singleton_class = class << obj
      self
    end
    singleton_class.class # => Class
    
    
    또 다른 방법은 Object#singleton_을 통해class 방법으로 단일 클래스의 참조를 얻을 수 있습니다.
    법2
    
    “abc”.singleton_class  # => #<Class: #<String:0xxxxxx>>
    
     
    단품류의 특성
  • 각 단품류는 하나의 실례(단품류라고 불리는 원인)만 있을 뿐 계승될 수 없다
  • 단품류는 하나의 대상의 단품방법의 생존처이다
  • 단일 클래스를 도입한 후 방법 찾기
  • 위에서 단품류에 대한 기본적인 인식을 바탕으로 단품류를 도입한 후에 루비의 방법 찾기 방식은 그 종류(일반류)부터 시작하는 것이 아니라 대상의 단품류부터 찾아야 한다. 만약에 단품류에서 원하는 방법을 찾지 못하면 클래스(일반류)를 따라 시작하고 조상 사슬에서 찾아야 한다.이렇게 하면 단일 클래스 이후부터 모든 것이 우리가 단일 클래스를 도입하지 않았을 때의 순서로 돌아간다.
    아래의 이 코드를 통해 스스로 검증할 수 있다
    
    class C
      def a_method
        ‘C#a_method()'
      end
    end
    
    class D < C; end
    
    obj = D.new
    
    
    단일 클래스 열기 정의 단일 방법
    
    class << obj
      def a_singleton_method
        ‘obj#a_singleton_method()'
      end
    end
    
    obj.singleton_class.superclass #=> D
    

    좋은 웹페이지 즐겨찾기