문제

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"]
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top