我有一個簡單的 ruby?? 腳本,我想在 rails 控制臺中運行,使用 bundle exec rails c
ids = [1, 2]
if ids.length() > 5
puts "More than 5 ids, quitting"
exit
end
ids.each do |id|
puts id
end
rails 控制臺會在看到 exit 命令后立即退出程式。解決這個問題的最佳方法是什么?
uj5u.com熱心網友回復:
一種方法是使用throw/catch:
ids = [1, 2]
catch(:bail) do
if ids.length > 5
puts "More than 5 ids, quitting"
throw :bail
end
ids.each do |id|
puts id
end
end
catch :bail定義一個用符號標記的塊:bail(名稱并不重要)。它將正常執行,直到throw :bail此時 Ruby 壓縮呼叫堆疊,直到找到相應的捕獲為止。如果未找到匹配的捕獲,將引發 UncaughtThrowError。
這有點像break但可以在任何背景關系中使用并打破深度嵌套的結構。
另一種選擇是簡單地定義一個方法或在輸入無效時引發(并拯救)例外。
uj5u.com熱心網友回復:
當傳遞的引數以某種方式無效時引發 ArgumentError
有很多方法可以修復您的代碼,但您的基本問題是 Kernel#exit 將退出標準 REPL 會話和應用程式,而不是簡單地從方法回傳或退出 if 陳述句。由于您的代碼沒有顯示您在方法內部,因此您無法使用,return因為沒有合適的方法或閉包可從中回傳。您可以使用嵌套的 irb 會話或類似方法來解決呼叫 #exit 問題,但這最終解決了錯誤的問題。
在大多數情況下,您希望通過有用的訊息引發例外,而不是在出現無法修復的錯誤時簡單地退出。以下將在您的應用程式中執行此操作,而在 irb 或 pry 控制臺中,它將引發例外但仍保留在您的 REPL 會話中:
ids = [1, 2]
raise ArgumentError, "More than 5 ids: #{ids}" if ids.length > 5
ids.each { |id| puts id }
如果你在一個方法中,你可以使用 #warn 然后回傳一個適當的回傳值。但是,由于您可能位于 REPL 的頂級物件內,因此沒有任何回傳值,因此這可能是您最好的通用選項。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/348330.html
