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

Rubyのシンタックスシュガーメソッド

新しいRubyMagicの記事へようこそ!このエピソードでは、Rubyがシンタックスシュガーをどのように使用するかを見ていきます。 構文の一部をより表現力豊かにする、または読みやすくするため。最後に、Rubyのトリックのいくつかが内部でどのように機能するか、そしてこの砂糖を少し使用する独自のメソッドを作成する方法を理解します。

Rubyアプリを作成する場合、非標準と思われる方法でクラス属性、配列、ハッシュを操作するのが一般的です。属性を割り当て、配列またはハッシュから値をフェッチするメソッドをどのように定義しますか?

Rubyは、これらのメソッドを呼び出すときにこれらのメソッドを機能させるために、少し構文糖衣構文を提供します。この投稿では、それがどのように機能するかを探ります。

person1 = Person.new
person1.name = "John"
 
array = [:foo, :bar]
array[1]  # => :bar
 
hash = { :key => :foo }
hash[:key] # => :foo
hash[:key] = :value

シンタックスシュガー?

シンタックスシュガーとは、✨魔法のほんの少しを指します。✨Rubyは、より読みやすく簡潔なコードを書くことを可能にします。 Rubyでは、これは特定の記号やスペースを省略したり、ある種のヘルパーを使用して式を記述したりすることを意味します。

メソッド名

メソッド名から始めましょう。 Rubyでは、他の言語では一般的にサポートされていないメソッド名に、あらゆる種類の文字と特殊記号を使用できます。 Railsアプリを作成したことがある場合は、おそらく save!に遭遇したことがあります。 方法。これはRailsに固有のものではありませんが、のサポートを示しています。 Rubyメソッド名の文字。

=などの他の記号にも同じことが当てはまります。 、[] |<> *- + および/

これらの文字のサポートは、メソッド名にそれらを組み込んで、それらの目的をより明確にすることができることを意味します。

  • 属性の割り当て: person.name ="foo"
  • 質問する: person.alive?
  • 危険なメソッドを呼び出す: car.destroy!
  • オブジェクトをそうでないもののように動作させる: car [:wheels]

属性メソッドの定義

attr_accessorを使用してクラスの属性を定義する場合 、Rubyは、クラスのインスタンス変数のリーダーメソッドとライターメソッドを作成します。

class Person
  attr_accessor :name
end
 
person = Person.new
person.name = "John"
person.name # => "John"

内部的には、Rubyは2つのメソッドを作成します。

  • Person#name attr_readerを使用してクラスの属性/インスタンス変数を読み取るため 、および;
  • Person#name = attr_writerを使用してクラスに属性/インスタンス変数を書き込むため 。

ここで、この動作をカスタマイズするとします。 attr_accessorは使用しません ヘルパーと自分でメソッドを定義します。

class AwesomePerson
  def name
    "Person name: #{@name}"
  end
 
  def name=(value)
    @name = "Awesome #{value}"
  end
end
 
person = AwesomePerson.new
person.name = "Jane"
person.name # => "Person name: Awesome Jane"

name =のメソッド定義 これは、メソッド person.name ="Jane"を呼び出すときに記述する方法とほぼ同じです。 。等号=の周りのスペースは定義しません メソッドを呼び出すときに括弧を使用しないでください。

オプションの括弧とスペース

Rubyでは、括弧はオプションであることが多いのを見たことがあるかもしれません。メソッドに引数を渡す場合、引数を括弧で囲む必要はありません() 、ただし、読みやすい場合は可能です。

ifステートメントは良い例です。多くの言語では、ifステートメントが評価する式を括弧で囲みます。 Rubyでは省略できます。

puts "Hello!" if (true) # With optional parentheses
puts "Hello!" if true   # Without parentheses

同じことがメソッド定義やその他の式にも当てはまります。

def greeting name # Parentheses omitted
  "Hello #{name}!"
end
 
greeting("Robin") # With parentheses
greeting "Robin"  # Without parentheses
greeting"Robin"   # Without parentheses and spaces

最後の行は読みにくいですが、機能します。メソッドを呼び出す場合でも、括弧とスペースはオプションです。

すべての括弧とスペースを省略しないように注意してください。これらのいくつかは、Rubyがあなたの意味を理解するのに役立ちます。疑わしい場合は、引数を括弧で囲んで、RubyとRubyがどの引数がどのメソッド呼び出しに属するかを認識できるようにします。

メソッドを呼び出す次のすべての方法がサポートされていますが、コードを少し読みやすくするために、通常は括弧を省略し、スペースを追加します。

# Previous method definition:
# def name=(value)
#   @name = "Awesome #{value}"
# end
 
person.name = "Jane"
person.name="Jane"
person.name=("Jane") # That looks a lot like the method definition!

これで、 nameのカスタム属性リーダーおよびライターメソッドが定義されました。 属性。必要に応じて動作をカスタマイズし、コールバックを使用せずに、属性を割り当てるときに値に対して直接変換を実行できます。

[]の定義 メソッド

次に見るのは、角括弧メソッド []です。 Rubyで。これらは通常、値をフェッチして配列インデックスとハッシュキーに割り当てるために使用されます。

hash = { :foo => :bar, :abc => :def }
hash[:foo]        # => :bar
hash[:foo] = :baz # => :baz
 
array = [:foo, :bar]
array[1] # => :bar

これらのメソッドがどのように定義されているかを見てみましょう。 hash [:foo]を呼び出す場合 これを機能させるために、Rubyのシンタックスシュガーを使用しています。これを書く別の方法は次のとおりです:

hash = { :foo => :bar }
hash.[](:foo)
hash.[]=(:foo, :baz)
# or even:
hash.send(:[], :foo)
hash.send(:[]=, :foo, :baz)

私たちが通常これを書く方法と比較して( hash [:foo] およびhash[:foo] =:baz )すでにいくつかの違いがわかります。最初の例では( hash。[](:foo) )Rubyは、最初の引数を角かっこで囲みます( hash [:foo] )。 hash。[]=(:foo、:baz)を呼び出す場合 2番目の引数は、値 hash [:foo] =:bazとしてメソッドに渡されます。 。

これを知っているので、独自の []を定義できます。 および[]= Rubyがそれを理解する方法をメソッドします。

class MyHash
  def initialize
    @internal_hash = {}
  end
 
  def [](key)
    @internal_hash[key]
  end
 
  def []=(key, value)
    @internal_hash[key] = value
  end
end

これらのメソッドが通常のRubyメソッドであることがわかったので、他のメソッドと同じロジックを適用できます。 []で複数のキーを許可するなどの奇妙なことを実行することもできます メソッド。

class MyHash
  def initialize
    @internal_hash = { :foo => :bar, :abc => :def }
  end
 
  def [](*keys)
    @internal_hash.values_at(*keys)
  end
end
 
hash = MyHash.new
hash[:foo, :abc] # => [:bar, :def]

独自の作成

Rubyの構文糖衣について少し知ったので、この知識を適用して、カスタムライター、ハッシュのようなクラスなどの独自のメソッドを作成できます。

実際にはそうではないのに、配列やハッシュのように感じさせるために、角かっこメソッドなどのメソッドを定義するgemの数に驚かれるかもしれません。 1つの例は、Railsアプリケーションで次のようにフラッシュメッセージを設定することです。
flash [:alert]="エラーが発生しました" 。 AppSignalジェムでは、これを Configで使用します。 構成をフェッチするための省略形としてのクラス。

これで、Rubyでのメソッド定義と呼び出しのシンタックスシュガーについて簡単に説明しました。この記事がどのように気に入ったか、質問がある場合、次に何を読みたいかを知りたいので、@AppSignalまでお知らせください。


  1. Rubyメソッドをスパイする方法

    Rubyには、TracePointを使用してアクセスできるトレースシステムが組み込まれています。 クラス。トレースできるものには、メソッド呼び出し、新しいスレッド、および例外があります。 なぜこれを使いたいのですか? さて、特定のメソッドの実行を追跡したい場合に便利です。他にどのようなメソッドが呼び出されているか、および戻り値は何かを確認できます。 いくつかの例を見てみましょう! メソッド呼び出しのトレース ほとんどの場合、TracePointが必要になります 組み込みメソッド(プット、サイズなど)ではなくアプリケーションコードをトレースするため。 これは、callを使用して行うこと

  2. Rubyの配列クラスの使用方法(例+便利なメソッド)

    アレイとは何ですか? 配列は組み込みのRubyクラスであり、0個以上のアイテムのリストを保持します 、およびこれらすべてのアイテムを簡単に追加、アクセス、およびループするのに役立つメソッドが含まれています。 配列が存在しない場合は多くの変数を使用する必要があるため、これは便利です。 例 : a =1b =2c =3 しかし、代わりに、あなたはそうすることができます : 番号=[1、2、3] 最良の部分は? 配列内には何でも入れることができます! いいね : 数字 文字列 より多くのアレイ! (それは多次元配列になります) アレイを最大限に活用できるように、アレイについ