2016-11-14 4 views
4

에서 확장되었습니다. 모듈이 루비에서 확장 된 위치를 파악하려고합니다. 지금 당장 올 수있는 유일한 방법은 caller을 사용하고 적절한 줄을 고르는 것입니다. 그것을 다루기 위해 더 관용적이고 부서지기 쉬운 방법이 있습니까?루비 : 모듈이

module ClassMethods 
    def self.extended(base) 
    p caller[2] 
    end 
end 
나는 개인적으로이 같은 뭔가를 갈 것
+0

파일 이름을 찾으시겠습니까? 또는 특정 라인 번호를 찾으려고합니까? – Rashmirathi

+0

방금 ​​파일 경로를 찾고 있습니다. 줄 번호 걱정하지 마라. – lobati

+2

진단 목적과 같이 궁금한가요? 실제 코드에서 이런 종류의 것을 사용하는 것은 문제가 될 수 있습니다. – tadman

답변

2

(OP의 의견에 따라) :

module ClassMethods 
end 

class Object 
    def extend_with_path(mod, filename) 
    p filename 
    self.extend(mod) 
    end 
end 


class Foo 
    extend_with_path ClassMethods, __FILE__ 
end 

당신이 base 클래스의 내부 지식을 가지고 가정, 당신은 이런 식으로 뭔가를 시도 할 수 :

module ClassMethods 
    def self.extended(base) 
    p base.new.method(:superfluous_method).source_location 
    end 
end 

class Foo 
    def superfluous_method 
    end 

    extend ClassMethods 
end 

추신 : 나는 이것이 거대 해킹이며 매우 좋지 않다는 것을 알고 있으며, 나는 거기 있는지 알고 싶어한다. 이런 식으로하는 더 좋은 방법입니다.

+1

니스, 그 시점에서 나는 문자 그대로 모듈을위한 경로를 대신 정의 할 수 있습니다 :'class Foo; FILE_PATH = __FILE__; extends ClassMethods; 끝 '. – lobati

+1

감사합니다. 내 접근 방식이 너무 고통 스럽다면 나는 아마 그런 식으로 바꿔 치기를 할 것입니다. https://github.com/mockdeep/configurator/commit/03f208 – lobati

+0

죄송합니다. 이전 답변을 삭제했습니다. "그래, 아주 좋은 지적인데, 그럴 경우 정직하게 파일 이름을 전달하는 대신 일정한." – Rashmirathi