RubyとRubyonRailsでメソッドを委任する方法
この記事は、Rubyでのメソッドの委任に関するものです。
delegate
の使用方法を学習します メソッド、Forwardable
モジュールとSimpleDelegator
クラス。
なぜ委任が必要なのですか ?
オブジェクト指向プログラミングでは、クラスが連携する方法は2つあります。
彼らは :
- 継承
- 構成
継承を使用すると、クラス階層を作成します。親クラスは、メソッド、定数、インスタンス変数の定義を、継承するクラスと共有します。
例 :
Rubyでは、すべてのオブジェクトはObject
から継承します デフォルトではクラスです。
そのため、puts
などのメソッドにアクセスできます 、class
&object_id
。
コンポジションを使用すると、クラスは別のクラスからオブジェクトを作成(または与えられ)ます…次に、これらのオブジェクトを使用して作業をそれらに委任します。
例 :
コンピューターは多くの部分(オブジェクト)で構成されており、各部分は1つのことをうまく行う方法を知っています。
画面上に何かをレンダリングしたい場合、コンピュータはグラフィックカードに何を表示するかを指示しますが、その方法は指示しません。
それが構成です !
しかし、あなたがコンピュータであり、グラフィックカードの方法へのアクセスを許可したい場合はどうでしょうか?
それらの間にある種の「架け橋」を構築する必要があります。
その方法を見てみましょう。
ルビーメソッドの委任–例
2つのクラスがあります:
Computer
Memory
次のコードを指定 :
class Computer def initialize @memory = Memory.new end end class Memory def initialize @data = [] end def write(data) @data << data end def read(index) @data[index] end end computer = Computer.new
Computer
を介してのみメモリにアクセスできるようにしたい 。
これにはさまざまな理由が考えられます :
- メモリユニットは1つだけです。つまり、メモリオブジェクトは1つだけです。アクセスを1つのオブジェクトに集中化することで、それを実現できます。
- メモリにアクセスできるユーザー(さまざまなアプリケーション)と、メモリのどの部分を使用できるかを制御する必要があります。
- セキュリティまたはデバッグの目的で、すべてのメモリアクセスをログに記録する必要があります。
これを行おうとすると :
computer.write("rubyguides")
NoMethodError
で失敗します write
がないため Computer
のメソッド 。
undefined method `write' for #<Computer:0x000055c2e8f7d310> (NoMethodError)
Computer
クラスはあなたがwrite
の意味を知りません 。
そうでない限り...
write
を作成します メソッド!
方法は次のとおりです :
class Computer def initialize @memory = Memory.new end def write(data) @memory.write(data) end def read(index) @memory.read(index) end end
リクエストを@memory
に渡します オブジェクト。
それがメソッドの委任です。
注 :これにより、これらのメソッドがパブリックインターフェイスの一部になり(すべてのユーザーが利用できるようになります)、常に必要になるとは限りません。
ある種のメソッド委任のショートカットはありますか ?
はい!
見てみましょう...
転送可能モジュールの使用方法
今 :
Forwardable
を使用できます デリゲーターメソッドを定義するためのRubyに含まれるモジュール。
このように機能します :
require 'forwardable' class Computer extend Forwardable def_delegators :@memory, :read, :write def initialize @memory = Memory.new end end
これにより、以前に作成したメソッドを削除でき、同じことを実行できます。
Forwardableはメソッド引数(ブロックを含む!)を処理するので、それについて心配する必要はありません。
いいじゃないですか? 🙂
RailsDelegateメソッドの使用方法
RailsまたはActiveSupportgemを単独で使用している場合は、delegate
にアクセスできます。 メソッド。
これがその仕組みです :
class Computer delegate :read, :write, to: :@memory def initialize @memory = Memory.new end end
delegate
メソッドはprefix
を取ります 引数。メソッド名にプレフィックスを追加できます。
例 :
class Computer delegate :read, :write, prefix: "memory", to: :@memory def initialize @memory = Memory.new end end
2つの方法で結果 :
-
memory_read
-
memory_write
SimpleDelegatorですべてを委任する方法
学習したこれらの手法は、特定のメソッドを転送または委任するために使用されます。
ただし、オブジェクトをラップしてそのすべてのメソッドを公開したい場合は...
SimpleDelegator
を使用できます クラス!
方法は次のとおりです :
require 'delegate' class CoolArray < SimpleDelegator end cool = CoolArray.new([]) cool << "ruby" cool << "gems" p cool
今CoolArray
new
に渡すオブジェクトのように動作します 。
なぜこれが役立つのですか?
元のクラスを変更せずに、このオブジェクトに新しいメソッドを追加できます。
ビデオチュートリアル
概要
Rubyでのオブジェクト構成と、さまざまな手法を使用してメソッドを委任する方法について学習しました。
この記事を楽しんだら、共有してください Rubyの友達と一緒に。
読んでくれてありがとう🙂
-
Rubyメソッドをスパイする方法
Rubyには、TracePointを使用してアクセスできるトレースシステムが組み込まれています。 クラス。トレースできるものには、メソッド呼び出し、新しいスレッド、および例外があります。 なぜこれを使いたいのですか? さて、特定のメソッドの実行を追跡したい場合に便利です。他にどのようなメソッドが呼び出されているか、および戻り値は何かを確認できます。 いくつかの例を見てみましょう! メソッド呼び出しのトレース ほとんどの場合、TracePointが必要になります 組み込みメソッド(プット、サイズなど)ではなくアプリケーションコードをトレースするため。 これは、callを使用して行うこと
-
Rubyの配列クラスの使用方法(例+便利なメソッド)
アレイとは何ですか? 配列は組み込みのRubyクラスであり、0個以上のアイテムのリストを保持します 、およびこれらすべてのアイテムを簡単に追加、アクセス、およびループするのに役立つメソッドが含まれています。 配列が存在しない場合は多くの変数を使用する必要があるため、これは便利です。 例 : a =1b =2c =3 しかし、代わりに、あなたはそうすることができます : 番号=[1、2、3] 最良の部分は? 配列内には何でも入れることができます! いいね : 数字 文字列 より多くのアレイ! (それは多次元配列になります) アレイを最大限に活用できるように、アレイについ