メソッド内の変数のスコープについて


変数名、メソッド名をつけるセンスがなく見づらいかと思いますが自分なりに理解しながらまとめました

変数とは

変数というのは文字や数値を入れる箱で、同じ値を繰り返し使えたり、変更に対応しやすいので楽にコードを書くことができる。

書き方

変数名=値 と定義する。

fruits = "ringo"   #文字列にはダブルクオーテーションマーク
count = 3

種類

変数には種類があり、名前の付け方が決まっている。

ローカル変数... 小文字もしくはアンダーバー _ で始まる

グローバル変数... $ で始まる

インスタンス変数...@ で始まる

クラス変数...@@ で始まる

擬似変数...特定の名前がもともと付けられていて、値は変更できない

定数...大文字で始まる(定数はメソッド内で定義できないため省略)

スコープとは

それぞれの変数が使用できる範囲のこと。
スコープを理解していないとバグの原因や予想外の動作をしてしまう可能性がある。

それぞれの変数のスコープについて

ローカル変数

変数が宣言されたブロック、メソッド定義、クラス定義の終わりまでしか使えない。定義された場所でしか参照できない極めて局所的な変数。(グローバル変数と対極)

sample.rb
def profile

  greeting = "こんにちは"

  puts  "#{greeting} , りかです"
end

profile

実行結果↓

こんにちは、りかです

グローバル変数

プログラムのどこからでも参照でき、同じ名前であれば必ず同じ変数として扱われる。(ローカル変数と対極)
※プログラム全体のどこからでも値を変更できるため、大きなプログラムではグローバル変数を利用することによってプログラムが必要以上に複雑になったりプログラムの流れを追ったり修正を加えたりするのが大変になるため一般的に好まれない。

sample.rb

$greeting = "こんにちは"

 def profile
  puts  "#{$greeting},りかです"
 end

profile

実行結果↓

こんにちは、りかです

インスタンス変数

インスタンス...クラス(設計図)を基に作成した実体。
インスタンス変数...データ(変数)と振る舞い(メソッド)をもつ。(ex.車だったら車種や色、速さをメソッドに書く)

同じインスタンス内であればメソッドの定義を越えてその値を参照したり変更したりできる。

sample.rb

class Introduce

 def initialize(greeting)
  @greeting = greeting
 end

  def profile
    puts "#{@greeting},りかです"
  end

end


aisatsu= Introduce.new("こんにちは")
aisatsu.profile
kibun= Introduce.new("お元気ですか")
kibun.profile

実行結果↓

こんにちは、りかです
お元気ですか、りかです

クラス変数

クラス...インスタンス(実体)を作るための設計図のようのもの。
クラス変数...そのクラスのすべてのインスタンスから参照したり値を変更したりできる。

sample.rb

class Introduce
  @@greeting = "こんにちは"

 def profile
  puts  "#{@@greeting},りかです" 
 end
end


int = Introduce.new
int.profile


実行結果↓

こんにちは,りかです

擬似変数

self...処理内容の実行主体
nil...NilClass クラスのインスタンスであり、「何もない状態」を表します
true...TrueClass クラスのインスタンスであり、「真」を意味します
false...FalseClass クラスのインスタンスであり、「偽」を意味します
_FILE_...現在のソースファイル名を表します
_LINE_...現在実行中のソースファイル中の行番号を表します
_ENCODING_...現在実行中のソースファイルの文字コードを表します