Руби Я и ставит - PullRequest
       2

Руби Я и ставит

3 голосов
/ 28 марта 2012

Если self является получателем по умолчанию в ruby, и вы называете «put» в определении метода экземпляра, является ли экземпляр объекта получателем этого вызова?

Например

    class MyClass
      attr_accessor :first_name, :last_name, :size

      # initialize, etc (name = String, size = int)

      def full_name
        fn = first_name + " " + last_name 
        # so here, it is implicitly self.first_name, self.last_name
        puts fn 
        # what happens here?  puts is in the class IO, but myClass 
        # is not in its hierarchy (or is it?)
        fn
      end
    end

Ответы [ 2 ]

6 голосов
/ 28 марта 2012

Безусловно, текущий объект является получателем вызова метода здесь.Это работает потому, что модуль Kernel определяет метод puts и смешивается с Object, который является неявным корневым классом каждого класса Ruby.Доказательство:

class MyClass
  def foo 
    puts "test"
  end
end

module Kernel
  # hook `puts` method to trace the receiver
  alias_method :old_puts, :puts
  def puts(*args)
    p "puts called on %s" % self.inspect
    old_puts(*args)
  end
end

MyClass.new.foo 

Это печатает puts called from #<MyClass:0x00000002399d40>, поэтому экземпляр MyClass является получателем.

1 голос
/ 28 марта 2012

MyClass тихо наследует от Object, который смешивается в ядре.

Ядро определяет:/Kernel.html#method-i-puts

Следовательно, вы вызываете пут, он перемещается в себя и идет каскадно к ядру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...