If `self` is always the implied receiver in Ruby, why doesn't `self.puts` work?

后端 未结 4 1705
野性不改
野性不改 2021-01-12 19:22

In Ruby, my understanding is that self is the implied receiver for any bare method call. However:

~: irb
>> puts \"foo\"
foo
=> nil
>         


        
4条回答
  •  野趣味
    野趣味 (楼主)
    2021-01-12 19:46

    Private methods can't have a receiver

    I think the answer is this: Ruby's way of enforcing method privacy is that it doesn't allow calling private methods with an explicit receiver.

    An example:

    class Baker
      def bake_cake
        make_batter
        self.use_oven # will explode: called with explicit receiver 'self'
      end
    
      private
      def make_batter
        puts "making batter!"
      end
    
      def use_oven
        puts "using oven!"
      end
    
    end
    
    b = Baker.new
    b.bake_cake
    

    Since there can be no explicit receiver, you certainly can't do b.use_oven. And that is how method privacy is enforced.

提交回复
热议问题