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

Rubyエイリアスキーワードの使用方法

Rubyメソッドに別の名前を付けるには、次の2つの方法があります。

  • エイリアス(キーワード)
  • alias_method

彼らはわずかに異なる方法で同じことをするので、これは紛らわしいトピックになる可能性があります。

この画像は違いの要約です

Rubyエイリアスキーワードの使用方法

しっかりと理解するために、これらの違いをさらに詳しく調べてみましょう!

エイリアスキーワード

まず、aliasがあります 、これはRubyキーワードです(ifなど) 、defclass 、など)

このように見えます

alias print_something puts

print_something 1

print_somethingを呼び出しています putsを呼び出すのと同じです 。

alias いくつかの興味深い属性を持つキーワードです :

  • 特別な構文があります
  • コード内のどこでも使用できます
  • グローバル変数のエイリアスを作成できます(これは行わないでください)

有効な形式のエイリアスは

  • エイリアスab
  • エイリアス:a:b
  • エイリアス:”#{}”:b

引数の間にコンマがないことに注意してください 通常の方法のように。

Rubyは両方のaを期待しています &b 有効なメソッド名であるために、変数はここでは機能しません。変数を使用する場合は、次のようなことを行う必要があります…

a = :print_something
b = :puts

alias :"#{a}" :"#{b}"

しかし、これは見苦しいので、alias_methodを使用することをお勧めします 動的メソッド名の場合。

alias_methodメソッド

次へ:

alias_methodがあります 、これはModuleで定義されたメソッドです 。

このメソッドはクラスおよびモジュールレベルでのみ使用でき、インスタンスメソッド内では使用できません。

ドキュメントからの説明です

alias_method:「new_nameを作成します メソッドold_nameの新しいコピー 。これは、オーバーライドされたメソッドへのアクセスを保持するために使用できます。」

class Foo
  alias_method :print_something, :puts
end

これにより、print_somethingのエイリアスが作成されます puts Fooの内部 。

文字列はalias_methodとして使用できます 引数。

class Foo
  alias_method "print_something", "puts"
end

エイリアスとalias_method

aliasの概要を見てきました &alias_method

しかし、違いはいつ影響しますか?

  1. 動的に生成されたメソッド名のエイリアスを定義する場合 (「abc#{rand}」など)
  2. メソッド内でエイリアスを定義する場合

動的に生成されたメソッド名のエイリアスを定義するには、aliasを使用します。 キーワードですが、補間記号を使用する必要があります。

alias_methodを使用 より柔軟な議論が得られます。

class Cat
  def speak
    "meow"
  end

  alias_method "#{name.downcase}_speak", :speak
end

p Cat.new.cat_speak
# "meow"

メソッド内でエイリアスを定義する場合は、次のエラーが発生します:

undefined method 'alias_method' for # (NoMethodError)

クラスではなくオブジェクト内で作業しているからです!

インスタンスメソッド内では、Moduleで定義されたメソッドにアクセスできません 、ここでalias_method 定義されています。

考えられる解決策の1つです

def enable_aliased_methods
  self.class.send(:alias_method, :x, :testing)
end

aliasの使用 :

def enable_aliased_methods
  alias :x :testing
end

1つの重要な違い:

  • aliasによって定義されたメソッド aliasが存在するクラスに属します 使用されます
  • alias_methodによって定義されたメソッド selfに属します 、コード実行時の現在のクラス

これが重要な理由です:

aliasを使用する親クラスのメソッドを呼び出す場合 キーワード…

エイリアシングは、メソッドを呼び出しているクラスではなく、親クラスで発生します。

class Food
  def create_alias
    alias print_on_screen puts
  end
end

class Apple < Food
end

Apple.new.create_alias

ただし、alias_methodを使用する場合 メソッドはAppleでのみエイリアス化されます 。

エイリアシングはメソッドのコピーを作成します

alias_methodの説明に従って &alias (keyword) 、Rubyはメソッドのコピーを作成します。

新しい名前だけではありません。

ただし、メソッドの実際のコピー

これにはいくつかの実用的な意味があります:

def bacon
  123
end

alias :x :bacon

x
# 123

bacon
# 123

したがって、xのエイリアスを作成します baconへ 、baconを再定義するとどうなるか見てみましょう :

def bacon
  234
end

x
# 123

bacon
# 234

x メソッドは同じままですが、bacon 新しい値を返します!

メソッドのエイリアシングの後にモジュールをクラスに含める場合、これは驚くべきことです。

ビデオチュートリアル

概要

一般的に、私はもっとalias_methodが好きです それは実際の方法だからです。

alias キーワードには、覚えておく必要のある特別な属性がいくつかあります。

何か新しいことを学びましたか?

この記事を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.