オブジェクトに関係した操作を行うためのメソッド

メソッドとは「操作」ということです。rubyでは全ての操作を「メソッド」としています。オブジェクトに関係した(紐づいた)操作を行う際にこの「メソッド」が使われます。

吉田先生

メソッドとは操作のことを指します。メソッドは、たとえばオブジェクトに紐づいた操作を行う際などに使われるものです。


メソッドとは

これまで以下のメソッドについて解説してきました。

  • puts
  • print
  • times
  • each
  • loop

putsを例に説明すると、

puts ("こんにちは")
 #こんにちは

これは「puts」が「 () 」括弧内の内容を出力(表示)するメソッドである為「こんにちは」という文字列が表示されます。この「 () 」内の内容を引数(ひきすう)及びパラメータと呼びます。

ですのでputsというメソッドは、引数を出力(表示)するというメソッドという事です。ちなみに、「 () 」は省略できます。引数の内容が単純な要素であれば省略して書いても分かりにくなることはないので省略して書きましょう。

メソッドを呼び出す

メソッドを呼び出したい(使いたい)ときは

オブジェクト.メソッド名(引数, 引数2)

引数の数や順番には規定があり、それに従い指定します。この場合の「オブジェクト」のことを「レシーバ」と呼ぶことがあります。メソッドの実行の際下記イメージの様に「オブジェクトは命令を受け取る側」ととらえるためです。

皆さんも実際に画像のコードを書き、「method.rb」として実行してみましょう。

ブロックつきメソッド

前回の章で繰り返しを学びました。以下はeachメソッドですね。

オブジェクト.each do |変数|
 処理
end

この構文の「do ~ end」の部分、こちらを「ブロック」と呼びます。eachメソッドは以下のような書き方もできると学んだと思います。

オブジェクト.each {|変数|
 処理
}

この構文の場合のブロックは「 { ~ } 」となります。こういった、ブロックとセットでのメソッド呼び出しのことを、ブロックつきメソッド呼び出しといいます。引数がある場合は、以下のようになります。

オブジェクト.each(引数, 引数2) do |変数|
 処理
end

オブジェクト.each(引数, 引数2) {|変数|
 処理
}

*引数が存在する場合「do ~ end」なら「 () 」を省略可能ですが、「 { ~ } 」の場合は「 () 」は省略不可です。

ブロック冒頭の「 | | 」バーティカルバーの中の変数は「ブロック変数」と呼ばれます。ブロックを実行(処理が行われる)する際に、メソッドからブロック変数へ値が渡されます。

種類

rubyには3種類のメソッドがあります。

  • インスタンスメソッド
  • クラスメソッド
  • 関数的メソッド

これらは、レシーバ(オブジェクト)の内容によって分類されます。

インスタンスメソッド

インスタンスメソッドが最も使われるものでしょう。これはレシーバが「インスタンス(オブジェクト)」であるメソッドのことです。ですので、とあるクラスに属しているオブジェクト、つまりインスタンスが受け取ることのできる命令、これがインスタンスメソッドという事になります。

では、インスタンスメソッドにはどのようなものが有るかというと、これはオブジェクトがどのクラスに属しているかによって異なります。例を挙げてみます。

▼文字列オブジェクト

文字列オブジェクトは「String」クラスに属しています。この場合

「length」や「split」等のメソッド

が使用できます。この中から、文字列の長さを求めるメソッドの「length」を使ってみましょう。

"こんにちは".length
 #=> 5

ただし、異なるクラスに属する2つのオブジェクトが存在するとします。そして2つのオブジェクトで使用可能な同じインスタンスメソッドがあるとします。この場合同じメソッドでも出力結果が属するクラスにより異なります。

クラスメソッド

こちらはレシーバが「クラス」そのものになります。「クラス」が受け取ることのできる命令という事になります。では、クラスメソッドにはどんなものが有るかというと例えば「new」というメソッドです。

とあるクラスがあり、そのクラスに属するオブジェクト(インスタンス)を作成したい場合などに、クラスメソッド「new」を使います。書き方は2通りあります。

(クラス).new

(クラス)::new

関数的メソッド

関数的メソッドにはレシーバ部分が省略されているものです。インスタンスメソッドは、異なるクラスに属する2つのオブジェクトがある時に、同じメソッドを使ったとしても属するクラスにより出力結果が異なります。と学びました。

しかし、関数的メソッドはどんなレシーバでも出力結果が変わることがないので、レシーバは不要なのです。例を挙げると、「puts」や「print」これらは関数的メソッドとなります。

定義する

メソッドを自分で定義する事も出来ます。ここではメソッドの定義の仕方などについて学んでいきましょう!

*メソッドを定義するにはクラスを先に定義しなくてはなりませんがクラスの作成に関しては、クラスの章で詳しく学びましょう。

書き方は以下のようになります。

def メソッド名(引数)
 処理
end

メソッド名に使う事が出来るのは

  • アルファベット
  • 数字
  • 「_」(アンダースコア)

です。ただし、1文字目に数字を置くことは出来ません。必ずアルファベットかアンダースコアで書き始めましょう。

では、実際にコードを実行してみましょう!

def hi(name="new_user")
 puts  "Hi, #{name}!"
end

hi()
 #=>Hi, new_user
hi("Leon")
 #=>Hi, Leon

上記の例は、引数にデフォルト値を指定しています。ここで指定したデフォルト値は4つ目のコードの様に「 () 」の中を空欄に(引数を省略)した場合に使われます。上記の様に「引数名=デフォルト値としたい値」という書き方になります。デフォルト値以外の値を使用したいときは、5つ目のコードの様に指定すればOKです。

*もちろんデフォルト値を指定せず「def hi(name)」とすることも可能です。

戻り値

メソッドの中で戻り値を指定するという事も出来ます。指定したい場合は「return文」というものを使います。構文は以下のようになります。

return 

この「return」は省略できます。

ブロックつきメソッドの定義をする

ブロックつきメソッドの定義を行う場合は、「yield」というものを使います。このyieldを使う事でメソッド呼び出しの際に記述したブロックを実行できます。実際に実行し使ってみましょう。

def block
 yield
end

block do
 puts "こんにちは"
end
#こんにちは

このブロック付きメソッドの定義についてはブロックの章でもっと詳しく学んでいきましょう。

引数の数が不定な場合

引数の数を定めないとしたい場合、「*引数(変数名)」と記述します。構文は以下。

def  メソッド名(*引数)
 処理
end
def  メソッド名(引数, *引数)
 処理
end
  • 1つ目 - 基本の構文。他2つもそうですがこの構文後、引数を指定する記述をした時その引数は配列となります。
  • 2つ目 - 不定といっても最低1つは引数を指定するとしたいときはこのように書きます。

キーワード引数

キーワード引数とは「引数名:値」という形のセットを引数(キーワード引数)として指定できるというものです。この場合の書き方は以下のようになります。

def  メソッド名(引数: 引数の値)
 処理
end

引数の値の部分には、デフォルト値を上記の構文のような形で入れることもOKですし、デフォルト値なしとしたい場合は「引数:」と書けばOKです。

また、以下のように複数の引数を指定したとき、呼び出し時には引数の記述の順番を守る必要はありません。順不同で良いのです。そして、デフォルト値がある場合の引数であれば、呼び出し時に「引数: 値」という指定は書かなくてもOKです(省略可)。

*通常の引数とキーワード引数を一緒に記述する事も出来ます。

def  メソッド名(引数,  引数:値)
 処理
end

まとめ

メソッドとは操作のことを指します。メソッドは、たとえばオブジェクトに紐づいた操作を行う際などに使われるものです。

メソッドではブロックが使うことができ以下種類のメソッドが存在します。

インスタンスオブジェクトがレシーバなのがインスタンスメソッド

クラスがレシーバなのがクラスメソッド

レシーバが省略されているのが関数メソッド

無料ビデオ講座のお知らせ

Skillhub [スキルハブ]では無料の動画講座を多数公開しています。他校だと数万円するような講座が無料で受講できます。

無料講座一覧を見る

×