в 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 или любой другой проблемный случай это)