2012-03-26 43 views
14

Sử dụng pry, rất đơn giản để tìm nơi phương thức được xác định và xem nguồn theo lệnh edit-method. Tuy nhiên, không có thư từ cho chính lớp đó. Khi lớp đó không có phương thức nào được định nghĩa, thật khó để tìm nguồn thông qua pry.Làm thế nào để tôi tìm được một hằng số được xác định trong Ruby?

Các lớp là hằng số, vì vậy nó tương đương với việc hỏi nơi tìm nguồn gốc trong đó một hằng số Ruby cụ thể được xác định. Cảm ơn nhiều.

+1

Làm thế nào về 'grep'? – Arsen7

+3

Bạn có thể chấp nhận câu trả lời cho các câu hỏi trước của mình không? – Arsen7

+4

@ Arsen7 Oh cảm ơn bạn rất nhiều vì đã nhắc tôi. Tôi khá mới đối với cộng đồng này. Tôi đã chấp nhận chúng ngay bây giờ. –

Trả lời

6

Sử dụng ack, đôi khi nếu tôi đạt đến giới hạn của Pry (và Ruby) tôi sử dụng nó. Điều tuyệt vời về nó là bạn có thể gọi nó từ bên trong Pry bằng cách sử dụng các tính năng tích hợp vỏ của nó, thường chỉ cần gõ .ack ClassName thực hiện thủ thuật, tuy nhiên nó yêu cầu lớp được định nghĩa trong một tệp trong thư mục hiện tại.

Trong trường hợp lớp không được xác định trong thư mục hiện tại, bạn luôn có thể sử dụng một trong các phương pháp của nó, lấy vị trí nguồn từ đó và sau đó sử dụng lệnh cat của Pry để hiển thị nó làm nổi bật) hoặc lệnh edit của Pry để chuyển trực tiếp đến định nghĩa của nó.

Vụ án nơi một lớp học không có bất kỳ phương pháp dụ định nghĩa là khá hiếm - và một lớp học như vậy thường là khá nhàm chán anyway :)

EDIT:

Phiên bản mới nhất của Pry (0.9.9) bây giờ có thể hiển thị nguồn cho các mô-đun/lớp học bằng cách sử dụng lệnh show-source bình thường. Nó đòi hỏi rằng module/class có ít nhất một phương thức được định nghĩa tuy nhiên

1

Vâng, bạn có thể thử Module.constants(true) như đã nêu here Nó có thể mất nhiều hơn một chút so với sử dụng pry Mời nhưng nó sẽ cho phép bạn một cơ hội để nhìn trộm vào Modules tham gia

+0

Nó không giống như có một cách để tìm vị trí nguồn từ này, mặc dù. –

2

Nếu hằng số bạn đang tìm kiếm có phương thức (là một lớp hoặc mô-đun), bạn có thể sử dụng lớp Method để tìm ra nó được định nghĩa ở đâu.

class Foo 
    def bar 
    end 

    def self.baz 
    end 
end 

Foo.instance_method(:bar).source_location 
Foo.method(:baz).source_location 

Một chút hack và không giúp với hằng số tinh khiết class Foo; BAHZ = 2; end nhưng tốt hơn là không có gì.

6

Trong ruby, $" giữ tất cả tên tệp được tải qua Kernel.load. Vì vậy, bạn có thể thử một cái gì đó như thế này:

constant = User 
$".detect{|load_path| 
    load_path.include?(constant.to_s.underscore) 
} 

Lưu ý: Phương pháp underscore là một phần của Rails/ActiveSupport

+0

Đây là một gợi ý tuyệt vời! – sandstrom

+0

Câu trả lời hay. Tôi tìm thấy 'underscore' không có sẵn cho tôi trong String on Ruby 2.4.2. Tôi đã nhận được với 'downcase', nhưng nếu tên lớp của bạn là nhiều từ, bạn cần phải biến nó thành trường hợp rắn bằng cách nào đó. –

Các vấn đề liên quan