p250で、クラスメソッドをprivateにしたい場合とありますが、privateメソッドは「レシーバを指定して呼び出すことができない」とあるので不思議です。 User.hello のUserはレシーバとは呼ばないのかということです。
https://twitter.com/maehrm/status/979326471075278848
いいえ、User
はレシーバです。なので、クラスメソッドのhello
がprivateメソッドだった場合は、User.hello
のようにレシーバを指定して呼び出すとエラーになります。
となると、「このhello
メソッドはいつ誰がどうやって呼び出すの?」という疑問が出てくるかもしれません。この場合、クラスの外からは呼び出せませんが、クラスの中であれば呼び出せます。
つまり、他のクラスメソッドがhello
メソッドを呼び出すケースが考えられます。
たとえば以下のような感じです。
class User
class << self
def greet
# クラスメソッドのgreetから、privateなクラスメソッドであるhelloを呼び出す
"#{hello} I am User class."
end
private
def hello
'Hello!'
end
end
end
User.greet #=> "Hello! I am User class."