Ausdruck &:

Hallo zusammen,

habe in einem Tutorial folgenden Ausdruck gesehen:

&:login

Was bedeutet der Ausdruck?

Danke

Hallo,

das ist eines der kleinen Ruby-Wunder, die den Tag schöner machen.

Warum selbst erklären, wenn das andere schon getan haben:
http://www.ruby-mine.de/2006/3/7/symbol-to_proc-ruby-funktional

Viele
Grüße
Gregor

2008/2/29 Guido P. [email protected]:

Hallo,

das sollte dir weiterhelfen

http://blog.hasmanythrough.com/2006/3/7/symbol-to-proc-shorthand

Gruß,
Tom

“GP” == Guido P. [email protected] writes:

GP> Hallo zusammen,

GP> habe in einem Tutorial folgenden Ausdruck gesehen:

GP> &:login

GP> Was bedeutet der Ausdruck?

Ja, also das muss man (ganz wie z.B. lateinische Sätze) teilen.

Und in welche?

‘:login’ ist ein Symbol, also das mit dem ‘:’ vor Literalen, das kennst
du schon.
Vermutlich tauchte im Umfeld deines Konstrukts die Methode ‘login’ auf,
aber …

… der “Adress-Operator” ‘&’ lässt sich halt nicht auf Methoden sondern
auf Symbole und Blöcke anwenden,
hier eben auf ein Symbol.
Und zu dem Symbol wird bei Anwendung des Adress-Operators wieder eine
passende Methode gesucht.
(Tja, sorry, ich kann ja auch nix
dafür.)Wahrscheinlich deswegen auch der wahnsinnige Geschwindigkeitsverlust,
von dem in einem der zitierten Blog-Artikel die Rede ist.
Das mit dem “passen” impliziert halt schon eine (anscheinend recht
teure) Suche.

Wie ich dazu komme, das Ampersand “Adress-Operator” zu nennen?
Sorry, aber meine 3. oder 4. Programmier-Sprache hieß “C”,
und manch einer weiß das ja vielleicht,
das ist die Programmier-Sprache, in der “MRI” aka “Matz’s own Ruby
Interpreter” implementiert ist.

Wenn man in C von irgend etwas die Adresse bekommen will,
dann setzt man das Ampersand davor.
Das macht man mit Variablen oder Unterprogrammen.
Auf diese Weise kann man Variablen an Unterprogramme “per reference”
übergeben statt wie gewöhnlich “per value”,
oder man benutzt es, um ein Unterprogramm z.B. als Event-Handler oder so
irgendwohin zu übergeben,
weil die Sache mit den Event-Handlern anders schwer auszudrücken ist.

Und weil Matz C schon auch irgendwie ziemlich gut kennen muss
(sonst hätte er ja MRI nicht bauen können)
stolpert er eben regelmäßig über den C-Adress-Operator und brachte den
irgendwie in Ruby unter.

Für ihn war das sicherlich nicht ganz so berauschend wie für die Jungs aus der
“generation Java” mit ihren tollen bunten hier zitierten Blogs,
welche bei der Erklärung zu ‘&’ im 7. oder so Ruby-Himmel angelangt waren
und dort dann ganz aus dem Häuschen waren über das Ruby-Wunder.

ROTFL

Im Inhaltsverzeichnis von ruby3 (s.u.) fand ich übrigens diesen Eintrag:

& (block parameter to method)
  ...

Ja, nicht ganz so kompakt ausgedrückt wie “Adress-Operator”.

Und noch einmal aus diesem Buch, und zwar ein Beispiel mitsamt URL:

http://media.pragprog.com/titles/ruby3/code/samples/language_56.rb

#---
# Excerpted from "Programming Ruby",
# published by The Pragmatic Bookshelf.
# Copyrights apply to this code. It may not be used to create 

training material,
# courses, books, articles, and the like. Contact us if you are in
doubt.
# We make no guarantees that this code is fit for any purpose.
# Visit http://www.pragmaticprogrammer.com/titles/ruby3 for more
book information.
#—
def some_method
yield
end

  some_method { }
  some_method do
  end

  a_proc = lambda { 99 }
  some_method(&a_proc)

“Hope this helps.”

J.

Übrigens ein Standard-Bestandteil von Ruby 1.9:

Stefan

Stefan T., Stefan Tilkov’s Blog [Stefan Tilkov’s Blog]

Hallo Jochen,

Für ihn war das sicherlich nicht ganz so berauschend wie für die Jungs aus der “generation Java” mit ihren tollen bunten hier zitierten Blogs,
welche bei der Erklärung zu ‘&’ im 7. oder so Ruby-Himmel angelangt waren
und dort dann ganz aus dem Häuschen waren über das Ruby-Wunder.

ROTFL

Für mich ist ein & in C nicht berauschend. Und ein & vor einem Block
kann mich auch nicht schocken. Was ich als “Ruby Wunder” bezeichnet
habe, ist, dass es möglich ist, ein & vor ein Symbol zu schreiben und
es eine dafür sinnvolle Anwendung gibt. Dieses Feature war in Standard
Ruby 1.8 nicht vorgesehen. Aber es war/ist möglich diese
Funktionalität in Ruby zu implementieren und zu nutzen - ohne
Erweiterung des Compilers, des Interpreters oder der VM.

Dass Ruby eine Sprache ist, die diese Form von Erweiterung erlaubt,
finde ich schön. Das ist es, was Anfänger in Ruby staunen lässt. Das
ist es, was Meta-Magic genannt wird. Und das findet man in Java nicht.
In wiefern das in C funktioniert, ohne dass es so kryptisch aussieht,
wie es implementiert ist, kann ich nicht sagen, dafür habe ich
tatsächlich zu wenig mit C gearbeitet.

Ich würde auch nicht sagen, dass Symbol#to_proc beim ersten Mal lesen
eine offensichtlichste Anwendung darstellt. Aber es ist
fürdenjenigen, der es einmal verstanden hat, eine sehr schöne Möglichkeit
Dinge kompakt auszudrücken. So, wie interne Iteratoren wesentlich
kompakter und weniger fehleranfällig sind (beim Hinschreiben) als eine
simple for-Schleife. Und auch interne Iteratoren sind nicht sofort
klar, für den Pascal-/C-/Java-Programmierer.

Über Performance mag ich nicht diskutieren.

Ich hoffe, ich konnte meine Intentionen besser verständlich machen.

Viele
Grüße
Gregor