rubyforen.de
http://forum.ruby-portal.de/

Prozeduren/Funktionen
http://forum.ruby-portal.de/viewtopic.php?f=1&t=26359
Seite 1 von 1

Autor:  baumwolle [ 02 Feb 2014, 20:54 ]
Betreff des Beitrags:  Prozeduren/Funktionen

Hallo,

kann mir jemand nochmal verständlich erklären was der ist?
Ich weiß, dass Funktionen ja sozusagen gleich sind wie Prozeduren, aber es noch einen Rückgabewert gibt bei Funktionen. Jedoch finde ich in Büchern/im Internet immer nur so abstrakte Definitionen. Würde das gerne Unterschied zwischen Funktionen und Prozedurenverständlich erklärt bekommen. Das wäre super :).

Wenn ich jetzt z.B. in einer Klasse eine Methode habe



1
2
3
def get_x
@x
end


Ist das dann eine Funktion, oder?Ich habe zwar keinen expliziten Rückgabewert,jedoch wird mir x zurückgegeben. Liege ich damit richtig?Falls nicht, wäre nett wenn ich eine Erklärung bekommen, warum nicht.

Danke euch :)!

Autor:  Quintus [ 02 Feb 2014, 21:25 ]
Betreff des Beitrags:  Re: Prozeduren/Funktionen

Das kann man anhand von Ruby nicht erklären, denn in Ruby gibt es nur und ausschließlich Methoden. Kennzeichen von Funktionen ist der fehlende Rückgabewert, jedoch gibt Ruby immer etwas zurück. Im Zweifel der Wert des letzten Ausdrucks oder nil. Probier’s mal in der IRB aus.

KA, was eine „Prozedur“ ist. Ich vermute, dass es sich dabei um den Oberbegriff zu Funktionen und Methoden handelt — Funktionen gibt es in Ruby aber nicht.

Vale,
Quintus

Autor:  NobbZ [ 02 Feb 2014, 21:44 ]
Betreff des Beitrags:  Re: Prozeduren/Funktionen

Quintus hat geschrieben:
Kennzeichen von Funktionen ist der fehlende Rückgabewert


Nein, eben nicht. Das fehlen eines Rückgabewertes ist Kennzeichen von Prozeduren. Spontan fällt mir eigentlich nur PASCAL ein als Sprache bei der dieser Unterschied nicht nur theoretischer sondern auch praktischer Natur ist.

Vgl. dazu



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure p(var n: integer);
begin
n := n;
end;

function f(n: integer): float;
begin
f := n;
end;

var
i: float;
begin
(* i := p(1); ist ungueltig! *)
i := f(1); (* Dies ist gueltiger Code *)
p(1); (* Dies ist gueltiger Code *)
(* f(1); das hier wieder nicht *)
end.


Man sieht hier also, dass PASCAL es verbietet (ohne Compilerswitcherei) Funktionen als Statement oder Prozeduren als Expression zu nutzen.

Im Gegensatz dazu kennt zum Beispiel C mit Funktionen des Rückgabetyps "void" ebenfalls etwas ähnliches wie Prozeduren. Allerdings kann ich in C (und in den meisten anderen Sprachen) Funktionen die etwas zurückgeben einfach aufschreiben wie ein Statement, also als einzigen „Befehl“ einer Zeile. Diese Sprachen „vergessen“ dann halt den Rückgabewert wieder.

Quintus hat geschrieben:
KA, was eine „Prozedur“ ist. Ich vermute, dass es sich dabei um den Oberbegriff zu Funktionen und Methoden handelt — Funktionen gibt es in Ruby aber nicht.


Doch, Ruby kennt eben nur Funktionen.

Methoden ist hier der Oberbegriff, damit werden nämlich Funktionen und Prozeduren im allgemeinen bezeichnet, die an ein Objekt oder Instanz davon gebunden sind.

Aber um die eigentliche Frage zu beantworten:
Als Nichtinformatiker und Nicht-PASCAL-Programmierer brauchst du dir über den Unterschied von Prozeduren und Funktionen keine Gedanken zu machen.

*edit*
Ich habe den PASCAL-Code jetzt mal so angepasst, dass er doch tatsächlich kompilieren würde… Die beiden Unterprogramme sind verschiedene Implementationen der Identitäts„funktion“. Ausserdem erweiterte Erklärung zu dem PASCAL Snippet.

Autor:  Quintus [ 03 Feb 2014, 12:15 ]
Betreff des Beitrags:  Re: Prozeduren/Funktionen

Danke für die Korrektur. Da sieht man, dass ich diese Begrifflichkeiten so gut wie nie brauche...

Vale,
Quintus

Autor:  NobbZ [ 03 Feb 2014, 12:50 ]
Betreff des Beitrags:  Re: Prozeduren/Funktionen

Ich habe es auch nur gerade im Kopf, weil ich den Unterschied zwischen Funktionen und Prozeduren nächsten Dienstag für die PASCAL-Klausur brauche und die letzten Monate wegen Studium deutlich mehr mit PASCAL arbeiten musste, als mir lieb war ;)

Autor:  baumwolle [ 03 Feb 2014, 19:41 ]
Betreff des Beitrags:  Re: Prozeduren/Funktionen

Und was ist der Unterschied zwischen Funktionen mit Ausrufezeichen und ohne Ausrufezeichen am Ende?

(z.B. reverse oder reverse!)

Kann mir des noch wer erklären :)?Danke!

Autor:  NobbZ [ 03 Feb 2014, 19:56 ]
Betreff des Beitrags:  Re: Prozeduren/Funktionen

Aus Sicht des Interpreters ist der einzige Unterschied der Name und damit die Adresse auf die sie zeigen. Es sind einfach zwei gültige Bezeichnernamen in Ruby.

Per Konvention ist es aber so, dass zwei Methoden, die sich nur durch das Aufrufezeichen unterscheiden, das gleiche machen, mit dem Unterschied, dass die Methode mit dem Ausrufezeichen dabei das Ursprungsobjekt verändert.



1
2
3
4
5
array = [1,2,5,3] #=> [1, 2, 5, 3]
array.sort #=> [1, 2, 3, 5]
array #=> [1, 2, 5, 3]
array.sort! #=> [1, 2, 3, 5]
array #=> [1, 2, 3, 5]


Hier am Beispiel von Array#sort und Array#sort!. Man bechte insbesondere den Unterschied im Rückgabewert bei den Zeilen 3 und 5!

Autor:  Kai [ 03 Feb 2014, 21:10 ]
Betreff des Beitrags:  Re: Prozeduren/Funktionen

Wichtig an der Stelle: Viele Bang-Methoden (mit !) geben per Konvention nil zurück, wenn nichts am Object verändert wurde.



[1,3,2,5,4].uniq!.sort!

würde eine Fehlermeldung werfen. Daher kann man die Bang-Methoden gewissermaßen als Prozeduren betrachten, in dem Sinne dass ihr Rückgabewert nicht immer das Objekt sein muss, dass durch die Methode verändert wurde.

Richtige Schreibweise wäre also:


1
2
3
array = [1,3,2,5,4]
array.uniq!
array.sort!

Autor:  baumwolle [ 03 Feb 2014, 22:58 ]
Betreff des Beitrags:  Re: Prozeduren/Funktionen

Danke für die super Erklärung :).

Autor:  NobbZ [ 04 Feb 2014, 11:15 ]
Betreff des Beitrags:  Re: Prozeduren/Funktionen

Aber immer dran denken! Dieser Unterschied ist nur Konvention! Ohne nachzudenken drauf verlassen kannst du dich nur in der Std-Lib. Bei externen Gems kann es schon wieder ganz anders aussehen!

Mal davon abgesehen bevorzuge ich die explizite Zuweisung gegenüber dem Bang… Der Bang verschwindet so schnell beim schnellen überfliegen des Codes… Man vergleiche:



1
2
3
4
5
array = [1,2,2,3,4,7,5]
array.sort!
array = array.unique
# Die Variante mit der Zuweisung l��sst auch unfallfreies Chaining zu:
array = array.unique.sort

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/