2012-03-30 2 views
5

직장에서 꽤 큰 레일 프로젝트를 작업합니다. 때로는 클래스/상수 정의를 찾아야합니다. Ruby에 내장 된 메소드가 있나요? 예 : 모든 파일 전에 처음에서irb에서 기호가 정의 된 부분보기

irb> SOME_CONSTANT.__file__ 
=> /some/path/to/a/file 
+1

디렉토리에서 "SOME_CONSTANT ="에 대한 그렙 만 시도 했습니까? –

+0

...................... 예? –

답변

1

정확히 찾고자하는 것이 아니지만 의 메소드에는 .source_location 메소드가 있습니다. 이것을 사용하여 클래스가 실제로 구현 된 위치를 찾을 수 있습니다. , 개체의 인스턴스 주어진 예를 들어

내가 (루비 당신이 수업을 재개 할 수 있기 때문에, 이것은 여러 위치에있을 수 있습니다) :

i.methods.map do |method_name| 
    method_obj = i.method(m) 
    file, line = method_obj.source_location 
    file #map down to the file name 
end.uniq 

는 당신에게 모든 파일 곳의 목록을 제공합니다 의 메소드가 구현되었습니다.

이 방법은 루비에서 적어도 하나의 메소드가 구현 된 클래스에서 작동합니다. 그래도 상수에서는 작동하지 않습니다.

0

는 모듈이 아닌 다른 무언가로 확인하려는 클래스/상수를 정의하는 행을 삽입,로드됩니다. 예를 들어 코드 내에 클래스 또는 다른 종류의 상수 A이 있고 정의 된 위치를 알고 싶다고 가정합니다. 그런 다음 주 파일의 시작에, 먼저 클래스의 정의를 충족 할 때마다 프로그램이 실행되는 다음

A = nil 

,/일정 A 쓰기, 그것은

some_path_to_a_file:line_number in `some_method': A is not a class (TypeError) 
과 같이 표시됩니다

또는 그런

some_path_to_a_file:line_number: warning: already initialized constant A 

, some_path_to_a_file:line_numberA 정의 된 위치 될 것이다.

0

Ruby 1.9.2를 사용하는 경우 @ YenTheFirst의 대답이 정확합니다. Method 객체에 #source_location을 호출하십시오.

Ruby 1.8.7을 사용하는 경우 #source_location은 (아직) 존재하지 않습니다. 방법이 this implementation과 같이 필요합니다. (다른 하나 또는 두 개의 주위에 떠있는있어,하지만 난 다른 하나를 진짜 빨리 찾을 수 없습니다).

+1

http://stackoverflow.com/a/13015691/260122에 따르면'Method # source_location'을 백 포트하는 보석 (ruby18_source_location) (https://github.com/ConradIrwin/ruby18_source_location)이 있습니다. – clacke