Làm thế nào để tôi bước ra khỏi vòng lặp với Ruby Pry?


212

Tôi đang sử dụng Pry với ứng dụng Rails của mình. Tôi đặt binding.prybên trong một vòng lặp trong mô hình của mình để thử và gỡ lỗi một vấn đề. Ví dụ:

(1..100).each do |i|
  binding.pry
  puts i
end

Khi tôi gõ quit, nó đi đến lần lặp tiếp theo và dừng lại. Có cách nào để bước ra khỏi vòng lặp để tôi không phải gõ quit100 lần không?

Hiện tại cách duy nhất tôi biết làm thế nào để thoát khỏi nó là sử dụng CTRL+ Cvà khởi động lại ứng dụng.

Câu trả lời:


412

Để thoát Pry vô điều kiện, gõ

exit-program

Chỉnh sửa từ bình luận của @ Nick : Cũng hoạt động:

!!!

Cảm ơn @Evandro, đó chính xác là những gì tôi đang tìm kiếm!
Ryan

Mặc dù rõ ràng bạn sẽ đạt được ràng buộc ngay lập tức, nhưng chỉ cần sử dụng exitsẽ cho phép chương trình tiếp tục chạy.
AJP

1
Điều này đã không làm việc cho tôi khi chạy rspec. Nhưng CTRL-C, hai lần, đã làm.
Eric Walker

5
trên Mac OSX, nhấn Ctrl + Chai lần sẽ giết phiên Pry, nhưng cũng sẽ giết hiệu quả cửa sổ đầu cuối đó: đầu ra tiếp theo bị trục trặc đến mức tôi cần phải đóng tab thiết bị đầu cuối đó và chuyển sang cái mới. Tuy nhiên !!!không có tác dụng làm nặng thêm.
Topher Hunt

@Evandro Bạn không biết làm thế nào điều này đã cứu tôi!
Sri Harsha Kappala

111

Tôi sử dụng:

disable-pry

Điều này sẽ giữ cho chương trình chạy, nhưng sẽ giữ cho nó tiếp tục dừng thực thi. Điều này đặc biệt hữu ích khi bạn gỡ lỗi trong giao diện điều khiển.


11
Để bật lại (từ dòng lệnh): ENV ['DISABLE_PRY'] = nil
stebooks

2
tôi đã không thể nhập lại pry sau khi sử dụng vô hiệu hóa. Ngay cả sau khi sử dụng ENV ['DISABLE_PRY'] = nil
daslicious

2
Để nhập lại pry, tất cả những gì bạn cần làm là đặt ENV['DISABLE_PRY'] = niltrong bộ điều khiển của bạn không nằm trong dòng lệnh HOẶC bảng điều khiển rails.
Atul Khanduri

Đây là một cách hoàn hảo để sử dụng khi bạn đang sử dụng bảo vệ và chỉ muốn nó ngừng chạy pry cho lần chạy thử đó. Nó sẽ thiết lập lại trong lần chạy thử tiếp theo.
BBonifield

31

Để thoát mọi thứ, hãy sử dụng:

exit!

Điều này nên bỏ qua tất cả các ràng buộc tiến hành.


4
Điều này cũng giết chết máy chủ cùng một lúc. exit-programcó lẽ vẫn là lựa chọn tốt nhất nếu bạn không muốn khởi động lại máy chủ.
Ryan

3
Chỉ cần làm rõ exit-programcho phép bạn duy trì rails serverphiên của mình nhưng dường như ném mộtSystemExit
Alan David Garcia

24

Ba câu cảm thán ( !!!) sẽ làm điều đó.


Đây là giải pháp cho tôi trên OSX 10.11.4 (El Capitan), tôi đã không thử kết hợp disable-pry+ ENV['DISABLE_PRY'] = nilnhưng tôi đã thử exit-program, nó đã cho tôi một systemExit. Cái này chỉ hoạt động. (Trên đường ray 3.2.22.2, nâng lên 0.10.3 và ruby 1.9.3)
SidOfc

17

Sử dụng

disable-pry

Để có thể thay đổi, hãy thêm nó vào bộ điều khiển của bạn

ENV['DISABLE_PRY'] = nil

14

Một binding.prytuyên bố hoàn toàn giống như một điểm dừng trong GDB. Một điểm dừng như vậy trong GDB cũng sẽ bị tấn công 100 lần.

Nếu bạn chỉ muốn binding.pryđánh một lần, cho lần lặp đầu tiên của vòng lặp, sau đó sử dụng một điều kiện trên binding.prynhư vậy:

(1..100).each do |i|
  binding.pry if i == 1
  puts i
end

Sau đó, bạn thoát phiên hiện tại bằng cách chỉ cần gõ exit.


1

Dựa trên hai câu trả lời trước ở trên:

Cảm ơn các bạn! Lời khuyên của bạn đã giúp tôi thực sự rất nhiều!

Tôi chỉ muốn chia sẻ một mẹo ngu ngốc đơn giản mà cá nhân tôi sử dụng để không lo lắng về DISABLE_PRYbiến môi trường mọi lúc. Thêm cuộc gọi lại này vào bộ điều khiển cơ sở ApplicationControllercủa dự án của bạn vĩnh viễn. Nó sẽ tự động kích hoạt lại PRY mỗi khi disable-pryđược gọi:

# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :reenable_pry

  private

  def reenable_pry
    ENV['DISABLE_PRY'] = nil
  end
end

1

Sử dụng gem pry-movesbạn có thể bước ra khỏi vòng lặp bằng cách sử dụng f(lệnh finish)


thí dụ:

    42: def test
    43:   3.times do |i|
 => 44:     binding.pry
    45:     puts i
    46:   end
    47:   puts :finish
    48: end

[1] pry(main)> f
0
1
2

Frame: 0/1 method
From: playground/sand.rb:47 main

    42: def test
    43:   3.times do |i|
    44:     binding.pry
    45:     puts i
    46:   end
 => 47:   puts :finish
    48: end

0

nhấn 'q' và bạn sẽ thấy như thế này

[1] pry(#<AlbumsController>)>

kiểu

exit

một từ này sẽ làm, nếu không:

control + c
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.