RubyとPHPの比較(メソッド、引数、戻り値)


この記事の概要

Rubyで学習を始めてPHPに言語チェンジをする人が一定数いるみたいなので
そういった人達が参考にするための記事です。

これらの記事の続きです。

https://qiita.com/Hashimoto-Noriaki/items/82beae9d3d6dac11e11c
https://qiita.com/Hashimoto-Noriaki/items/449c00327e99574e430a

メソッド

メソッド(関数)とは何の処理をしているかをわかりやすくまとめた、かたまりのことです。
RubyならdefPHPならfunctionで定義します。
それぞれコードを見ていきます。

⚫︎Ruby

def language(lang)
  puts "#{lang}を勉強したい"
  puts "#{lang}が話せます。"
end

#メソッドの呼び出し
 language("英語")
 language("中国語")
 
#英語を勉強したい
#英語が話せます。
#中国語を勉強したい
#中国語が話せます。

def languageのlanguageがメソッド名です。
メソッド名の後の(lang)が引数です。
defからendの間がメソッドです。

⚫︎PHP

function language($lang) {
    echo "{$lang}を勉強したい";
    echo "{$lang}が話せます。";
}

//メソッドの呼び出し
language("英語"); //引数=英語
language("中国語");

//英語を勉強したい
//英語が話せます。 
//中国語を勉強したい
//中国語が話せます。 が出力

function languageのlanguageがメソッド名です。
メソッド名の後の($lang)が引数です。
functionから}までがメソッドです。

メソッドの注意

メソッドは呼び出されるまで処理が実行されないです。
メソッド名は自由に決められます

メソッドの引数の書き方

メソッドの引数の書き方についてそれぞれ見ていきます。

引数がない場合

⚫︎Ruby

def program
    puts  "Rubyは楽しい"
end

#メソッド呼び出し
program

#Rubyは楽しい

この場合はprogram()と書くこともあればない時もあるみたいです。

⚫︎PHP

function program(){
    echo "PHPは楽しい";
}

//メソッド呼び出し
program();

//PHPは楽しい  

引数がない場合はこのように書きます。
Rubyとは違って()を書いたりします。

複数の引数がある場合

⚫︎Ruby

def program
    puts  "Rubyは楽しい"
end

def sayScore(me,score)
    puts "#{me}のテストは#{score}点です。"
end
#メソッド呼び出し
program
sayScore("私",90)

#Rubyは楽しい
#私のテストは90点です。

⚫︎PHP

function program(){
    echo "PHPは楽しい";
}

function sayScore($me,$score){
    echo "{$me}のテストは{$score}点でした。";
}

//メソッド呼び出し
program();
sayScore("私",90);

//PHPは楽しい
//私のテストは90点でした。

引数のデフォルト値

引数に値を代入するのが引数のデフォルト値です。

⚫︎Ruby

def say_score(me="私",score=90)
    puts "#{me}のテストは#{score}点です。"
end

#メソッド呼び出し
say_score  #私のテストは90点です。
say_score(nil,70)  #のテストは70点です。
say_score("あなた",80) #あなたのテストは80点です。

⚫︎PHP

function sayScore($me = "私",$score = 90){
    echo "{$me}のテストは{$score}点でした。";
}

//メソッド呼び出し
sayScore(); //私のテストは90点でした。
sayScore(null,90);  //のテストは90点でした。
sayScore("あなた",80); //あなたのテストは80点でした。

Rubyの色々な引数

Rubyでは引数にも色々な引数があります。

⚫︎キーワード引数
引数に名前がつきます。

def say_score(score: 90)
    puts score
end

say_score(score:80)  #80と出力
say_score  #90と出力

実際は使用する機会があまりないみたいです。

⚫︎オプション引数
1つの引数で複数の値をハッシュ(連想配列)で受け取ります。

def score(**i)
    p i  #{:teamA=>30, :teamB=>20}
end

score(teamA: 30, teamB: 20)
#{:teamA=>30, :teamB=>20}と出力

⚫︎可変長引数
1つの引数で複数の値を配列で受け取ります。

def count(*i)
    p i #[1,2,3]のように配列で受け取る
end

count(1,2,3)

#[1, 2, 3]  と出力

引数の後にをつけると可変長引数*になります。

戻り値

return文というものを使います。これはその場でメソッドが強勢終了させ、
メソッドの呼び出し側へ値を返すことができます。

⚫︎Ruby

def toeic(score)
    if score >= 800
        return "外資系で働ける"
    else
        return  #戻り値=nil
    end
end

#呼び出し元
result = toeic(800)
puts result

外資系で働ける戻り値です。

⚫︎PHP

function toeic($score){
      if ($score >= 800){
          return "外資系で働ける";
      } else {
          return; //returnの戻り値に何も指定しなければNullとなります。
      }
}

$score = toeic(800);
echo $score; //外資系で働ける

外資系で働ける戻り値です。

Rubyで特に記述しなくても、自動的に処理が行われる戻り値

Rubyでは特に記述しなくても、自動的に処理が行われる(暗黙的な)戻り値が存在します。
それについてみていきます。

⚫︎Ruby

def modorichi(i)
    i = i + 1
    return i
end

puts modorichi(1)
#2
def modorichi(i)
    i = i + 1
    return i
    i  #戻り値なし
end

puts modorichi(1)
#2

戻り値がなくてもRubyなら出力できますが、PHPだと出力されないです。
理由はRubyには特に記述しなくても、自動的に処理が行われる(暗黙的な)戻り値があるからです。

def modorichi(i)
    i + 1
end

puts modorichi(1)
#2

さらに省略したものです。
上で紹介している3つのコードは同じ処理のコードです。

戻り値を説明しているコードを元に上記のルールに従って書き換えてみます。
まずは上記のルールを使わない場合です。

⚫︎Ruby

def toeic(score)
    if score >= 800
        return "外資系で働ける"
    else
        return  #戻り値=nil
    end
end

#呼び出し元
result = toeic(800)
puts result

#外資系で働ける

上記のルールに書き換えるとこうなります。

def toeic(score)
    if score >= 800
        "外資系で働ける"
    end
end

#呼び出し元
result = toeic(800)
puts result

#外資系で働ける

だいぶスッキリした書き方になりましたね。
もっとスッキリさせるとこうなります。

def toeic(score)
   "外資系で働ける" if score >= 800
end

#呼び出し元
result = toeic(800)
puts result

#外資系で働ける

このようにRubyを1行で書くことができます

参考資料

この動画をベースに記事を書きました。