モジュールでは private 宣言しても private メソッドにならないけど、class << self
して特異クラスになると private メソッドを定義できるようになる。
$ irb
irb(main):001:0> module Foo
irb(main):002:1> def self.hello
irb(main):003:2> puts "Hello"
irb(main):004:2> end
irb(main):005:1> end
=> :hello
irb(main):006:0> Foo.hello
Hello
=> nil
irb(main):007:0> module Bar
irb(main):008:1> def self.hello
irb(main):009:2> konnitiwa
irb(main):010:2> end
irb(main):011:1> private
irb(main):012:1> def self.konnitiwa
irb(main):013:2> puts "konnnitiwa"
irb(main):014:2> end
irb(main):015:1> end
=> :konnitiwa
irb(main):016:0> Bar.hello
konnnitiwa
=> nil
irb(main):017:0> Bar.konnitiwa
konnnitiwa
=> nil
irb(main):018:0> module Baz
irb(main):019:1> def self.hello
irb(main):020:2> puts "matigaeta"
irb(main):021:2> end
irb(main):022:1> end
=> :hello
irb(main):023:0> module FooBar
irb(main):024:1> class << self
irb(main):025:2> def hello
irb(main):026:3> konnitiwa
irb(main):027:3> end
irb(main):028:2> private
irb(main):029:2> def konnitiwa
irb(main):030:3> puts "konnitiwa"
irb(main):031:3> end
irb(main):032:2> end
irb(main):033:1> end
=> :konnitiwa
irb(main):034:0> FooBar.hello
konnitiwa
=> nil
irb(main):035:0> FooBar.konnitiwa
NoMethodError: private method `konnitiwa' called for FooBar:Module
from (irb):35
from /Users/usr0600268/.rbenv/versions/2.1.1/bin/irb:11:in `<main>'