rails activesupport 3.2.22 обратный вызов __define_runner методы - PullRequest
0 голосов
/ 24 октября 2019

в activesupport-3.2.22 / lib / active_support / callback.rb подобный код

    module ClassMethods
      # Generate the internal runner method called by +run_callbacks+.
      def __define_runner(symbol) #:nodoc:
        runner_method = "_run_#{symbol}_callbacks" 
        unless private_method_defined?(runner_method)
          class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
            def #{runner_method}(key = nil, &blk)
              self.class.__run_callback(key, :#{symbol}, self, &blk)
            end
            private :#{runner_method}
          RUBY_EVAL
        end
      end
    end

я пытаюсь показать исходный код class_eval в pry env, я получил это в activesupport-3.2.22 /lib / active_support / core_ext / kernel / singleton_class.rb

module Kernel
  # Returns the object's singleton class.
  def singleton_class
    class << self
      self
    end
  end unless respond_to?(:singleton_class) # exists in 1.9.2

  # class_eval on an object acts like singleton_class.class_eval.
  def class_eval(*args, &block)
    singleton_class.class_eval(*args, &block)
  end
end

когда я копирую этот код в метод pry

A.singleton_class.class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
  def test_method
    p "test_method"
  end
RUBY_EVAL

A.class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
  def i_test_method
    p "i_test_method"
  end
RUBY_EVAL

A.singleton_class.class_eval, определенный в A.singleton_class и должен бытьвызывается через A.test_method

, а A.class_eval должен вызываться через A.new.i_test_method

Итак, почему код обратного вызова rails по-прежнему определяет метод как instance_methods, а не метод класса? (это выдает ошибку show-source или любой другой проблемный случай это)

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