注目キーワード
  1. 機械学習
  2. プログラミング
  3. 副業
NO IMAGE

【Ruby入門】メソッド(関数)とは?使い方も解説

  • 2020年7月24日
  • 2020年7月23日
  • 未分類
  • 10174view

 

テックキャンプを卒業して絶賛転職活動中のライト( @LIGHTS0602)です。

 

会員サイトやECサイトを立ち上げる時に絶対に出てくるのが新規登録、ログイン機能ですよね。

 

半年前はデータベースに保存する仕組みが分からなくてparamsの仕組みを全く分かっていませんでした。

最近、個人アプリを作り始めてようやく理解し始めた次第です。

今回はメモや復習としてparamsメソッドの使い方や仕組みについて解説していきます。

 

メソッドとは

メソッドは特定の処理をまとめた塊のことを言います。

 

メソッドをよく関数と表現しますが、メソッドと関数は少し違います。

 

・関数とは

関数は何かしらの処理をひとまとめにしたもので引数を受け取ったり、戻り値を返したりするものになります。

 

・メソッドとは

オブジェクト指向プログラミングのオブジェクトとして定義されている関数をメソッドと表現します。

 

なのでRubyの場合は全てがオブジェクト指向になるので全て関数ではなくメソッドと呼ぶのです。

 

Rubyでのメソッドはdefで定義されて使います。

 

defの使い方

def 名前(仮引数名,…)

  処理1

  処理2

    ….

end

 

とメソッドを定義して使います。

 

メソッドを定義してHello worldを定義するとこのように書きます。

 

def SayHello

    puts(“Hello”)

end

 

このようにメソッドを定義してSayHelloを実行すると「Hello」と表示されます。

 

メソッドの特徴

ではどうしてメソッドは使われるのでしょうか?

 

例えば”Hello”と表示したいとしましょう。

 

関数がない場合、毎回”Hello”と表示させるためにはputs “Hello”と書かなければいけません。

 

ですが関数がある場合は

 

def SayHello

    puts(“Hello”)

end

 

と記述して定義しておけばあとはSayHelloと入力するだけで”Hello”と表示されます。

 

簡単ですよね。

 

さらに引数を使えばもっと幅広い表現をすることができます。

 

メソッドを使った時のメリット

例えばnameという引数にそれぞれ入力した名前をnameに代入して表示したいとします。

 

・引数とは

引数とはキーワード引数とも言い、同じ位置にある仮引数と同じ位置に実引数によってメソッドを実行されるものです。

 

そうすると

 

name = gets

def SayHello(name)

   puts “Hello #{name}!”

end

 

SayHello(name)

 

naomiと入力した結果:

Hello naomi!

 

このように入力してnameに代入される名前が一緒に表示されます。

 

このようにSayHello(name)と記述するだけで入力された名前を連結してHello○○と表示できるのでとても便利ですよね。

 

メソッドの種類は?

メソッドの種類は組み込み関数とユーザー定義関数の2種類あります。

 

・組み込み関数とは

プログラミング言語に標準で組み込まれている関数

 

・ユーザー定義関数

ユーザーが自分で定義する関数

となっております。

 

Rubyの場合は組み込み関数のことを「カーネルメソッド」と呼び、「ユーザー定義関数」のことをメソッドと主に呼びます。

 

では組み込み関数とユーザー定義関数の違いを見ていきましょう。

 

組み込み関数

組み込み関数とはRubyに標準で準備されている関数のことでありputsやprintなどのように標準で備わっている関数のことです。

 

組み込み関数が備わっていなければ相当機能が制限されてしまい、キーボードや外部ファイルからのデータを取り込むことはできませんし、結果をコンソールやファイルに出力することもできません。

 

もし上記のようになってしまえばプログラミング言語として相当欠陥品ですよね。。。汗

 

標準である程度、言語を理解できれば実装できる程度のサービス機能を提供するのが組み込み関数です。

 

では少しどのようなものが組み込み関数といわれているのか見てみましょう。

 

・組み込み関数の一覧

str:出力を文字列として返します。

Array (arg):arg.to_ary か arg.to_a を呼び出して引数を配列に変換した結果を返します。

Float(arg):引数を浮動小数点数(Float)に変換した結果を返します。

Integer(arg):引数を整数に変換した結果を返します。

String(arg):arg.to_s を呼び出して引数を文字列に変換した結果を返します。

abort Ruby:プログラムを異常終了します。exit との違いは、呼び出し時に $! が nil でなければその例外のメッセージを標準エラー出力に出力することと、プログラムの終了ステータスが EXIT_FAILURE(ほとんどの環境では1) 固定であることです。

at_exit { …. }:与えられたブロックをインタプリタ終了時に実行します。

autoload(const_name, feature):定数 const_name を最初に参照した時に feature を require するように設定します。

binding:変数・メソッドなどの環境情報を含んだ Binding オブジェクトを生成して返します。通常、eval の第二引数として使います。

caller([level]):level 段上(引数省略時は、1)の呼び出し元の情報を $@ の形式のバックトレース(文字列の配列)として返します。トップレベルでは空の配列を返します。caller の戻り値を $@ に代入することで例外の発生位置を設定できます。

callcc {|cont| …. } 直前の状態(ローカル変数の定義、スタックフレーム)を cont に記憶してブロックを実行します。cont は、Continuation クラスのインスタンスで、Continuation#call メソッドを実行することでいつでも記憶した状態を継続することができます。

catch(tag) {|tag| …. }:ブロックを実行してその値を返します。ブロックの実行中に tag と同じ名前の throw が行われた場合は、その throw の第二引数を戻り値とします。

chop:組み込み変数 $_ を最後の文字を取り除いたものにします(終端が”\r\n”であれば2文字取り除きます)。

chop!:組み込み変数 $_ を最後の文字を取り除いたものにします(終端が”\r\n”であれば2文字取り除きます)。 chop! は文字列そのものを変更しその結果を返します

chomp([rs]):組み込み変数 $_ を rs で指定される末尾の文字列を取り除いたものにします。 rsのデフォルト値は$/(入力レコードセパレータを表す文字列)

chomp!([rs]):組み込み変数 $_ を rs で指定される末尾の文字列を取り除いたものにします。chomp! は文字列そのものを変更しその結果を返します。

eval(expr[, binding[, fname[, lineno=1]]]):文字列 expr を Ruby プログラムとして評価してその結果を返します。第2引数に Proc オブジェクトまたは Binding オブジェクトを与えた場合、そのオブジェクトを生成したコンテキストで文字列を評価します。

exec(command):command で指定されたコマンドを実行します。プロセスの実行コードはそのコマンド(あるいは shell。後述)になるので、起動に成功した場合、この関数からは戻りません。起動に失敗し、ruby インタプリタに制御が戻った場合は、例外 Errno::EXXX が発生します。この形式では command が shell のメタ文字 (* ? {} [] <> () ~ & | \ $ ; ‘ ` ” \n)を含む場合、 shell 経由で実行されます。そうでなければインタプリタから直接実行されます。

exec(program[, arg1[, arg2[, …]]]) 常に shell を経由せずに実行されます。この場合には空白や shell のメタキャラクタもそのまま program の引数に渡されます。先頭の引数が2要素の配列であった場合、第1要素の文字列が実際に起動するプログラムのパスであり、第2要素が「みせかけ」のプログラム名になります。

exit([status]):Rubyプログラムの実行を終了します。status として整数が与えられた場合、その値を Ruby コマンドの終了ステータスとします。デフォルトの終了ステータスは 0 です。

exit!([status]):整数 status を終了ステータスとして、Ruby プログラムの実行を終了します。デフォルトの終了ステータスは -1 です。

fork fork(2):システムコールを使ってプロセスの複製を作ります。親プロセスでは子プロセスのプロセスIDを、子プロセスでは nil を返します。

fork { … }:fork(2) システムコールを使ってプロセスの複製を作ります。生成した子プロセスでブロックを評価します。

gets([rs]):Ruby インタプリタ実行時に引数として与えられたファイル(なければ標準入力)をつなげた仮想的なファイル(組み込み変数 $< や ARGF でアクセスできる) から一行読み込んで、文字列を返します。ファイルの終りに到達した時には nil を返します。

readline([rs]):gets と同じ働きをしますが、ファイルの最後まで読むと例外 EOFError を発生させます。

global_variables:プログラム中で定義されているグローバル変数(`$’で始まる変数)名の配列を返します。

gsub(pattern[, replace]):組み込み変数 $_ の指す文字列内で pattern にマッチする部分を全て replace に置き換えた文字列を返します。

gsub!(pattern[, replace]):$_ の指している文字列そのものを書き換えます。

gsub(pattern) {|matched| … }:引数 replace が省略された時にはイテレータとして動作し、ブロックを評価した結果で置換を行います。ブロックには引数としてマッチした文字列が渡されます。

gsub!(pattern) {|matched| … }:$_ の指している文字列そのものを書き換えます。

block_given?:メソッドにブロックが与えられている時には真、そうでない時に偽を返します。

load(file[, priv]):Ruby プログラム file をロードして実行します。 file が絶対パスのときは file からロードします。 file が相対パスのときは組み込み変数 $: に示されるパスを順番に探し、最初に見付かったファイルをロードします。このとき、$: の要素文字列の先頭文字が `~’ (チルダ) だと、環境変数 HOME の値に展開されます。

local_variables:現在のスコープで定義されているローカル変数名の配列を返します。

loop { … }:(中断されない限り)永遠にブロックの評価を繰り返します。

open(file[, mode[, perm]]):file をオープンして、File オブジェクトを返します。

p(obj, [obj2, …]):obj を人間に読みやすい形で出力します。

print([arg1[, arg2, …]]):引数を順に出力します。引数が与えられない時には変数 $_ の値を出力します。

printf([port, ]format[, arg[, …]]):C 言語の printf と同じように、format に従い引数を文字列に変換して $> に出力します。

proc { … }:与えられたブロックから手続きオブジェクト (Proc のインスタンス) を生成して返します

lambda { … }:proc { … }と同じ

proc:ブロックが指定されなければ、呼び出し元のメソッドで指定されたブロックを手続きオブジェクトとして返します。

lambda:procと同じ

putc(ch):文字 ch を $> に出力します。 ch が数字なら 0 ~ 255 の範囲の対応する文字を出力します。ch が文字列なら、その先頭の文字を出力します。

puts([obj[, obj2[, ….]]] ):obj と改行を順番に $> に出力します。引数がなければ改行のみを出力します。

raise:同スレッドの同じブロック内で最後に rescue された例外オブジェクト ($!) を再発生させます。そのような例外が存在しないときは例外 RuntimeError を発生させます。

raise(exception):引数に指定された例外クラスまたは例外オブジェクトを発生させます。

raise(message):引数の文字列をメッセージとする RuntimeError 例外を発生させます。

raise(error_type, message [, backtrace]):第一引数で指定された例外を、第二引数に与えたメッセージとともに発生させます。第三引数は例外発生時のスタックトレースで、caller の戻り値と同じ形式でなければいけません。

fail(error_type, message [, backtrace]):raise(error_type, message [, backtrace])と同様です。

rand([max=0]):0 以上 max 未満の範囲の整数の乱数を発生します。まだsrand が呼ばれていなければ自動的に srand を呼び出します。max に nil または 0 を指定すると 0 以上 1 未満の実数値 Float で乱数を与えます。

readlines([rs]):コマンドライン引数として与えられたファイル(なければ標準入力) をつなげた仮想的なファイル(ARGFを全て読み込んで、その各行を要素としてもつ配列を返します。行の区切りは引数 rs で指定した文字列になります。rs のデフォルト値は組み込み変数 $/ の値です。

require(feature):Ruby ライブラリ feature をロードパス $: 上から探し、同じライブラリがまだロードされていなかった時だけロードします。

set_trace_func(trace_proc):Ruby インタプリタがプログラムを実行する過程で、メソッドの呼び出しや式の評価などのイベントが発生する度に手続きオブジェクト trace_proc を実行します。標準添付のデバッガ、トレーサ、 プロファイラはこの組み込み関数を利用して実現されています。

sleep([sec]):sec 秒だけプログラムの実行を停止します。sec には浮動小数点数も指定できます。sec が省略された場合、他スレッドからの Thread#run などで明示的に起こさない限り永久にスリープします。戻り値は実際に停止していた秒数(整数)です。

split([sep[, limit]]):_ の示す文字列をパターン sep によって limit 個の文字列に分割し、その配列を返します。

sprintf(format … ):format 文字列を C 言語の sprintf と同じように解釈し、引数をフォーマットした文字列を返します。 format 指定子は C 言語の sprintf が受け付けるものとほとんど同じです。

format(format … ):sprintf(format … )と同様です。

srand([seed]):rand の乱数の種を設定し、古い初期値を返します (ただし最初だけは0を返します)。初期値が省略された時には現在の時刻やプロセスID、srand を呼び出した回数、また可能なら /dev/urandom から読み出したデータなどを元に種を作ります。

sub(pattern[, replace]):組み込み変数 $_ の指す文字列内で pattern にマッチする最初の部分を replace に置き換えた文字列を返します。

sub!(pattern[, replace]:$_ の指している文字列そのものを書き換えます。

sub(pattern) {|matched| … }:イテレータとして動作し、ブロックを評価した結果で置換を行います。ブロックには引数としてマッチした文字列が渡されます。

sub!(pattern) {|matched| … }:$_ の指している文字列そのものを書き換えます。

system(command):commandを実行して、成功した時(子プロセスが終了ステータス 0 で終了した時)には真を、失敗した時(コマンドが実行できなかった場合も含む)には偽を返します。終了ステータスは変数 $? で参照できます。

system(program[, arg1[, arg2[, …]]]):外部プログラムを実行します。

test(cmd, file1 [, file2]):ファイルテストを行います。

throw(tag[, value=nil]):同じtagを指定した catch のブロックの終わりまで(メソッドを越えて)脱出します。もし同じ tag で待っている catch が存在しない場合は NameError でスレッドが終了します。tag は文字列またはシンボルです。 value は catch の戻り値になります。

trace_var(varname, hook):グローバル変数 varname への代入のフックを登録します。 varname は文字列か Symbol で指定します。

untrace_var(varname[, hook]):グローバル変数 varname に関連付けられたフックを解除します。hook が指定された場合にはそのフックだけを解除します。hook が省略されるかまたは nil を与えた場合は varname のフックを全て解除します。解除されたフックの配列を返します。

warn(mesg):mesg と改行を順番に $stderr に出力します。組み込み変数 $VERBOSE が nil のときは何も出力しません。

 

膨大な量の組み込み関数ですよね。

 

もしかしたら「あれ!?この文字列ってなんかエラーで見た気がする」と思われた方もいるかもしれません。

 

Rubyがエラーとして処理してくれるのは組み込み関数で例外的な処理が行われたからなんですね。

 

ユーザー定義関数

ではユーザー定義関数とは何でしょう。

 

ユーザー定義関数とは利用者が自分で値を定義することができる関数のことです。

 

何回も同じ処理をする場合はユーザー定義関数を自分で作成して処理を行います。

 

Rubyでのメソッドの使い方

 

では早速Rubyでのメソッドの使い方を見ていきましょう。

 

Rubyでのメソッドの使い方は先ほど紹介した

・基本のメソッドの場合

・引数のあるメソッドの場合

・引数にデフォルト値を設定する場合

・メソッドに返り値を返す場合

 

の4種類になります。

では早速メソッドの使い方を見ていきましょう。

 

基本のメソッド

まず基本のメソッドは先ほど紹介した通り始まりにdefを終わりにendを書いてその間に条件式を書きます。

 

def sample

    print(“今日もいい天気ですね”)

end

 

そして実行するときは

 

sample

 

と実行すれば条件式で作ったものが実行されます。

 

この場合だと

 

今日はいい天気ですね

 

と表示されます。

 

とても便利ですよね。

 

引数のあるメソッド

次に引数のあるメソッドです。

 

defと始まりに書きカッコで囲ってその中に引数を定義します。

 

そして終わりにendで結びます。

 

def sample(apple, orange, banana)

    print(“私が食べたいのは” #{apple}です”)

    print(#{orange}”は嫌いです”)

  print(#{banana}”は好きです”)

end

 

そして実行する際は代入するための引数をカッコに入れて実行させます。

 

sample(“りんご”, “みかん”, “バナナ”)

 

とすると

 

私が食べたいのはりんごです

みかんは嫌いです

バナナは好きです

 

と表示されます。

 

引数にデフォルト値を設定する

またその応用として引数を指定せずに引数にデフォルトを設定することもできます。

 

def sample(banana=”全て”)

    print(“#{banana}は好きです”)

end

 

sample(“バナナ”)

sample()

とすると

 

バナナは好きです

全ては好きです

 

となります。

 

段々と複雑になってきましたね。

 

ではどんどんと言ってみましょー!

 

メソッドに返り値を返す

3つ目はメソッドに返り値を返す場合です。

 

返り値って何でしょう?

 

・返り値とは

返り値はメソッドが実行されたときに返ってくる値です。

 

返り値にしたい値や式の前に「return(リターン)」をつけます。

 

返り値もわかったことですし、早速返り値を設けたメソッドの定義の方法を見ていきましょう。

 

def sample(a, b)

   return a + b

end

 

answer = sample(4, 5)

p sample

 

とすると実行結果は

9

となります。

 

段々とRubyのメソッドの使い方がわかってきましたね。

 

ただし、Rubyのメソッドを使うときはルールがあり、このルールを無視してしまうとエラーが出てしまうので注意しましょう。

 

ではRubyのルールとはどのようなものなのでしょうか?

 

Rubyでメソッドを使うときのルール

Rubyでメソッドを使うときのルール

・メソッドの定義は実行する前に書く

・命名規則を意識する

 

メソッドの定義は実行する前に書く

メソッドを定義するときのルールは実行する前に定義する必要があります。

 

実行文の後にメソッドを定義するとメソッドが見つからないエラー(undefined local cariable or method for main:Object)というのがでます。

 

なのでメソッドを定義するときは必ず実行する前にメソッドの定義をするようにしましょう。

 

命名規則を意識する

命名規則とはプログラミングで変数や型、関数などに名前を付ける際のルールになります。

 

この命名規則を意識して書くと

・ソースコードを読解する労力が減る

・コードレビューの際に無駄な時間を使わなくて済む

というのがあります。

 

では命名規則とはどういったものなのか具体例を最後に簡単に見ていきましょう。

 

・シンボル、メソッド、変数にはsnake_caseを用いる

snake_caseとは英小文字の単語を_(アンダースコア)で区切り連結する方法です。

 

良い例

input_num = 3

 

悪い例

inputnum = 3

 

となります。

 

上記の2つを比較しても前者の方がわかりやすいですし、意味も分かりますよね。

 

このように_を使ってわかりやすいコードを書くように心がけましょう。

 

・シンボル、メソッド、変数では文字と数字を分離しない

 

先ほどは_を付けましたが文字と数字の間は_を入れないようにしましょう。

 

良い例

num1 = 1

 

num_1 = 1

 

・クラスやモジュールはCamelCaseを用いる

CamelCase都は単語の先頭を大文字にして単語をの区切りを示す方法です。

 

良い例

class MyStudent

end

 

悪い例

class my_student

end

 

今回紹介したのはほんの一例ですがこのように命名規則があるのは覚えておきましょう。

 

まとめ

今回のまとめ

・メソッドや引数を活用することによってコードを短くかける

・メソッドは組み込み関数とユーザー定義関数がある

・メソッドを定義するときはルールがあるので注意する

 

いかがでしたでしょうか?

 

今回はRubyのメソッドに関してのルールや特徴、メリットについてお伝えし、簡単な使い方も紹介しました。

 

メソッドを柔軟に考えることができるとより効率的に短くてきれいなコードを書くことができます。

 

こういった基本的な知識は何回も復習して早めにマスターしておきましょう。

NO IMAGE
最新情報をチェックしよう!
>ハッキングログ~人生をハッキングする~

ハッキングログ~人生をハッキングする~

機械学習やプログラミング、副業の情報発信メディアです。 人生を豊かにするための情報を発信していきます。

CTR IMG