どなブロ

エンジニアァのブログです

たのしいRuby 第8章 (1)

前回から間が空いてしまった

モジュール

クラス

クラスとインスタンス

  • rubyのオブジェクトは例外なく何らかのクラスに属す
  • newメソッドで新しいオブジェクトの生成
  • オブジェクトがどのクラスに属しているか知るにはclassメソッドを使う
ary.class => Array
  • あるオブジェクトがあるクラスのインスタンスかどうかを知るにはinstance_of?メソッド
ary.instance_of?(Array) => true

継承

  • 継承によって新しく作られたクラスをサブクラス
  • 継承の元となったクラスがスーパークラス
  • 全てのクラスはObjectクラス(BasicObjectクラス)のサブクラス
  • 継承関係を調べるにはis_a?メソッド
str.is_a?(Object) => true

クラスを作る

Ex)

class HelloWorld # class文
  def initialize(myname = "Ruby") # initializeメソッド
    @name = myname # インスタンス変数の初期化
  end

  def hello # インスタンスメソッド
    puts "Hello, world. I'm #{@name}"
  end
end

bob = HelloWorld.new("Bob")
alice = HelloWorld.new("Alice")
ruby = HelloWorld.new

bob.hello

class文

class クラス名  # クラス名は必ず大文字始まり
  クラスの定義
end

initializeメソッド

  • newメソッドによってオブジェクトを生成すると、initializeメソッドが呼ばれる

インスタンス変数とインスタンスメソッド

アクセスメソッド

  • オブジェクトの外部からインスタンス変数を直接参照・代入などできない →アクセスするためのメソッドを作る必要がある
class ~~~
~
  def name  # @nameを参照
    @name   # 単純にnameの値を返す
  end
  def name=(val) # @nameを変更
    @name = val  # @nameに代入
  end
~
end
  • アクセスメソッドをいくつも定義するのが面倒なので以下
定義 意味
attr_reader :name 参照のみ可能にする
attr_writer :name 変更のみ可能にする
attr_accessor :name 参照と変更の両方を可能にする

特別な変数self

  • インスタンスメソッドの中で、メソッドのレシーバ自身を参照するために使用
class ~~~
  attr_accessor :name
  def greet
    puts "hi, i'm #{self.name}"
  end
end

クラスメソッド

  • クラスそのものをレシーバとする
class << クラス名 ~ end
def クラス名.メソッド名 ~ end

定数

class Hello
  Version = "1.0"
~
end
  • ::を使えば外部からも参照可
Hello::Version => "1.0"

クラス変数

  • @@で始まる変数がクラス変数
  • 何度でも値を変更できる
  • 外部からの参照にはアクセスメソッドが必要 →attr_accessorなどは使えないので直接定義する必要

メソッドの呼び出しを定義する

  • public…メソッドをインスタンスメソッドとして使えるよう公開する
  • private…メソッドをレシーバを指定して呼び出せないようにする
  • protected…メソッドを同一のクラスであれば、インスタンスメソッドとして使えるようにする
class AccTest
  def pub
    puts "pub is a public method."
  end

  public :pub # pubメソッドをpublicに指定

  def priv
    puts "priv is a private method."
  end

  private :priv # privメソッドをprivateに指定
end

acc = AccTest.new
acc.pub
acc.priv

-> 結果
$ ruby acc_test.rb

pub is a public method.
Traceback (most recent call last):
acc_test.rb:17:in `<main>': private method `priv' called for #<AccTest:0x00007fa4688a0368> (NoMethodError)

※ privateメソッドを呼ぼうとした時に例外が発生

  • publicやprivateに引数を指定しなければ、それ以降に定義したメソッドはそれに倣う

感想

  • getter,setterだねって思ってたら、「getter,setterとも言います」って書いてあった
  • アクセスメソッドとクラスメソッドが完全には理解できなかった
  • というか後半の理解が浅いので復習する
  • オブジェクト指向!!
  • そろそろなんか作りたい (単調で飽きてきた)

以上