2011-08-25 18 views
12

Nếu tôi định nghĩa một phương thức trong IRB, có cách nào để xem lại nguồn của nó sau này trong phiên không?Trong IRB, tôi có thể xem nguồn của một phương pháp mà tôi đã xác định trước đó không?

> def my_method 
> puts "hi" 
> end 

Một số màn hình của đầu ra sau, tôi muốn để có thể viết một cái gì đó giống như

> source my_method 

và trở lại:

=> def my_method; puts "hi"; end; 

Đây có phải là có thể?

Trả lời

13

Hãy thử pry. Có một railscast về nó (phát hành cùng tuần này!) Và nó cho bạn thấy làm thế nào để hiển thị mã bằng cách sử dụng show-method.

5

Nếu bạn sử dụng Ruby 1.9.2 và phiên bản mới hơn của sourcify đá quý hơn có sẵn trên Rubygems.org (ví dụ như xây dựng nguồn từ GitHub), bạn có thể làm điều này:

>> require 'sourcify' 
=> true 
>> 
.. class MyMath 
..  def self.sum(x, y) 
..   x + y # (blah) 
..  end 
.. end 
=> nil 
>> 
.. MyMath.method(:sum).to_source 
=> "def sum(x, y)\n (x + y)\nend" 
>> MyMath.method(:sum).to_raw_source 
=> "def sum(x, y)\n x + y # (blah)\n end" 

Edit: cũng kiểm tra ra method_source, đó là những gì pry sử dụng trong nội bộ.

+0

công việc không làm việc này cho tôi – horseyguy

+1

Như tôi đã nói bạn cần Ruby 1.9.2 và một phiên bản 'sourcify' mới hơn phiên bản hiện có trên Rubygems.org (tôi đã xây dựng mỏ của tôi từ repo Git). Tôi đã cập nhật bài đăng của mình để làm cho bài đăng này rõ ràng hơn. –

13

Không có trong IRB nhưng trong Pry tính năng này được tích hợp sẵn.

Kìa:

pry(main)> def hello 
pry(main)* puts "hello my friend, it's a strange world we live in" 
pry(main)* puts "yes! the rich give their mistresses tiny, illuminated dying things" 
pry(main)* puts "and life is neither sacred, nor noble, nor good" 
pry(main)* end 
=> nil 
pry(main)> show-method hello 

From: (pry) @ line 1: 
Number of lines: 5 

def hello 
    puts "hello my friend, it's a strange world we live in" 
    puts "yes! the rich give their mistresses tiny, illuminated dying things" 
    puts "and life is neither sacred, nor noble, nor good" 
end 
pry(main)> 
1

Những gì tôi sử dụng là method_source tôi có phương pháp đang mà về cơ bản là wrapper của tôi cho viên ngọc này. Thêm method_source trong ứng dụng Gemfile for Rails. Và tạo initializer với mã sau đây.

# Takes instance/class, method and displays source code and comments 
    def code(ints_or_clazz, method) 
    method = method.to_sym 
    clazz = ints_or_clazz.is_a?(Class) ? ints_or_clazz : ints_or_clazz.class 
    puts "** Comments: " 
    clazz.instance_method(method).comment.display 
    puts "** Source:" 
    clazz.instance_method(method).source.display 
    end 

Cách sử dụng:

code Foo, :bar 

hoặc dụ

code foo_instance, :bar 

Better cách tiếp cận là phải có lớp học với trong thư mục/lib với phần mở rộng IRB của bạn, hơn là bạn chỉ đòi hỏi nó tại một trong những người khởi tạo (hoặc tạo của riêng bạn)

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