Rubyで「自己」を理解する
今日はself
についてお話したいと思います 。しばらくの間Rubyをプログラミングしているのであれば、self
のアイデアを内面化した可能性があります。 。プログラムを読み書きするときはいつでも、self
あなたの心の後ろにあります。
ただし、経験の浅いRubyistの場合は、self
困惑する可能性があります。常に変化していますが、コードに明示的に表示されることはありません。あなたはただ知っていることが期待されています。
初心者が直面する問題の多くは、self
を理解していないことが原因です。 。インスタンス変数を「失った」か、ミックスインに表示されるデータに戸惑ったことがある場合は、self
を理解していなかったことが原因です。 その文脈で。
この投稿では、self
について見ていきます。 毎日のさまざまな状況で。
self
とは ?
Rubyのすべてがオブジェクトであると人々が言うのを聞いたことがあるかもしれません。それが本当なら、それはあなたが書くコードのすべての部分がいくつかのオブジェクトに「属している」ことを意味します。
self
現在実行中のコードを「所有する」オブジェクトを指す特別な変数です。 Rubyはself
を使用します どこでも:
- インスタンス変数の場合:
@myvar
- メソッドおよび定数ルックアップの場合
- メソッド、クラス、モジュールを定義するとき。
理論的には、self
かなり明白です。しかし実際には、トリッキーな状況が発生するのは簡単です。だから私はこの投稿を書きました。
self
の例
ここで、いくつかの例を見ていきます。最初のものがあなたにとって基本的すぎると思われる場合は、読み続けてください。彼らはより高度になります。
以下のコードでは、reflect
インスタンスメソッドです。これは、Ghost.new
を介して作成したオブジェクトに属しています 。つまり、self
そのオブジェクトを指します。
class Ghost
def reflect
self
end
end
g = Ghost.new
g.reflect == g # => true
この例では、reflect
Ghost
のクラスメソッドです 。クラスメソッドでは、クラス自体がメソッドを「所有」します。 self
クラスを指します。
class Ghost
def self.reflect
self
end
end
Ghost.reflect == Ghost # => true
モジュール内の「クラス」メソッドでも同じように機能します。例:
module Ghost
def self.reflect
self
end
end
Ghost.reflect == Ghost # => true
クラスとモジュールはRubyではオブジェクトとして扱われることを忘れないでください。したがって、この動作は、最初の例で見たインスタンスメソッドの動作とそれほど変わりません。
Railsのようなフレームワークに非常に適したRubyの機能の1つは、クラスおよびモジュール定義内で任意のコードを実行できることです。クラス/モジュール定義内にコードを配置すると、他のRubyコードと同じように実行されます。唯一の本当の違いは、self
の値です。 。
以下に示すように、self
定義中のクラスまたはモジュールを指します。
class Ghost
self == Ghost # => true
end
module Mummy
self == Mummy # => true
end
混合メソッドは、self
に関しては、「通常の」インスタンスまたはクラスメソッドと同じように動作します。 。意味あり。そうしないと、ミックスインは、ミックスインしたクラスと対話できません。
reflect
にもかかわらず メソッドはモジュールで定義されており、そのself
混合されたクラスのインスタンスです。
module Reflection
def reflect
self
end
end
class Ghost
include Reflection
end
g = Ghost.new
g.reflect == g # => true
extend
するとき クラスメソッドに混在させるクラス、self
通常のクラスメソッドとまったく同じように動作します。
module Reflection
def reflect
self
end
end
class Ghost
extend Reflection
end
Ghost.reflect == Ghost # => true
一度にたくさんのクラスメソッドを定義するためのこの人気のあるショートカットを見たことがあるでしょう。
class Ghost
class << self
def method1
end
def method2
end
end
end
class << foo
構文は実際にはかなり興味深いものです。これにより、オブジェクトのメタクラスにアクセスできます。これは、「シングルトンクラス」または「固有クラス」とも呼ばれます。メタクラスについては、今後の投稿でさらに詳しく取り上げる予定です。ただし、今のところ、メタクラスは、Rubyが特定のオブジェクトに固有のメソッドを格納する場所であることを知っておく必要があります。
self
にアクセスする場合 class << foo
の中から ブロック、メタクラスを取得します。
class << "test"
puts self.inspect
end
# => #<Class:#<String:0x007f8de283bd88>
クラス外でコードを実行している場合でも、Rubyはself
を提供します 。 Object
のインスタンスである「main」を指します :
puts self.inspect # => main
-
Rubyでの複製とクローン:違いを理解する
Rubyでオブジェクトをコピーできることをご存知ですか?それだけでなく、これを行うには2つの異なる方法があります! これらの方法は : dup clone すぐに違いを探りますが、最初に… なぜオブジェクトのクローンを作成するのですか? ? Rubyの多くのオブジェクトは変更可能であり、変更することができます。 オブジェクトを変更したいが、元のコピーを保持する場合 その後、クローンを作成できます。 たとえば。 最初の要素を除くすべての要素を含む配列が必要な場合があります。 これを行う1つの方法 : a = [1,2,3,4,5] a[1..-1] # [2,3,4
-
Rubyのデコレータデザインパターン
デコレータのデザインパターンは何ですか? そして、Rubyプロジェクトでこのパターンをどのように使用できますか? デコレータデザインパターンは、新機能を追加することでオブジェクトを強化するのに役立ちます クラスを変更せずにそれに。 例を見てみましょう! ロギングとパフォーマンス この例では、rest-clientのようなgemを使用してHTTPリクエストを作成しています。 次のようになります: require restclient data = RestClient.get(www.rubyguides.com) 今 : 一部のリクエストにログを追加したいが、RestCli