Bagaimana cara saya keluar dari loop dengan Ruby Pry?

212

Saya menggunakan Pry dengan aplikasi Rails saya. Saya mengatur binding.prydi dalam lingkaran dalam model saya untuk mencoba dan men-debug masalah. Sebagai contoh:

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

Saat saya mengetik quit, ia beralih ke iterasi berikutnya dan berhenti lagi. Apakah ada cara untuk keluar dari loop jadi saya tidak perlu mengetik quit100 kali?

Saat ini satu-satunya cara saya tahu bagaimana keluar dari itu adalah menggunakan CTRL+ Cdan me-restart aplikasi.

Ryan
sumber

Jawaban:

413

Untuk keluar dari Pry tanpa syarat, ketikkan

exit-program

Edit dari komentar @ Nick : Juga berfungsi:

!!!
Evandro
sumber
Terima kasih @Evandro, itulah yang saya cari!
Ryan
Meskipun Anda jelas akan langsung mengikat, menggunakan saja exitakan memungkinkan program untuk terus berjalan.
AJP
1
Ini tidak bekerja untuk saya ketika berlari rspec. Tapi CTRL-C, dua kali, berhasil.
Eric Walker
5
pada Mac OSX, menekan Ctrl + Cdua kali akan mematikan sesi Pry, tetapi juga akan secara efektif mematikan jendela terminal: output selanjutnya menjadi kacau sehingga saya harus menutup tab terminal dan pindah ke yang baru. Namun !!!tidak memiliki efek yang memberatkan ini.
Topher Hunt
@Evandro Anda tidak tahu bagaimana ini menyelamatkan saya!
Sri Harsha Kappala
111

Saya menggunakan:

disable-pry

Ini akan membuat program tetap berjalan, tetapi akan membuatnya tidak melanjutkan untuk menghentikan eksekusi. Ini sangat membantu ketika Anda sedang melakukan debug di konsol.

buku telepon
sumber
11
Untuk mengaktifkan kembali (dari baris perintah): ENV ['DISABLE_PRY'] = nil
stebook
2
saya tidak dapat masuk kembali membongkar setelah menggunakan menonaktifkan-membongkar. Bahkan setelah menggunakan ENV ['DISABLE_PRY'] = nil
daslicious
2
Untuk memasukkan kembali pry, yang perlu Anda lakukan adalah mengatur ENV['DISABLE_PRY'] = nildi controller Anda tidak di baris perintah ATAU konsol rel.
Atul Khanduri
Ini adalah yang sempurna untuk digunakan ketika Anda menggunakan pelindung dan hanya ingin itu berhenti berjalan untuk menjalankan tes itu. Ini akan mereset pada percobaan berikutnya.
BBonifield
31

Untuk keluar dari semuanya, gunakan:

exit!

Ini harus mengabaikan semua binding yang sedang diproses.

Blake
sumber
4
Ini juga membunuh server secara bersamaan. exit-programmungkin masih merupakan opsi terbaik jika Anda tidak ingin me-restart server.
Ryan
3
Hanya untuk memperjelas exit-programmemungkinkan Anda untuk mempertahankan rails serversesi Anda tetapi tampaknya melemparSystemExit
Alan David Garcia
24

Seruan tiga kali lipat ( !!!) akan melakukannya.

Hahn
sumber
Ini adalah solusi untuk saya di OSX 10.11.4 (El Capitan), saya tidak mencoba disable-pry+ ENV['DISABLE_PRY'] = nilcombo tapi saya mencoba exit-programyang memberi saya systemExit. Yang ini hanya berfungsi. (Di rel 3.2.22.2, pry 0.10.3 dan ruby 1.9.3)
SidOfc
17

Menggunakan

disable-pry

Untuk dapat diperbarui, tambahkan ini ke controller Anda

ENV['DISABLE_PRY'] = nil
Chet3x16
sumber
14

SEBUAH binding.pry pernyataan adalah persis sama sebagai breakpoint di GDB. Breakpoint seperti itu di GDB akan mencapai 100 kali juga.

Jika Anda hanya ingin binding.prydipukul sekali, untuk iterasi pertama dari loop, kemudian gunakan conditional binding.pryseperti:

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

Anda kemudian keluar dari sesi saat ini hanya dengan mengetik exit.

horseyguy
sumber
1

Berdasarkan dua jawaban sebelumnya di atas:

Terima kasih kawan! Nasihat Anda sangat membantu saya!

Saya hanya ingin berbagi trik bodoh sederhana, yang saya pribadi gunakan untuk tidak khawatir tentang DISABLE_PRYvariabel lingkungan sepanjang waktu. Tambahkan panggilan balik ini ke pengontrol dasar ApplicationControllerproyek Anda secara permanen. Ini akan secara otomatis mengaktifkan kembali PRY setiap kali disable-prydipanggil:

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

  private

  def reenable_pry
    ENV['DISABLE_PRY'] = nil
  end
end
zinovyev
sumber
1

Menggunakan gem, pry-movesAnda dapat keluar dari loop menggunakan f(perintah finish)


contoh:

    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
Daniel Garmoshka
sumber
0

tekan 'q' dan Anda akan melihat seperti ini

[1] pry(#<AlbumsController>)>

Tipe

exit

kata yang satu ini akan berlaku, jika tidak:

control + c
Vayne yang tak berperasaan
sumber