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

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

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

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

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

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

#メソッドの呼び出し
 language("英語")
 language("中国語")
 
#英語を勉強したい
#英語が話せます。
#中国語を勉強したい
#中国語が話せます。
```
def languageの***languageがメソッド名***です。
***メソッド名の後の(lang)が引数***です。
***defからendの間がメソッド***です。


⚫︎```PHP```

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

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

//英語を勉強したい
//英語が話せます。 
//中国語を勉強したい
//中国語が話せます。 が出力
```
function languageの***languageがメソッド名***です。
***メソッド名の後の($lang)が引数***です。
***functionから}までがメソッド***です。

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

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

### 引数がない場合

⚫︎```Ruby```
```rb
def program
    puts  "Rubyは楽しい"
end

#メソッド呼び出し
program

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

⚫︎```PHP```
```php
function program(){
    echo "PHPは楽しい";
}

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

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


### 複数の引数がある場合

⚫︎```Ruby```

```rb
def program
    puts  "Rubyは楽しい"
end

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

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


⚫︎```PHP```
```php
function program(){
    echo "PHPは楽しい";
}

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

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

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

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

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

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

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

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


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

⚫︎```キーワード引数```
***引数に名前がつきます。***
```rb
def say_score(score: 90)
    puts score
end

say_score(score:80)  #80と出力
say_score  #90と出力
```
実際は***使用する機会があまりないみたい***です。

⚫︎```オプション引数```
1つの引数で複数の値をハッシュ（連想配列）で受け取ります。
```rb
def score(**i)
    p i  #{:teamA=>30, :teamB=>20}
end

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

⚫︎```可変長引数```
1つの引数で複数の値を配列で受け取ります。
```rb
def count(*i)
    p i #[1,2,3]のように配列で受け取る
end

count(1,2,3)

#[1, 2, 3]  と出力
```
***引数の後に*をつけると可変長引数***になります。



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

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

#呼び出し元
result = toeic(800)
puts result
```
***外資系で働ける***が```戻り値```です。

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

$score = toeic(800);
echo $score; //外資系で働ける
```
***外資系で働ける***が```戻り値```です。

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

⚫︎```Ruby```

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

puts modorichi(1)
#2
```

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

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

```rb
def modorichi(i)
    i + 1
end

puts modorichi(1)
#2
```
さらに省略したものです。
***上で紹介している3つのコードは同じ処理のコード***です。

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


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

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

#外資系で働ける
```

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

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

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

#外資系で働ける
```
だいぶスッキリした書き方になりましたね。
もっとスッキリさせるとこうなります。

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

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

#外資系で働ける
```
このように***Rubyを1行で書くことができます***。



# 参考資料
この動画をベースに記事を書きました。

https://www.youtube.com/watch?v=8NI57SrDiVw&list=PL-1KBX2gDRuiDf7R-YR4NjFf_nYu3RG3y&index=16

https://www.youtube.com/watch?v=J_pASVQXElA