문제
Prag Dave의 첫 번째 Ruby Metaprogramming Screencast를보고있었습니다. 어느 시점에서 그는 Ruby가 인스턴스 변수에 메소드를 추가 할 때 '고스트 클래스'를 소개한다고 말했습니다. 나.
animal = "cat"
def animal.speak
puts "hola"
end
animal.speak # => hola
animal.class # => String
dog = "dog"
dog.speak # Undefined method `speak' for "dog":String
String.send :speak # NoMethodError: undefined method `speak' for String:Class
animal.send :speak # hola
실제로 Speak Method Store는 어디에 있습니까? 보이지 않는 프록시 클래스 인 경우 해당 프록시 클래스에 어떻게 액세스 할 수 있습니까?
해결책
방법 speak
메타 클라스 (고유 한도라고도 함)에 저장되며, "보이지 않는 프록시 클래스"라고 부릅니다. 루비에서는 인스턴스 변수가 방법을 저장할 장소가 없습니다. 인스턴스 변수와 클래스 만 저장할 수 있습니다. 따라서 인스턴스에 메소드를 추가하면 메타 클라스가 생성되어 클래스 체인에 삽입됩니다. 내부를 더 잘 이해하려면 추천합니다. 이 기사 Klank Boom Klang에서.
메타 수업에 참가하려면 다음을 수행 할 수 있습니다.
animal = "cat"
def animal.speak
puts "hola"
end
animal.speak # => hola
animal.class # => String
metaclass = class << animal; self; end
metaclass.inspect # => #<Class:#<String:0x2c9c460>>
metaclass.instance_methods.index 'speak' # => 102
metaclass.class # => Class
다른 팁
일부 ppl은 그것을 "싱글 톤 클래스"라고 부릅니다.
singleton_class = class << animal; self; end
그리고 실제로이 싱글 톤 클래스는 모든 수업에서 수업 메소드의 호스트입니다. 먼저 클래스 Foo를 'hi'및 'bye'로 정의 하여이 예를 확인하십시오.
class Foo
def self.hi ; p "hi" ; end
def self.bye ; p "bye" ; end
end
Foo.singleton_methods #=> ["hi","bye"]
이제 싱글 톤 클래스를 반환하는 메소드를 정의해 봅시다.
class Object
def singleton_class
class << self
self
end
end
end
이제 이것을 시도하십시오 :
Foo.singleton_methods #=> ["bye", "hi"]
Foo.singleton_class.instance_methods(false) #=> ["bye", "hi"]
제휴하지 않습니다 StackOverflow