Die Programmiersprache Ruby

Blog|

Forum|

Wiki  


Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]

Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Prozeduren/Funktionen
BeitragVerfasst: 02 Feb 2014, 20:54 
Offline
Schüler

Registriert: 15 Jan 2014, 22:22
Beiträge: 24
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 :)!


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Prozeduren/Funktionen
BeitragVerfasst: 02 Feb 2014, 21:25 
Offline
Interpreter
Benutzeravatar

Registriert: 18 Sep 2008, 22:32
Beiträge: 1821
Wohnort: NRW → UN
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

_________________
Habe den Mut, dich deines eigenen Verstandes zu bedienen! — Immanuel Kant

Ich bin freischaffender Softwareentwickler und freue mich über jedes neue Projekt. Kontaktinformation auf meiner Website.

Mein Blog | GitHub-Profil | Auf Twitter: @qquintilianus | PGP/GPG-Schlüssel: B1FE 958E D5E8 468E AA20 8F4B F1D8 799F BCC8 BC4F


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Prozeduren/Funktionen
BeitragVerfasst: 02 Feb 2014, 21:44 
Offline
Metaprogrammierer

Registriert: 20 Nov 2011, 21:51
Beiträge: 693
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.

_________________
Ubuntu Gnome 14.04 LTS
rvm mit App-spezifischer Ruby-Version (meist 2.2.x) und -Gemset

Github ProfilBitbucket Profil


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Prozeduren/Funktionen
BeitragVerfasst: 03 Feb 2014, 12:15 
Offline
Interpreter
Benutzeravatar

Registriert: 18 Sep 2008, 22:32
Beiträge: 1821
Wohnort: NRW → UN
Danke für die Korrektur. Da sieht man, dass ich diese Begrifflichkeiten so gut wie nie brauche...

Vale,
Quintus

_________________
Habe den Mut, dich deines eigenen Verstandes zu bedienen! — Immanuel Kant

Ich bin freischaffender Softwareentwickler und freue mich über jedes neue Projekt. Kontaktinformation auf meiner Website.

Mein Blog | GitHub-Profil | Auf Twitter: @qquintilianus | PGP/GPG-Schlüssel: B1FE 958E D5E8 468E AA20 8F4B F1D8 799F BCC8 BC4F


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Prozeduren/Funktionen
BeitragVerfasst: 03 Feb 2014, 12:50 
Offline
Metaprogrammierer

Registriert: 20 Nov 2011, 21:51
Beiträge: 693
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 ;)

_________________
Ubuntu Gnome 14.04 LTS
rvm mit App-spezifischer Ruby-Version (meist 2.2.x) und -Gemset

Github ProfilBitbucket Profil


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Prozeduren/Funktionen
BeitragVerfasst: 03 Feb 2014, 19:41 
Offline
Schüler

Registriert: 15 Jan 2014, 22:22
Beiträge: 24
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!


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Prozeduren/Funktionen
BeitragVerfasst: 03 Feb 2014, 19:56 
Offline
Metaprogrammierer

Registriert: 20 Nov 2011, 21:51
Beiträge: 693
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!

_________________
Ubuntu Gnome 14.04 LTS
rvm mit App-spezifischer Ruby-Version (meist 2.2.x) und -Gemset

Github ProfilBitbucket Profil


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Prozeduren/Funktionen
BeitragVerfasst: 03 Feb 2014, 21:10 
Offline
Interpreter
Benutzeravatar

Registriert: 21 Mai 2007, 11:30
Beiträge: 1283
Wohnort: Thüringen
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!


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Prozeduren/Funktionen
BeitragVerfasst: 03 Feb 2014, 22:58 
Offline
Schüler

Registriert: 15 Jan 2014, 22:22
Beiträge: 24
Danke für die super Erklärung :).


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Prozeduren/Funktionen
BeitragVerfasst: 04 Feb 2014, 11:15 
Offline
Metaprogrammierer

Registriert: 20 Nov 2011, 21:51
Beiträge: 693
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

_________________
Ubuntu Gnome 14.04 LTS
rvm mit App-spezifischer Ruby-Version (meist 2.2.x) und -Gemset

Github ProfilBitbucket Profil


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach: