ฉันจะก้าวออกจากลูปด้วย Ruby Pry ได้อย่างไร


212

ฉันกำลังใช้ Pry กับแอปพลิเคชัน Rails ของฉัน ฉันตั้งbinding.pryวงในโมเดลของฉันเพื่อลองและแก้ไขปัญหา ตัวอย่างเช่น:

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

เมื่อฉันพิมพ์quitมันจะไปที่การทำซ้ำครั้งถัดไปและหยุดอีกครั้ง มีวิธีก้าวออกจากวงดังนั้นฉันไม่ต้องพิมพ์quit100 ครั้งหรือไม่

ปัจจุบันวิธีเดียวที่ฉันรู้วิธีที่จะออกจากมันคือการใช้CTRL+ Cและรีสตาร์ทแอปพลิเคชัน

คำตอบ:


412

หากต้องการออกจาก Pry โดยไม่มีเงื่อนไขให้พิมพ์

exit-program

แก้ไขจากความคิดเห็นของ @ Nick : ยังใช้งานได้:

!!!

ขอบคุณ @Evandro นั่นคือสิ่งที่ฉันกำลังมองหา!
Ryan

แม้ว่าคุณจะเห็นได้ชัดว่ามีผลผูกพันทันทีที่ใช้เพียงแค่exitจะช่วยให้โปรแกรมทำงานต่อไป
AJP

1
rspecเรื่องนี้ไม่ได้ทำงานสำหรับฉันเมื่อทำงาน แต่ CTRL-C ทำสองครั้ง
Eric Walker

5
บน Mac OSX การกดCtrl + Cสองครั้งจะฆ่าเซสชัน Pry แต่จะฆ่าหน้าต่างเทอร์มินัลได้อย่างมีประสิทธิภาพด้วย: ผลลัพธ์ที่ตามมาจะได้รับการแก้ไขซึ่งฉันจำเป็นต้องปิดแท็บเทอร์มินัลนั้นแล้วย้ายไปที่ใหม่ อย่างไรก็ตาม!!!ไม่มีผลกระทบที่รุนแรงกว่านี้
Topher Hunt

@Evandro คุณไม่รู้หรอกว่านี่ช่วยฉันได้อย่างไร!
Sri Harsha Kappala

111

ฉันใช้:

disable-pry

สิ่งนี้จะทำให้โปรแกรมทำงานต่อไป แต่จะป้องกันไม่ให้โปรแกรมทำงานต่อไปเพื่อหยุดการทำงาน สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อคุณทำการดีบักในคอนโซล


11
หากต้องการเปิดใช้งานอีกครั้ง (จากบรรทัดคำสั่ง): ENV ['DISABLE_PRY'] = nil
stebooks

2
ฉันไม่สามารถป้อนแงะอีกครั้งหลังจากใช้ปิดการใช้งานแงะ แม้หลังจากใช้ ENV ['DISABLE_PRY'] = nil
daslicious

2
ในการป้อนแงะอีกครั้งสิ่งที่คุณต้องทำคือตั้งค่าENV['DISABLE_PRY'] = nilในคอนโทรลเลอร์ของคุณไม่ได้อยู่ในบรรทัดคำสั่งหรือคอนโซลของราง
Atul Khanduri

นี่เป็นอุปกรณ์ที่สมบูรณ์แบบที่จะใช้เมื่อคุณใช้การ์ดป้องกันและต้องการให้หยุดการแงะสำหรับการทดสอบนั้น มันจะรีเซ็ตในการทดสอบครั้งต่อไป
BBonifield

31

ในการออกจากทุกสิ่งให้ใช้:

exit!

สิ่งนี้ควรละเว้นการเชื่อมโยงที่ดำเนินการต่อทั้งหมด


4
นอกจากนี้ยังฆ่าเซิร์ฟเวอร์ในเวลาเดียวกัน exit-programยังคงเป็นตัวเลือกที่ดีที่สุดถ้าคุณไม่ต้องการรีสตาร์ทเซิร์ฟเวอร์
Ryan

3
เพียงชี้แจงexit-programให้คุณรักษาrails serverเซสชั่นของคุณแต่ดูเหมือนจะโยนSystemExit
อลันเดวิดการ์เซีย

24

เครื่องหมายอัศเจรีย์สามตัว ( !!!) จะทำเช่นนั้น


นี่เป็นวิธีแก้ปัญหาสำหรับฉันใน OSX 10.11.4 (El Capitan) ฉันไม่ได้ลองdisable-pry+ ENV['DISABLE_PRY'] = nilคำสั่งผสม แต่ฉันก็ลองexit-programซึ่งทำให้ฉันมีระบบออก อันนี้ใช้งานได้ดี (บนราง 3.2.22.2, แงะ 0.10.3 และทับทิม 1.9.3)
SidOfc

17

ใช้

disable-pry

หากต้องการเปลี่ยนได้ให้เพิ่มสิ่งนี้ลงในคอนโทรลเลอร์ของคุณ

ENV['DISABLE_PRY'] = nil

14

binding.pryคำสั่งตรงเช่นเดียวกับเบรกพอยต์ใน GDB เบรกพอยต์ใน GDB นั้นจะได้รับผลกระทบ 100 ครั้งเช่นกัน

หากคุณต้องการที่binding.pryจะถูกตีเพียงครั้งเดียวสำหรับการวนซ้ำครั้งแรกของลูปให้ใช้เงื่อนไขในชื่อbinding.pryดังนี้:

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

exitแล้วคุณออกจากเซสชันปัจจุบันโดยเพียงแค่พิมพ์


1

ตามคำตอบก่อนหน้านี้สองข้อด้านบน:

ขอบคุณทุกคน! คำแนะนำของคุณช่วยฉันได้มากจริงๆ!

ฉันต้องการแบ่งปันเคล็ดลับโง่ ๆ ง่ายๆซึ่งโดยส่วนตัวแล้วฉันไม่ต้องกังวลเกี่ยวกับDISABLE_PRYตัวแปรสภาพแวดล้อมตลอดเวลา เพิ่มการเรียกกลับนี้ไปยังตัวควบคุมฐานApplicationControllerของโครงการของคุณอย่างถาวร มันจะเปิดใช้งาน PRY อีกครั้งโดยอัตโนมัติทุกครั้งที่disable-pryเรียกว่า:

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

  private

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

1

การใช้ gem pry-movesคุณสามารถก้าวออกจากลูปโดยใช้f(เสร็จสิ้นคำสั่ง)


ตัวอย่าง:

    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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.