ようへいの日々精進XP

よかろうもん

2018 年 02 月 06 日(火)

ジョギング

  • 引き続き、休み
  • 腰の調子はだいぶん良くなってきた

日課

  • 合わせて休み

一面の銀世界

  • 朝目覚めたら、本当に一面の銀世界だった

今日のるびぃ ~ メソッドの公開レベルについて ~

引き続き, プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで の読書メモ.

public メソッド

  • クラス外部からでも自由に呼び出せるメソッド
  • initialize メソッド以外のインスタンスメソッドはデフォルトで public になる
class Foo
  # デフォルトは public メソッド
  def foo
    'foo'
  end
end

f = Foo.new
f.foo #=> "foo"

private メソッド

  • レシーバを指定出来ない
  • クラス外部から呼び出すことが出来ない (レシーバを指定出来ないので)
  • サブクラスから呼び出すことが出来る
class Foo
  private
  def foo
    'foo'
  end
end

f = Foo.new
f.foo #=> NoMethodError: private method `foo' called for #<Foo:0x0055bd7e4e17b8>

以下, サブクラスから呼び出せるの図.

class Foo
  private
  def foo
    'foo'
  end
end

class FooExt < Foo
  def fooext
    foo
  end
end

f = FooExt.new
f.fooext #=> "foo"

サブクラスから呼び出せるし, オーバーライトも出来るとのこと.

混乱してしまいそう...

後から private メソッドを定義する場合...

class Foo
  def foo
    'foo'
  end
  
  def bar
    'bar'
  end
  
  # private メソッドになる
  
  private :foo, :bar
  
  # ここは public メソッドになる
  def baz
    'baz'
  end
end

f = Foo.new
f.foo # NoMethodError: private method `foo' called for #<Foo:0x005589bf537728>
f.bar # NoMethodError: private method `bar' called for #<Foo:0x005589bf537728>
f.baz #=> "baz"

ふむふむ.