2015-01-08 2 views
1

Ниже мой отрывок, который я попробовал,instance_eval внутри другого метода экземпляра

class Person 
    def test(arg) 
    self.class.instance_eval do 
     define_method(arg) {puts "this is a class method"} 
    end 
    end 
end 

irb(main):005:0> Person.new.test("foo") 
=> #<Proc:[email protected]/home/kranthi/Desktop/method_check.rb:4 (lambda)> 

irb(main):003:0> Person.foo 
NoMethodError: undefined method `foo' for Person:Class 

irb(main):007:0> Person.new.foo 
this is a class method 
=> nil 

Здесь я добавить метод класса Person динамически с помощью instance_eval и define_method. Но почему это ведет себя как метод экземпляра ?. Это полностью зависит от себя? Confused. Может кто-нибудь объяснить мне или ссылку ссылку также оценили.

ответ

1

Это потому, что define_method defines instance method of the receiver. Ваш приемник (self) является классом Person, поэтому он определяет метод экземпляра класса Person. Вы можете добиться того, что вы хотите доступ к метаклассу Person «S:

def test(arg) 
    class << self.class 
    define_method(arg) { puts 'this is a class method' } 
    end 
end 

Я не проверял, но он должен работать.

+0

Так что даже если я использую self.class.instance_eval, это не имеет значения, это !! ?? –

+0

Но экземпляр _eval также будет делать то же самое правильно? он добавляет метод в meta_clas правильно? –

+1

Нет, 'instance_eval' выполняет предоставленный блок в контексте объекта, на который он был вызван (также он устанавливает« текущий класс »как метакласс этого объекта, но здесь это не имеет значения, поскольку' define_method' работает над ' self'). Например, 'Person.instance_eval' выполняет блок в контексте объекта Person. –

Смежные вопросы