35 Stimmen

Wie erhält man eine Methodenliste in Scala

In Sprachen wie Python und Ruby können Sie die Sprache fragen, welche indexbezogenen Methoden ihre Stringklasse unterstützt (die Namen der Methoden enthalten das Wort "index")

“”.methods.sort.grep /index/i

Und in java

List results = new ArrayList();  
Method[] methods = String.class.getMethods();  
for (int i = 0; i < methods.length; i++) {  
    Method m = methods[i];  
    if (m.getName().toLowerCase().indexOf(“index”) != -1) {  
        results.add(m.getName());  
    }  
}  
String[] names = (String[]) results.toArray();  
Arrays.sort(names);  
return names;  

Wie würden Sie dasselbe in Scala tun?

1 Stimmen

Ich glaube, ich habe es gefunden "wow".getClass.getMethods.toList.map(m => m.getName).sort((a, b) => (a compareTo b) < 0 ).filter( s => s.matches("index(.*)"))

6 Stimmen

Nur so aus Neugier: Was werden Sie mit diesen Methodennamen machen, wenn Sie sie einmal haben? Wenn es darum geht, dass Sie wissen, was Sie als nächstes in einer interaktiven Umgebung eingeben können, bietet die Scala REPL eine gute Tabulatorvervollständigung. Probieren Sie es aus.

0 Stimmen

Ausgezeichneter Tipp, Randall! Aus irgendeinem Grund habe ich noch nie daran gedacht, es zu versuchen...

51voto

Daniel C. Sobral Punkte 290004

Seltsam, dass niemand eine direktere Übersetzung versucht hat:

""
.getClass.getMethods.map(_.getName) // methods
.sorted                             // sort
.filter(_ matches "(?i).*index.*")  // grep /index/i

Also, ein paar zufällige Gedanken.

  • Der Unterschied zwischen "Methoden" und den obigen Reifen ist frappierend, aber niemand hat je behauptet, dass Reflexion die Stärke von Java ist.

  • Ich verheimliche etwas über sorted oben: Sie nimmt einen impliziten Parameter des Typs Ordering . Wenn ich die Methoden selbst und nicht ihre Namen sortieren wollte, müsste ich das selbst tun.

  • A grep ist eigentlich eine Kombination aus filter y matches . Es ist etwas komplizierter, weil Java entschieden hat, ganze Zeichenketten abzugleichen, auch wenn ^ y $ sind nicht spezifiziert. Ich denke, es wäre sinnvoll, eine grep Methode auf Regex , die die Traversable als Parameter, aber...

Wir könnten also Folgendes tun:

implicit def toMethods(obj: AnyRef) = new { 
  def methods = obj.getClass.getMethods.map(_.getName)
}

implicit def toGrep[T <% Traversable[String]](coll: T) = new {
  def grep(pattern: String) = coll filter (pattern.r.findFirstIn(_) != None)
  def grep(pattern: String, flags: String) = {
    val regex = ("(?"+flags+")"+pattern).r
    coll filter (regex.findFirstIn(_) != None)
  }
}

Und jetzt ist dies möglich:

"".methods.sorted grep ("index", "i")

0 Stimmen

Das ist fast das, was der OP hatte, bis auf das "sortiert" Verwenden Sie 2.8?

0 Stimmen

@Oscar Ja, das ist 2.8. Auf Scala 2.7 gibt es sort , aber nicht bei allen Sammlungen.

1 Stimmen

Das ist nicht wirklich dasselbe - in Ruby x.methods enthält Methoden, die über Mixins zugänglich sind, während x.getClass.getMethods nicht in Scala. Versuchen Sie 1.methods in Ruby und versuchen Sie dann 1.getClass.getMethods in Scala.

12voto

170730350 Punkte 546

Sie können die scala REPL-Eingabeaufforderung verwenden. Um beispielsweise die Methoden eines String-Objekts aufzulisten, geben Sie "". ein und drücken Sie dann die TAB-Taste (das ist eine leere Zeichenkette - oder sogar eine nicht leere, wenn Sie möchten, gefolgt von einem Punkt und dann TAB). Das REPL listet Ihnen alle Methoden der Mitglieder auf.

Dies gilt auch für andere Variablentypen.

5voto

sblundy Punkte 59298

Mehr oder weniger auf dieselbe Weise:

val names = classOf[String].getMethods.toSeq.
    filter(_.getName.toLowerCase().indexOf(“index”) != -1).
    map(_.getName).
    sort(((e1, e2) => (e1 compareTo e2) < 0))

Aber alles auf einer Linie.

Um die Lesbarkeit zu verbessern,

val names = for(val method <- classOf[String].getMethods.toSeq
    if(method.getName.toLowerCase().indexOf("index") != -1))
    yield { method.getName }
val sorted = names.sort(((e1, e2) => (e1 compareTo e2) < 0))

3voto

OscarRyz Punkte 189898

Weiter bin ich nicht gekommen:

"".getClass.getMethods.map(_.getName).filter( _.indexOf("in")>=0)  

Es ist seltsam Scala Array hat keine Sortiermethode.

bearbeiten

Es würde so enden.

"".getClass.getMethods.map(_.getName).toList.sort(_<_).filter(_.indexOf("index")>=0)

0 Stimmen

ClassOf[String].getMethods.toList.map(_.getName).sort( _ < _ ).filter( _.matches("index(.*)")) Dies ist das Ergebnis

0 Stimmen

Dort steht: Warnung: Es gab Verwerfungswarnungen; wiederholen Sie den Lauf mit -deprecation für Details und gibt mir eine leere Liste

1 Stimmen

scala.Array werden implizit umgewandelt in scala.collection.mutable.WrappedArray mit den Methoden sortBy y sortWith . Siehe die scaladocs: goo.gl/5pJD

3voto

OscarRyz Punkte 189898

Warten Sie einen Moment.

Ich gebe zu, dass Java im Vergleich zu Ruby zum Beispiel sehr langatmig ist.

Aber dieses Stück Code hätte von vornherein nicht so langatmig sein dürfen.

Hier ist die Entsprechung:

    Collection<String> mds = new TreeSet<String>();
    for( Method m : "".getClass().getMethods()) {
        if( m.getName().matches(".*index.*")){  mds.add( m.getName() ); }
    }

die fast die gleiche Anzahl von Zeichen hat wie die als korrekt gekennzeichnete Scala-Version

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X