Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Ruby의 상속된 Hook 메서드와 더 많은 육아 수업

안녕하세요, 어린이 및 학부모님, 헴 루비스트입니다. 이전 기사에서 우리는 조상 사슬에 대해 알아보았습니다. 오늘의 포스트에서는 양육과 상속에 대해 더 깊이 파고들 것입니다. 상속된 hook 방법을 탐색하고 상속을 방지하는 방법을 살펴보겠습니다.

아이들이 101을 상속할 때:상속된 후크 방법

부모가 어떻게 선언되는지부터 살펴보겠습니다. Ruby는 클래스가 다른 클래스의 부모로 선언될 때 클래스와 상호작용하는 깔끔한 방법을 제공합니다.

class Parent
  def self.inherited(subclass)
    puts "#{subclass} inherits from Parent"
  end
end
 
class Child < Parent
end

이 코드를 실행하면 Parent.inherited로 "Child inherits from Parent"가 출력됩니다. 메소드는 Child 클래스는 Parent에서 상속됨 . 이 메서드는 하위 클래스를 매개변수로 사용합니다(Child). , 우리의 경우. 이 메커니즘을 사용하면 부모 클래스와 상호 작용하여 상속된 경우에만 동작 집합을 정의할 수 있습니다. 이 컨텍스트에서 동작이란 상속 또는 상속된 클래스의 변수, 메서드 및 상수를 수정, 정의 또는 삭제하는 것을 의미합니다.

이제 parent_name 즉석에서 방법:

class Parent
  def self.inherited(subclass)
    subclass.define_method :parent_name do
      "Daddy"
    end
  end
end
 
class Child < Parent
end
 
Child.new.parent_name # => "Daddy"

여기에서는 Child에 대한 메서드를 정의합니다. Parent로부터 상속받은 클래스 클래스에 해당 메소드를 직접 추가하지 않고 Parent 수업. 대신, 다른 클래스가 Parent에서 상속할 때만 정의됩니다. .

자, 이론을 다뤘으니 이제 Rubyist의 삶에서 좀 더 현실적인 예를 살펴보겠습니다.

클래스 상속 방지

Ruby on Rails에서 데이터베이스 마이그레이션은 ActiveRecord::Migration에 의해 처리됩니다. 수업. 이 클래스에서 직접 상속을 시도해보자.

class AddFirstnameToUsers < ActiveRecord::Migration
end
 
# => StandardError (Directly inheriting from ActiveRecord::Migration is not supported..)

이 오류는 Ruby on Rails가 이 클래스에서 상속하지 못하도록 하는 메커니즘을 제공하기 때문에 발생합니다. 그렇다면 Ruby on Rails가 이 메커니즘을 구현한 이유는 무엇입니까?

마이그레이션은 특정 버전의 Ruby on Rails와 강력하게 연결됩니다. 실제로 이 클래스에서 제공하는 API는 두 버전 간에 약간 변경될 수 있습니다. 따라서 Ruby on Rails를 업그레이드할 때 마이그레이션 중단을 방지하기 위해 프레임워크는 ActiveRecord::Migration 클래스의 특정 버전을 선택하도록 강제합니다. 이렇게 하면 마이그레이션이 원활하게 실행됩니다.

class AddFirstnameToUsers < ActiveRecord::Migration[4.2]
end

위의 예에서 마이그레이션은 ActiveRecord::Migration에 연결됩니다. Ruby on Rails 버전 4.2에서 제공되는 API입니다. 따라서 애플리케이션을 버전 5.0으로 업그레이드하더라도 ActiveRecord::Migration 버전 4.2에서 계속 실행되기 때문에 마이그레이션이 원활하게 실행됩니다. API.

상속 방지의 작동 원리

이제 이유를 이해했습니다. 여기서 상속이 방지됩니다. 어떻게ActiveRecord::Migration 상속을 방지합니다. 모든 로직은 ActiveRecord::Migration.inherited에 정의되어 있습니다. 방법.

class AddFirstnameToUsers < ActiveRecord::Migration[4.2]
end

AddFirstnameToUsers 클래스는 ActiveRecord::Migration에서 상속합니다. , ActiveRecord::Migration.inherited hook 메소드가 호출됩니다.

module ActiveRecord
  class Migration
    def self.inherited(subclass) #:nodoc:
      super
      if subclass.superclass == Migration
        raise StandardError, "Directly inheriting from ActiveRecord::Migration is not supported. " \
          "Please specify the Rails release the migration was written for:\n" \
          "\n" \
          "  class #{subclass} < ActiveRecord::Migration[4.2]"
      end
    end
  end
end

보시다시피 이 후크 메서드는 하위 클래스(AddFirstnameToUsers ) ActiveRecord::Migration에서 직접 상속 . 그렇다면 오류가 발생합니다. 이것은 상속을 제어하기 위한 완벽한 진입점입니다.

결론

오늘은 상속에 대한 기본 사항과 상속을 방지하는 방법에 대해 알아보았습니다. 우리는 상속된 후크 메서드를 다루었고 상속/상속된 클래스와 즉시 상호 작용할 때 이 방법이 어떻게 매우 편리할 수 있는지 보았습니다.

실제 환경에서 상속을 사용할 때 주의하십시오. 기존 메서드나 클래스를 제거하거나 재정의할 때는 매우 주의해야 합니다. 이로 인해 원치 않는 부작용이 발생할 수 있습니다. 아이들이 당신을 아빠라고 부르지 않을 수도 있습니다.

자, 이것으로 오늘의 포스팅을 마치겠습니다!