ruby/変数のスコープと引数

タイトルに言語名入れたほうがいいよねって今更気づいたんだ。

といってもしばらくはHTML,CSS,ruby,ruby on railsくらいしか書くことはないだろうけど。

自分用の備忘録としても読みやすさは必要だよなと今更思い立った。

 

前置きはこの辺で、今回は変数のスコープについて。

 

変数のスコープとは

変数には、その変数が使える範囲と言うものが決まっている。

この範囲のことをスコープと言う。

rubyでは自分で作ったメソッドを定義できるけれど、メソッド内で定義した変数は別のメソッドで使えないよ。と、言うこと。

 

と、言うこと。

なんていってもこんな長ったらしかったらイメージつかないよね。

実例を出しながら説明しようと思う。

こんなコードを書いてみた。

def animal    
  x = "cat"
end

def output
  puts x
end

animal #animalメソッドで変数xに"cat"を代入
output #変数xの値を出力

ちなみにこのコード、実行してもエラーとなる。

なぜかと言うと、先ほどのスコープが関わってくる。

animalメソッドで変数xにcatを代入しているが、この変数xのスコープはanimalメソッド内に限られてしまうと言うこと。

変数xはoutputメソッドでは読み取ることができないため、エラーが出てしまう。

 

ここで湧いてくる疑問が、defを使うのはコードの可読性を上げるためじゃないのか!

defで得ることができた値を使い回せないなんてなんの意味もないじゃないか!ということになる。

 

そこで登場するのが引数という概念。

 

引数とは

引数とは、メソッドに対して外部から値を渡すための仕組みのこと。

(引数という概念は恐らく全てのプログラミング言語に登場すると思うんだけど、今回はrubyに絞って説明します。)

 

のこと、なんて言われてもやっぱりこれも意味不明なので実例を使って説明しよう。

さっきのコードを、引数を用いて動作するように変えてみました。

 
#animalメソッドで変数xに"cat"を代入
def animal
x = "cat"
end

#変数xの値を出力する。この時xを引数とする。
def output(x)
puts x
end

#outputメソッドの実行。この時引数にはanimalメソッドで得られた値を代入する。
output(animal)

さっきとの違いは、output(x)としてメソッド定義を行なっていることと、output(animal)でメソッドの実行を行なっているところ。

output(x)とすることで、定義内ので使っている変数xを引数として扱うことができるようになります。

引数として扱う=他メソッドの変数xの値を受け取ることができるということ。

 

引数を設定したメソッドを定義するときは、メソッド名(引数)とする必要があります。

今回の場合だったら、animlメソッドを実行した時に帰ってくる値を入れたいので、(animal)となります。

ちなみに実行結果は下記の通り。catと表示されます。

usrname:blog user$ ruby scope.rb
cat

 

スコープの基礎、それと引数の基礎はこんなところでしょうか。

この引数、少し前に書いたハッシュや配列を代入することもできるのでかなり曲者だったりします・・・。

今回はこんなところで。