2017-06-20 2 views
2
implicit class Interpolator(val a: StringContext) extends AnyVal { 
    def foo[A](args: Any*): A = ??? 
} 

val first = foo[String]"myString" // This does not parse 
val second = (new StringContext).foo[String]("myString") // This works but I'm wondering if there is a more concise syntax 
val third = foo"myString"[String] // This one is intriguing because it parses but the compiler outputs "method foo does not take type parameters"... what? 

Wenn A geschlossen werden kann, dann es ist alles gut, weil foo"myString" einfach funktionieren, aber wenn es nicht kann ich frage mich, ob es eine bessere ist Syntax als second zu spezifizieren, dass erlaubt mir, den Typparameter zu spezifizieren, den ich erwarte.Ist es möglich, Typ Parameter für String-Interpolation in Scala

Antwort

2

An zweiter Stelle nur kompilieren, aber es funktioniert nicht wirklich, können wir zum Beispiel versuchen

implicit class Interpolator(val a: StringContext) extends AnyVal { 
    def foo[A](args: Any*): A = args.head.asInstanceOf[A] 
} 

val a = 2 
val second = (new StringContext)foo[String]"a=$a" 
println(second)// this will print a=$a which is not the expected output 

Aber die folgenden sollte die Frage nicht wirklich beantworten, die Dies gilt

implicit class Interpolator[A](val a: StringContext) extends AnyVal { 
    def foo(args: Any*): A = args.head.asInstanceOf[A] 
} 

val a = 2 
val first :Int = foo"a=$a" // : Int is what that does the trick 
println(first) // will print 2 as expected 
+0

arbeiten ist, wie man Liefertargumente bei Verwendung der Stringinterpolatorsyntax. Obwohl das Verhalten des ersten Codebeispiels tatsächlich ungerade ist, gebe ich zu. – jedesah

+0

Weil ein neuer Interpolator für jeden Lauf von foo erstellt wird, dann liefern die Typargumente zu Interpolator dasselbe wie sie an foo liefern. In meinem Beispiel werden sie implizit geliefert ... (indem sie einem int val zugewiesen werden). Also ist es eine Antwort auf Ihre Frage, wenn ich etwas verpasse, können Sie ein Code-Beispiel liefern, so schlecht zu verstehen, was Sie versuchen zu tun? – oron

+0

Ich verstehe. Aber das Typargument muss noch gefolgert werden, weshalb ich frage: Wie kann es spezifiziert werden? Ich wünschte, es könnte einfach in dem Fall abgeleitet werden, mit dem ich es zu tun habe, da es die Dinge für mich viel einfacher machen würde, aber leider ist das nicht der Fall. Aber ich bin jetzt neugierig, warum sich das zweite Beispiel anders als das erste verhält? Was passiert im ersten Fall, um das unerwartete Ergebnis zu erzielen? – jedesah

Verwandte Themen