Ruby のゲッターを自分なりに説明する

rubyのゲッターとは何かを取得するみたいななんとなくの想像はできるが果たしてそうなのか。。文章でつづりながら理解してみよう。

  1. class Car
  2.  attr_reader :name, :color  #nameとcolorのゲッターを定義
  3.  def initialize(name, color)
  4.   @name = name
  5.   @color = color
  6.  end
  7.  def info 
  8.  puts "名前: #{@name} 色: #{@color}"
  9.  end
  10. end
  11. my_car = Car.new("プリウス", "赤")
  12. puts my_car.name #ゲッターの呼び出し 結果:プリウス
  13. puts my_car.color #ゲッターの呼び出し 結果:赤

上記のコードを行ごとに番号つけたかったので番号付きリスト機能を使ったら見事に文字とマッチしないでかい数字が現れたΣ(゚Д゚) ここらへんの工夫は今後考えるので cut me some slack(この英語使ってみたかった)ね。

この14,15行目の結果がそれぞれ13行目の引数から出力されたのはわかる。しかしその引数がどのような旅をして結果までに辿りついたか考察してみる必要がありそうだ。まず1〜6行目からみてみよう。

1行目は"Car"クラスを定義している。詳しいクラスの説明は省くが(自分でもちゃんと理解しているか不安ある)ここではクラス名が"Car"なのでただの車なんだなと思っていただいて、"Car"クラスの中に書くコードは車の性質(インスタンス)なんだなと思っていただければいいかと思います。

 

2行目はゲッターの定義をしている。後のゲッターを呼び出すためにここにゲッター装置を仕掛けておく・・

 

3行目はinitializeという特別なメソッドであり8行目のinfoメソッドの"info"の様に自分で勝手につけていいメソッド名ではない。13行目の".new"(newメソッド)と結びついていて,newメソッドを生成するときにinitializeメソッドが呼ばれる。initialize とnewって両方”新しい”感じがしますよね(雰囲気とイメージで結びつけています)。

 

 

4,5行目の@name,@colorのように"@"から始まるものはインスタンス変数と呼ばれていて、そのインスタンスの持つデータを表している。上記のコードを参考にして簡潔にあらわしてみよう。

class Car

 def initialize(name, color)
 @name = name

 @color = color

 end

end

car1 = Car.new("プリウス", "赤")

car2 = Car.new("ポルシェ", "白")

 newメソッドで与えられたデータがinitializeメソッドでインスタンス変数(@nameと@color)に代入され、それぞれのインスタンスの固有のデータになる。car1はプリウスで赤い、car2はポルシェで白い。ぼやぼやっとした車のイメージがnewメソッドのおかげでくっきりしてきましたね(*このコードだけではnewメソッドの引数が文字として結果がでてこないのでただのイメージ上での話)。

6行目のendでinitializeメソッドの定義が終わります。

 

次は8〜10行目をさくっとみてみよう。

8行目でinfoメソッドの定義をしまーすと宣言をしている。

9行目でinfoメソッドの中身を記しており、"名前: #{@name} 色: #{@color}"の@が頭にあるインスタンス変数をくっきり文字として表します。(puts"〜"は文字列をブラウザ上に反映させます。)

 10行目のendはinfoメソッドの定義を終了しまーすと宣言している。

 

11行目のendでCarクラスの定義つまりCarの性能はここまでと宣言している。

 

次に13行目をみてみよう。以下のコードで説明しよう。

class Car

 def hello

  puts "こんにちは"

 end

end

my_car = Car.new

my_car.hello  #結果: こんにちは

newメソッドについてはinitializeメソッドが記述されていないためここでは何も機能をもっていないが、クラス名につくものとここではスルーしましょう。my_car = Car.new でmy_carは"Car"クラスに関係するものだよと定義をしていてmy_car.helloでCarクラスの中で定義したhelloメソッドを呼び出しています。(*"my_car"の部分はインスタンスと呼び".hello"の部分はインスタンスメソッドと呼ばれる。 インスタンスメソッドの呼び出し方・・・$ インスタンス.インスタンスメソッド)helloメソッドを呼び出したので

こんにちはと結果が返ってきました。

 

最後に14と15行目を説明する前に1〜13行目の流れを追っていけばおのずと答えがみえてくるだろう。最初に13行目の"プリウス"と"赤"はそれぞれ3行目のnameとcolorに引き継がれました。そのnameとcolorはそれぞれ@nameと@colorに代入され、9行目で元々のデータをである"プリウス""赤"がブラウザに現れます。しかしここではinfoメソッドを呼び出していないので"名前:プリウス 色:赤"とは現れません。14行目と15行目でそれぞれnameとcolorをそれぞれどの引数のデータを表すか指定しています。しかもその定義は予め2行目で書かれています。2行目の装置を14行目と15行目でそれぞれ作動させている。指定してゲットするつまりゲッターである。

ここで重要なのは@インスタンス変数の値はクラス内でしかとれないという前提をあるが、クラス外で@インスタンス変数をゲットしたければattr_reader :name :colorのようにクラス内で記述してからクラス外で.name .colorというメソッドを記述すれば呼び出すことができるのだ。

 

最後の方乱暴になってしまい大変申し訳ありません。(最初から?)