RubyとRubyonRailsでメソッドを委任する方法
この記事は、Rubyでのメソッドの委任に関するものです。
delegateの使用方法を学習します メソッド、Forwardable モジュールとSimpleDelegator クラス。
なぜ委任が必要なのですか ?
オブジェクト指向プログラミングでは、クラスが連携する方法は2つあります。
彼らは :
- 継承
- 構成
継承を使用すると、クラス階層を作成します。親クラスは、メソッド、定数、インスタンス変数の定義を、継承するクラスと共有します。
例 :
Rubyでは、すべてのオブジェクトはObjectから継承します デフォルトではクラスです。
そのため、putsなどのメソッドにアクセスできます 、class &object_id 。
コンポジションを使用すると、クラスは別のクラスからオブジェクトを作成(または与えられ)ます…次に、これらのオブジェクトを使用して作業をそれらに委任します。
例 :
コンピューターは多くの部分(オブジェクト)で構成されており、各部分は1つのことをうまく行う方法を知っています。
画面上に何かをレンダリングしたい場合、コンピュータはグラフィックカードに何を表示するかを指示しますが、その方法は指示しません。
それが構成です !
しかし、あなたがコンピュータであり、グラフィックカードの方法へのアクセスを許可したい場合はどうでしょうか?
それらの間にある種の「架け橋」を構築する必要があります。
その方法を見てみましょう。
ルビーメソッドの委任–例
2つのクラスがあります:
ComputerMemory
次のコードを指定 :
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] 最良の部分は? 配列内には何でも入れることができます! いいね : 数字 文字列 より多くのアレイ! (それは多次元配列になります) アレイを最大限に活用できるように、アレイについ