ruby-mine

exploring the mine

String#to_proc

von cypher am 27.10.2007 (21 Uhr)

Rails hat Symbol#to_proc populär gemacht. So sehr dass es sogar Teil von Ruby 1.9 werden wird.

Und jetzt hat Reginald Braithwaite String#to_proc implementiert. Das sieht folgendermassen aus:
'x+1'.to_proc[2] # => 3
'x+2*y'.to_proc[2, 3] # => 8


Zugegeben, da wo jetzt Symbol#to_proc verwendet wird, braucht man String#to_proc nicht. Verglichen mit
%w[dsf fgdg fg].map(&:capitalize)
liest sich
%w[dsf fgdg fg].map(&'.capitalize')
nicht wirklich besser.

Aber was wenn wir noch keine entsprechende Methode haben? Z.B. um alle Werte in einer Liste mit zwei zu Multiplizieren?
(1..5).map &'*2' # => [2, 4, 6, 8, 10]
Oder eine Liste reduzieren:
(1..5).inject &'+' # => 15


Der Source Code für diesen nützlichen Hack steht unter der MIT Licence, und Herr Braithwaite hat auf seinem Blog natürlich einen (englischen) Eintrag wo er das ganze näher erklärt: String#to_proc


Kommentar schreiben

Name (notwendig)

Mail (wird nicht veröffentlicht)

Webseite


Kommentare

  1. WoNáDo schrieb am 28.10.2007 (00 Uhr)

    Ich sehe da noch eine ganz andere Richtung, in die das mal führen könnte - aus meiner Sicht endlich. Bisher habe ich ja noch nicht die Möglichkeit Ruby-Code zu manipulieren. Das meine ich in dem Sinne, dass ich nur durch ziemlich trickreiches Vorgehen an den Quellcode eine Methode oder Funktion (=Proc-Obkject) herankomme. Hier habe ich mir oft schon die Möglichkeiten gewünscht, die mir Lisp 1.5 mal geboten hat - selbstmodifizierende Programme waren da kein Problem. Ruby hatte ja auch mal angefangen in diese Richtung zu denken. Mal sehen was da noch weiter kommt.

  2. waffeln schrieb am 28.10.2007 (12 Uhr)

    Für die Kurzbeispiele reichts: class String def to_proc eval(" lambda { |#{scan(/[^a-zA-Z]*([a-zA-Z])[^a-zA-Z]*/).uniq.join(',')}| eval(self) } ") end end