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

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

  1. Rubyでの複製とクローン:違いを理解する

    Rubyでオブジェクトをコピーできることをご存知ですか?それだけでなく、これを行うには2つの異なる方法があります! これらの方法は : dup clone すぐに違いを探りますが、最初に… なぜオブジェクトのクローンを作成するのですか? ? Rubyの多くのオブジェクトは変更可能であり、変更することができます。 オブジェクトを変更したいが、元のコピーを保持する場合 その後、クローンを作成できます。 たとえば。 最初の要素を除くすべての要素を含む配列が必要な場合があります。 これを行う1つの方法 : a = [1,2,3,4,5] a[1..-1] # [2,3,4

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

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