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

제3장 화요일: 방법


동적 방법


  • 호출 방법은 대상에게 메시지를 보내는 것입니다
  • Object#send

  • 호출 방법은 약간 메모와 Object#send
  • obj.send(:my_method, 3)

  • Object#send를 사용하면 어떤 방법으로든 호출할 수 있습니다.
  • privete 방법을 호출할 수 있기 때문에send
  • 를 사용합니다

    동적 분포

  • send 사용 방법, 호출할 방법명을 매개 변수로 결정하고 코드가 실행될 때 호출하는 방법
  • 동적 정의 방법


    Module#define_method

  • 실행 시 방법 이름을 정의할 수 있음
  • 전달 방법의 명칭과 블록을 통해 블록이 방법의 주체가 된다
  • class MyClass
        define_method :my_method do |my_arg|
            my_arg * 3
        end
    end
    
    obj = MyClass.new
    obj.my_method(2) #=> 6
    

    1단계: 동적 디스크 추가


    2단계: 동적 생성 방법


    3단계: 코드에 주석 달기


    method_missing


  • 기본 분류의 privete 실례 방법
  • NoMethodError의 역할
  • 을 되돌려줍니다
  • 지정된 방법은 상속 체인을 거슬러 올라가도 찾을 수 없는 상황에서 루비는 method에서미스싱을 외치며 실패를 인정하다.
  • method_Missing이 불려나오자마자
  •   hoge.send :method_missing, :my_method
      => NoMethodError: undefined method 'my_method' for <...>
    
  • method_만약missing을 다시 쓰면 실제 존재하지 않는 방법을 호출할 수 있다
  • class Lawyer
      def method_missing(method, *args)
        puts "呼び出した: #{method}(#{args.join(',')})"
        puts "(ブロックも渡した)" if block_given?
      end
    end
    
    bob = Lawyer.new
    bob.talk_simple('a', 'b') do
        # ブロック
    end
    
    => 呼び出した: talk_simple(a,b)
    (ブロックも渡した)
    

    유령 방법

  • method_missing을 호출할 때 일반적인 것처럼 보이지만 수신기에 대응하는 방법을 찾을 수 없습니다.
  • '이해할 수 없는 일을 부탁받으면 이것부터 하자'는 느낌
  • 동적 에이전트

  • 그림자를 보충하는 방법으로 다른 대상에게 전송하는 대상.
  • respond_to_missing?

  • Ruby、respondto?유령을 식별하는 방법
  • method_missing을 초과했을 때,respond-to_missing?중량을 초과해야 한다.
  • const_missing

  • 존재하지 않는 상수를 참조하면 Ruby는 상수의 이름을 const로 표시합니다상징으로 missing에게 맡기다.
  • 클래스 이름은 상수일 뿐입니다. 알 수 없는 참조 Module#constMissing
  • 에 전달

    여백 석판

  • 최소한의 방법만 있는 상태를 가리키는 클래스
  • 공백 석판이 필요하면 BasicObject
  • 를 직접 계승합니다

    총결산


    가능하면 동적 방법을 사용하고 방법이 없으면 유령 방법을 사용한다.

    감상


    Object#send 동적 호출 메서드, Module#define 사용method를 사용하면 동적 정의 방법과 같은 동적 방법의 존재를 알 수 있다.
    또한 BasicObject#method미스싱을 덮어쓰고 귀신 방법으로 존재하지 않는 방법을 만드는 방법을 알고 있습니다.
    일단 보면 이런 느낌을 알아차릴 수 있다.실제로 직접 사용하려면 더욱 익숙하고 자신감 있는 피부감이 필요하다.

    좋은 웹페이지 즐겨찾기