Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyの継承されたフックメソッド-そしてより多くの子育てのレッスン

こんにちは子供と両親、ええとルビー主義者。以前の記事では、祖先の連鎖について詳しく説明しました。今日の投稿では、子育てと継承について詳しく説明します。継承されたフックメソッドを調べ、継承の防止について調べます。

子供が101を継承する場合:継承されたフックメソッド

親子関係がどのように宣言されているかを見てみましょう。 Rubyは、クラスが別のクラスの親として宣言されている場合に、クラスと対話するための優れた方法を提供します。

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

このコードを実行すると、「子は親から継承します」がParent.inheritedとして出力されます。 Childのときにメソッドが呼び出されます クラスはParentから継承します 。このメソッドは、サブクラスをパラメーターとして受け取ることに注意してください— Child 、 私たちの場合には。このメカニズムを使用すると、Parentクラスと対話して、継承された場合にのみ一連の動作を定義できます。動作とは、このコンテキストでは、継承または継承されたクラスの変数、メソッド、および定数を変更、定義、または削除することを意味します。

それでは、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..)

このエラーが発生するのは、RubyonRailsがこのクラスからの継承を妨げるメカニズムを提供しているためです。では、なぜRuby on Railsがこのメカニズムを実装したのですか?

移行は、RubyonRailsの特定のバージョンと強く結びついています。実際、このクラスによって提供されるAPIは、2つのバージョン間でわずかに変わる可能性があります。したがって、Ruby on Railsをアップグレードするときに移行が中断しないようにするために、フレームワークではActiveRecord::Migrationクラスの特定のバージョンを選択する必要があります。これにより、移行がスムーズに実行されます。

class AddFirstnameToUsers < ActiveRecord::Migration[4.2]
end

上記の例では、移行はActiveRecord::Migrationに結合されています RubyonRailsのバージョン4.2で提供されるAPI。そのため、アプリケーションをバージョン5.0にアップグレードしても、バージョン4.2のActiveRecord::Migrationで実行されるため、移行はスムーズに実行されます。 API。

継承の防止のしくみ

理由がわかったので ここでは継承が防止されています。方法を見てみましょう このActiveRecord::Migration 継承を防ぎます。すべてのロジックは、ActiveRecord::Migration.inheritedで定義されています メソッド。

class AddFirstnameToUsers < ActiveRecord::Migration[4.2]
end

AddFirstnameToUsers クラスはActiveRecord::Migrationから継承します 、ActiveRecord::Migration.inherited フックメソッドが呼び出されます。

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

ご覧のとおり、このフックメソッドはサブクラス(AddFirstnameToUsersActiveRecord::Migrationから直接継承します 。含まれている場合、エラーが発生します。これは、継承を制御するための完璧なエントリポイントです。

結論

今日は、継承と継承の防止の基本について説明しました。継承されたフックメソッドについて説明し、継承/継承されたクラスをオンザフライで操作するときに非常に便利になることを確認しました。

実際の設定では、継承で遊ぶときは注意してください。既存のメソッドまたはクラスを削除またはオーバーライドする場合は、十分に注意してください。これにより、いくつかの望ましくない副作用が発生する可能性があります。子供たちはあなたをパパと呼ぶのをやめるかもしれません。

EtVoilà、これで今日の投稿は終わりです!


  1. Ruby Mapメソッドの使用方法(例付き)

    Mapは、配列、ハッシュ、範囲で使用できるRubyメソッドです。 マップの主な用途は、データを変換することです。 例 : 文字列の配列が与えられた場合、すべての文字列に目を通し、すべての文字を大文字にすることができます。 または、Userのリストがある場合 オブジェクト… 変換できます 対応するメールアドレス、電話番号、またはその他の属性のリストにそれらを追加します Userで定義 クラス。 これを行う方法を正確に見てみましょう! ルビーマップ構文 マップの構文は次のようになります: array = [a, b, c] array.map { |string| string.

  2. Rubyのデコレータデザインパターン

    デコレータのデザインパターンは何ですか? そして、Rubyプロジェクトでこのパターンをどのように使用できますか? デコレータデザインパターンは、新機能を追加することでオブジェクトを強化するのに役立ちます クラスを変更せずにそれに。 例を見てみましょう! ロギングとパフォーマンス この例では、rest-clientのようなgemを使用してHTTPリクエストを作成しています。 次のようになります: require restclient data = RestClient.get(www.rubyguides.com) 今 : 一部のリクエストにログを追加したいが、RestCli