Як створити вихідне повідомлення


208

Чи є виклик функції однієї лінії, який закриває програму та відображає повідомлення? Я знаю, що в Perl це так просто, як:

die("Message goes here")

Я втомився вводити це:

puts "Message goes here"
exit

10
Невеликий коментар, ваші putsзаписи на стандартний висновок, а dieзаписи на стандартний висновок, так: $stderr.puts "Message goes here".
cdarke

Я знаю, що це була не відповідь, але вона відповіла на моє запитання, дякую
Патрік

Тільки для довідки, в Python це sys.exit("Message goes to stderr").
anatoly techtonik

Відповіді:


361

abortФункція робить це. Наприклад:

abort("Message goes here")

Примітка. abortПовідомлення буде написано на STDERRвідміну від того, на putsяке буде написано STDOUT.


6
Оце Так! Приємна знахідка! Шкода, що вони не просто перевантажили вихід із цією функціональністю ....
Майк Стоун,

56
Зауважте, переривання завершує роботу програми зі статусом "false", що означає збій. вихід за замовчуванням виходить зі статусом справжнього, що представляє успіх. Переконайтесь, що ви використовуєте правильний для ситуації.
Алекс Спарлінг

1
повторно. Коментар Майка Стоуна, іноді виглядає так, ніби Рубі написала команда людей, які не мали спілкування один з одним, чи не так? (Все-таки програмувати в ній так просто.)
JellicleCat

24

Якщо ви хочете позначити фактичну помилку у своєму коді, ви можете створити RuntimeErrorвиняток:

raise RuntimeError, 'Message goes here'

Це надрукує стек-трек, тип піднятого винятку та повідомлення, яке ви надали. Залежно від ваших користувачів, стек-трек може бути надто страшним, а фактичне повідомлення може загубитися від шуму. З іншого боку, якщо ви помираєте через фактичну помилку, стек-трек дасть вам додаткову інформацію для налагодження.


24
Вам не потрібно згадувати RuntimeError, щоб підняти його (це виняток за замовчуванням піднято), тому буде достатньо наступного коду: підняти "Повідомлення йде сюди"
sunaku

sunaku - хоча ваш коментар цілком справедливий, я часто виявляв, що бути більш явним може бути корисним, зокрема для інших людей, які читають код латерона.
shevy

2

Я ніколи не чув про таку функцію, але це було б досить банально для реалізації ...

def die(msg)
  puts msg
  exit
end

Тоді, якщо це визначено в якомусь .rb-файлі, який ви включаєте у всі свої сценарії, ви золоті .... просто тому, що він не вбудований, не означає, що ви не можете зробити це самостійно ;-)


3
Виявляється, функція "перервати" робить це (див. Мою відповідь нижче)
Кріс Бунк,

1
Навіщо писати код, коли функція переривання робить це за вас?
Гері Харан

2
@ChrisBunch Це не те саме, що функція переривання: exitза замовчуванням повертається так, як ніби це вдалося. abortповертає невдачу. exit 1також поверне невдачу.
TemporalWolf

2

Я потрапив сюди в пошуках способу виконання якогось коду, коли програма закінчується.
Знайшов це :

Kernel.at_exit { puts "sayonara" }
# do whatever
# [...]
# call #exit or #abort or just let the program end
# calling #exit! will skip the call

Викликані кілька разів реєструють кілька обробників.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.