로그'메타프로그램 루비 버전 2'5장 읽기

제5장: 목요일: 정의 클래스


개시하다
  • 루비의 class 키워드는 실행 대상의 동작 규정뿐만 아니라 실제 실행 코드
  • 본 장에서 클래스 매크로(수정 클래스의 방법)/반사 별명(코드로 포장하는 방법)/특이 클래스(단식 클래스)
  • 설명

    범주 정의

  • 클래스 정의에 모든 코드를 배치할 수 있습니다
  • 방법을 정의하는 장소가 아니다
  • class MyClass
        puts 'Hello'
    end
    
  • 방법이나 블록과 같고 클래스 정의도 마지막 명령문의 값
  • 을 되돌려줍니다.
  • 클래스(또는 모듈) 정의에서 클래스는 현재 대상self
  • 클래스와 모듈은 하나의 대상일 뿐입니다.
  • result = class Myclass
        self
    end
    
    result #=> MyClass
    

    현재 수준

  • 루비 프로그램에는 항상 현재 객체 self와 현재 클래스가 있습니다.
  • 방법을 정의한 후 현재 클래스의 실례 방법 중
  • 프로그램의 최고 단계, 현재 단계는main류의 Object입니다.
  • 방법에서 현재 대상의 클래스가 현재 클래스로 바뀐다.
  • 현재 객체

  • self
  • 실례적인 방법을 호출하는 수신기
  • Module#class_eval

  • 클래스 이름을 모를 경우 학급 개설에 사용
  • 클래스 상하문에서 블록 평가
  • def add_method_to(a_class)
        a_class.class_eval do
            def m; 'Hello!'; end
        end
    end
    
    add_method_to Strign
    "abc".m #=> "Hello!"
    "abc".m.class #=> String
    
  • class_eval에서 self와 현재 단계를 변경
  • 현재 클래스 변경을 통해 클래스를 다시 열 수 있음
  • class에 비해 상수,classeval 참고 클래스의 변수라면 모두 사용할 수 있음
  • class_eval은 균형기를 가지고 있기 때문에classeval 블록의 작용 범위 이외의 변수
  • 를 참조할 수 있다

    instance_eval 및 classeval의 차별화 사용

  • 클래스 이외의 대상을 열려면 instanceeval
  • 클래스 정의를 열려면 def 정의 방법을 사용하면classeval
  • 현재 분류 요약

  • 루비의 해석기는 항상 현재 범주의 참조를 추적합니다.
  • def에서 정의한 모든 방법은 현재 클래스의 실례적인 방법입니다.
  • 클래스 정의에서 현재 대상self는 현재 클래스(정의 클래스)와 같다
  • 클래스에 대한 참조가 있으면 클래스는classeval을 통해 열 수 있음
  • 클래스 인스턴스 변수

  • 클래스 실례 변수와 클래스 대상 실례 변수는 분리된다
  • 클래스 작용역에서 정의된 변수는'클래스 실례 변수'
  • 이다

  • 메소드 필드에 정의된 변수는 인스턴스 변수입니다.

  • 참고 자료 이 글은 매우 참고 가치가 있다.
  • 클래스만 접근할 수 있고 클래스 실례나 하위 클래스는 접근할 수 없음
  • class MyClass
        @my_var = 1
        def self.read; @my_var; end
        def write; @my_var = 2; end
        def read; @my_var; end
    end
    
    obj = MyClass.new
    # インスタンスメソッドでアクセスできない。
    obj.read #=> nil
    obj.write
    # インスタンスメソッドwriteで定義したものを呼び出す
    obj.read #=> 2
    # クラスメソッドで呼び出せる!
    MyClass.read #=> 1 
    

    클래스 변수

  • 에 @@@ 접두사를 붙인
  •   class C
        @@v = 1
      end
    
  • 클래스 변수도 하위 클래스나 일반 실례 방법에서 접근할 수 있다
  • 클래스 변수는 클래스에 속하지 않고 클래스 등급에 속한다.
  • 중첩되는 경우가 있으므로 Rubbyist는 클래스 변수를 사용하지 않으며 클래스 인스턴스 변수를 권장합니다.
  • 특수한 방법


  • 개별 객체에 특화된 방법
  • 특정 대상에 방법을 추가할 수 있음
  • Object#define_singleton_method로 정의할 수 있음
  • str = "just a regular string"
    
    def str.title?
        self.upcase == self
    end
    
    self.title? #=> false
    str.methods.grep(/title?/)  #=> [:title?]
    str.singleton_methods               #=> [:title?]
    

    루비의 유형

  • '유형'은 대상 반응의 방법의 집합에 불과하다
  • 루비와 같은 동적 언어에서 대상의'유형'은 이 종류와 엄격한 관계가 없다
  • 오리구이

  • '형'은 대상이 반응하는 방법의 집합일 뿐 유동형이다.
  • 실제 분류 방법

  • 류는 대상일 뿐이고 류명은 상수
  • 라고 한다
  • 류 방법은 류의 특이한 방법이다
  • 종류


  • 클래스 정의에 사용되는 클래스 방법
  • ex) attr_accessor
  • 특수류

  • 대상의 일반류와 분리되어 있는 특수류를 가리킨다
  • 원류와 단식류

  • 특수류는 대상의 특이한 방법이 있는 곳이다
  • Object#singleton_class 또는 class << 構文를 통해 볼 수 있습니다
  • .
  • 특수류는 하나의 실례만 가지고 있다
  • 그래서 단식이에요.

  • 객체에 특이한 방법이 있는 경우 Ruby는 일반 클래스가 아닌 특이 클래스 방법부터 검색을 시작합니다.
  • Ruby 객체 모델의 7가지 규칙

  • 객체는 한 가지 뿐입니다.
  • 일반 개체 또는 모듈로 변환
  • 모듈은
  • 일반 모듈, 클래스, 특이 클래스 중 하나
  • 방법은 딱 하나
  • 방법은 모듈에 산다(대부분 반이다)
  • 모든 객체(클래스 포함)에 "실제 클래스"포함
  • 일반 클래스 또는 특이 클래스
  • 모든 클래스(BasicObject 제외)에는 선조가 있음
  • 모든 레벨이 BasicObject에 상속 체인을 가집니다.
  • 대상의 특이류의 슈퍼류는 대상의 류이다
  • 류의 특이류의 슈퍼류는 류의 슈퍼류의 특이류
  • 방법을 호출할 때 루비는 수신기의 진짜 반을 향해'우향'청소를 하고 상속체인을'위쪽'으로 전진한다.
  • 유형 방법의 문법

  • self.사용 방법
  • class MyClass
        def self.another_class_method; end
    end
    
  • 사용<
    class MyClass
        class << self
            def yet_another_class_method; end
        end
    end
    

    메소드 레지스터


    반사 별칭

  • Module#alias_method 를 사용하여 Ruby 메소드에 별칭 추가
  • alias_method를 사용할 때, 먼저 새로운 방법 이름을 입력한 다음, 원래의 이름을 입력하십시오
  • class myClass
        def my_method; 'my_method()'; end
        alias_method :m, :my_method
    end
    
    obj = MyClass.new
    obj.my_method   #=> "my_method()"
    obj.m                   #=> "my_method()"
    

    방법 재정의

  • 새 메서드를 정의하고 원래 이름을 지정합니다.
  • 원시적인 방법을 바꾸지 않음
  • 반사 별명을 정리해 보도록 하겠습니다.

  • 메소드에 별명
  • 재정의 방법
  • 새로운 방법에서 낡은 방법을 사용한다.
  • 감상


    응,, 어려워.억지로 먹는 느낌
    시차를 두고 다시 한 번 읽다.

    좋은 웹페이지 즐겨찾기