Jak utworzyć komunikat wyjściowy


208

Czy istnieje jedno wywołanie funkcji linii, które zamyka program i wyświetla komunikat? Wiem, że w Perlu jest to tak proste, jak:

die("Message goes here")

Mam dość pisania tego:

puts "Message goes here"
exit

10
Mała uwaga, wasze putszapisy do stdout, podczas diezapisu do stderr, więc: $stderr.puts "Message goes here".
cdarke

Wiem, że to nie była odpowiedź, ale odpowiedziała na moje pytanie, dzięki
Patrick

Tylko dla odniesienia, w Pythonie jest sys.exit("Message goes to stderr").
anatoly techtonik

Odpowiedzi:


361

abortFunkcja to robi. Na przykład:

abort("Message goes here")

Uwaga: abortwiadomość zostanie zapisana STDERRw przeciwieństwie do, do putsktórej będzie pisać STDOUT.


6
Łał! Niezłe znalezisko! Szkoda, że ​​nie tylko przeciążyli wyjścia tą funkcją ...
Mike Stone

56
Uwaga: polecenie przerwania kończy działanie programu ze statusem false, co oznacza awarię. exit domyślnie kończy pracę ze statusem true reprezentującym sukces. Upewnij się, że używasz odpowiedniego do sytuacji.
Alex Spurling,

1
re. Komentarz Mike'a Stone'a czasem wygląda na to, że Ruby został napisany przez zespół ludzi, którzy nie mieli ze sobą żadnej komunikacji, prawda? (Mimo to programowanie w nim jest tak łatwe.)
JellicleCat

24

Jeśli chcesz wskazać rzeczywisty błąd w kodzie, możesz zgłosić RuntimeErrorwyjątek:

raise RuntimeError, 'Message goes here'

Spowoduje to wydrukowanie śledzenia stosu, typu zgłaszanego wyjątku i podanego komunikatu. W zależności od użytkowników ślad stosu może być zbyt przerażający, a rzeczywista wiadomość może zagubić się w hałasie. Z drugiej strony, jeśli umrzesz z powodu rzeczywistego błędu, stacktrace dostarczy ci dodatkowych informacji do debugowania.


24
Nie trzeba wspominać o RuntimeError, aby zgłosić jeden (jest to domyślny rodzaj zgłaszanego wyjątku), więc wystarczy następujący kod: podwyżka „Wiadomość idzie tutaj”
sunaku,

sunaku - chociaż twój komentarz jest całkowicie poprawny, często stwierdziłem, że bardziej precyzyjne może być przydatne, w szczególności dla innych osób czytających kod później.
shevy

2

Nigdy nie słyszałem o takiej funkcji, ale wdrożenie jej byłoby wystarczająco trywialne ...

def die(msg)
  puts msg
  exit
end

Następnie, jeśli jest to zdefiniowane w jakimś pliku .rb, który dołączasz do wszystkich swoich skryptów, jesteś złoty ... tylko dlatego, że nie jest wbudowany, nie oznacza, że ​​nie możesz zrobić tego sam ;-)


3
Okazuje się, że robi to funkcja „przerywania” (patrz moja odpowiedź poniżej)
Chris Bunch,

1
Po co pisać kod, gdy funkcja przerywania robi to za Ciebie?
Gary Haran

2
@ChrisBunch Nie jest to to samo, co funkcja przerwania: exitdomyślnie zwraca wartość tak, jakby się powiodła. abortzwraca błąd. exit 1zwróci również awarię.
TemporalWolf,

2

Przybyłem tutaj, szukając sposobu na wykonanie kodu po zakończeniu programu.
Znaleziono to :

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

Wielokrotne wywołanie spowoduje zarejestrowanie wielu programów obsługi.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.