Ruby超入門 2周目 CHAPTER7- 4 変数には見える範囲がある まで

f:id:kkouji0224:20191027224451p:plain

 

『ゼロからわかる Ruby 超入門 (かんたんIT基礎講座) 』
github.com

 

最近はボーッとしてしまう時間が増え気味で、こんな時間からはてな書いてるkoujiです。こんばんは。眠くないような眠いようなそんな感じ。

 

ってことで今日はCHAPTER7の残りの振り返りをしていきまっす!

 

引数のデフォルト値 

def alc_order(item = "生中")
    "#{item}を一杯"
end
puts alc_order  #=> 生中を一杯
puts alc_order("ハイボール")  #=> ハイボールを一杯
puts alc_order("芋焼酎")  #=> 芋焼酎を一杯

 

メソッドの引数にはデフォルト値を指定することが出来ちゃう。上のプログラムの場合はalc_orderの引数itemに"生中"を指定してるよ。(引数 = デフォルト値)って感じで指定してあげる。そうするとどうなるかっていうと、メソッド呼び出し時に引数を書かないとデフォルト値に指定してる"生中"が変数itemに代入されるんだね!で、引数を指定してあげるとデフォルト値は使われないよ。やっぱり最初はビールからだよね…

 

キーワード引数

def alc_order(item:size:)
    "#{item}#{size}で!"
end
puts alc_order(item: "生"size: "中")  #=> 生の中で!
puts alc_order(size: "メガ"item: "ハイボール")  #=> ハイボールのメガで!
puts alc_order(size: "メガ"item: "ウーロンハイ")  #=> ウーロンハイのメガで!

 

見ての通り引数がitemとsizeの2つになったね。この場合だとメソッド呼び出し時も2つ書いてあげる必要があるんだけど、順番通りに書いてあげないとおかしなことになっちゃうよね。逆に書くとそのまんま逆になっちゃう。でもキーワード引数で書いてあげると順番は関係ないんだよね。itemは生でsizeは中みたいな感じ。書く量がふえちゃうけど便利かも。選択肢の1つとして覚えておこう…

 

ちなみにキーワード引数もデフォルト値の設定ができるよ。

def alc_order(item: "生"size:)
    "#{item}#{size}で!"
end
puts alc_order(size: "中")  #=> 生の中で!

 

こんな感じ。メソッド名(引数: デフォルト値, 引数)みたいな感じで書いてあげればオーケーだねー。もちろんデフォルト値は全ての引数に指定ができるよーん

 

ローカル変数とスコープ

def fuck
    text = "ファック!"
    puts text
end
fuck #=> ファック!

 

上のプログラムは普通に動くねー。

 

じゃーこれはどうでしょうか。

def fuck
    text = "ファック!"
end
fuck
puts text

 

5:in `<main>': undefined local variable or method `text' for main:Object (NameError)

 

エラーになっちゃうよ!!!

 

なんでかっていうと、メソッドの中で定義した変数は、メソッドの外からは見えないようになってるんだよ。んでもってメソッドの実行が終わると、メソッドの内の変数と例えば上のプログラムだと文字列のファック!は破棄されちゃうらしい。

 

で、変数には見える範囲と寿命がある。で、このことを「スコープ」という。ここまで出てきた変数はスコープの範囲がもっとも狭いローカル変数ってやつねっ!

 

ちなみに逆はどうなんだろうって思うじゃん。メソッドの外で定義した変数は、メソッドの中から見えるのかな?って。やっぱり見えないんだねぇ。なので、メソッドの中で必要なオブジェクトは引数を使って渡すんだね!

 

 

ってことでCHAPTER7はこれで終わり!スコープとかローカル変数とか新たに出てきた感じだけど、スコープが面白いなぁって感じ。メソッド内で定義したものは外から見えないし、メソッドの外で定義したものは、中から見えない。こういうのも「へぇ〜」って感じで面白い。この面白さを表現する言葉がでてこないんだけど、面白いんだよ!!

 

ってことで今日はこの辺で〜!

 

もう夜中の1時じゃないか…