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

Rubyスーパーキーワードの使い方

スーパーキーワードはRubyで何をしますか?

superを呼び出すメソッドと同じ名前の親クラスのメソッドを呼び出します 。

i_like_chocolateという名前のメソッドを呼び出す場合 、次にsuperを呼び出します そのメソッド内で、Rubyは、このメソッドを所有している人の親クラスで同じ名前の別のメソッドを見つけようとします。

これにより、通常のメソッド呼び出しのようにクラスの祖先チェーン全体で泡立ち続けます。 。

メソッドが存在しない場合は、NoMethodErrorがトリガーされます 例外、およびmethod_missingの場合 それを使用することがわかりました。

いくつかのコード例を見てみましょう!

引数なしのスーパー

次の例では、Catがあります。 Animalから継承するクラス 。

Cat クラスにはnameがあります superを使用するメソッド 親クラスで同じメソッドを呼び出すには(Animal

コードは次のとおりです:

class Animal
  def name
    puts "Animal"
  end
end

class Cat < Animal
  def name
    super
  end
end

cat = Cat.new
cat.name

# "Animal"

Rubyのスーパーキーワードは、引数の有無にかかわらず使用すると動作が異なります

引数なし:

元のメソッド呼び出しに使用された引数を新しいメソッドに渡します 、キーワード引数と指定されている場合はブロックを含みます。

ここに例があります

def puts(*)
  super
end

puts 1, 2, 3

このメソッドは、クラスの外部で定義され、Objectに属します。 。これは、元のputsの前に呼び出されることを意味します メソッド。

今:

putsを呼び出すとき superを使用する私たちが作成したこの新しいメソッドを呼び出しています 元のputsを呼び出す 。

SuperとSuper()を使用する場合

superの使い方を見てきました 親メソッドを呼び出すため。

しかし、親メソッドが同じ数の引数をとらない場合はどうなりますか?

その場合、次を使用できます:

  • super() 引数なし
  • super(arg1, arg2, ...) 渡す引数を選択する

def puts
  super()
end

ここで括弧が特別な意味を持っていることに注意してください 、通常のメソッド呼び出しとは異なります。

superについて知っておくべきことがいくつかあります :

  • メソッド内でのみ使用できます
  • 親メソッドを呼び出した結果を返します
  • 複数回呼び出すことができます

太線(super 結果を返す)は、superの使用法のいくつかを理解するための鍵です 野生で見つけるかもしれません。

superを使用できます デコレータパターンを実装する場合、またはinitialize内で呼び出す場合 メソッドは、親クラスのインスタンス変数を初期化するために使用できます。

概要

Rubyスーパーキーワードについて学習しました 、それが何であるか、そしてそれがさまざまな状況でどのように機能するか!

この記事を楽しんだ場合は、RubyGuidesニュースレターを購読して、このようなコンテンツや、購読者だけが利用できるその他の便利なRubyのヒントを入手することをお勧めします。


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

    grepについて話しましょう メソッド。 この方法で何ができますか? Grepを使用して、配列や範囲などの列挙可能なオブジェクトをフィルタリングできます。 「しかし、selectはすでにそれを行っています!」 はい。ただし、grepの動作は異なり、結果も異なります。 いくつかの例を見てみましょう。 RubyGrepメソッドの例 この配列が与えられた場合: objects = [a, b, c, 1, 2, 3, nil] grepを使用して文字列のみを取得できます : objects.grep(String) # [a, b, c] 整数のみ: objects.g

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

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