저는 Ruby에서 메타 프로그래밍을 배우고 있으며 method_missing과 define_method를 통해 누락 된 메소드를 정의하려고합니다. 나는 예상치 못한 행동을하고있어 누군가가 이것을 설명 할 수 있는지 궁금해하고 있습니다. 여기 내 클래스 : 이제루비 : 왜 to_ary에 전화를 걸까요?
class X
def method_missing(m, *args, &block)
puts "method #{m} not found. Defining it."
self.class.send :define_method, m do
puts "hi from method #{m}"
end
puts "defined method #{m}"
end
end
,이 코드는 왜 루비가 호출 : 나는하지 않는 무엇
이method some_method not found. Defining it.
defined method some_method
hi from method some_method
method to_ary not found. Defining it.
defined method to_ary
#<X:0x007fcbc38e5030>
마지막 부분입니다 :
x = X.new
x.some_method
puts
x.some_method
puts
puts x
출력을 생성합니다 to_ary에 전화를 걸어? 왜 Ruby는 내 객체를 배열로 변환하려고합니까?
나는 주위를 봤와 한발견이 관련 링크 :
- http://tenderlovemaking.com/2011/06/28/til-its-ok-to-return-nil-from-to_ary/
- http://yehudakatz.com/2010/01/02/the-craziest-fing-bug-ive-ever-seen/
이 또한 method_missing 및 to_ary 개는 이야기가 아니라 구체적으로 둔다는 to_ary 부를 것이다 이유에 대해 .
to_s를 정의 할 때 동작이 변경되지 않는다는 점도 언급해야합니다.
def to_s
"I'm an instance of X"
end
"풋의 X"의 출력
다음이다 :method to_ary not found. Defining it.
defined method to_ary
I'm an instance of X
감사합니다. 나는 본질이 "to_ary 내부 사용법은 Ruby 문서에 잘 설명되어 있지 않습니다"라고 생각합니다. :) IO.puts 워드 프로세서를 읽었을 때, 명시 적으로 to_ary를 언급하지 않았을 때, 이것이 더 분명해질 것이라고 생각합니다. "루비 프로그래밍 언어"책을 가리켜 주셔서 감사합니다. –