scala - कैसे विधि बनाने के लिए इनपुट के रूप में एक ही सामान्य वापसी?




generics type-conversion (2)

मैं कॉमा द्वारा सीमांकित एक स्ट्रिंग को विभाजित करना चाहता हूं और परिणाम को Seq या Set रूप में उपयोग करता हूं:

def splitByComma(commaDelimited: String): Array[String]
  = commaDelimited.trim.split(',')

def splitByCommaAsSet(commaDelimited: String): Set[String]
  = splitByComma(commaDelimited).toSet

def splitByCommaAsSeq(commaDelimited: String): Seq[String]
  = splitByComma(commaDelimited).toSeq

val foods = "sushi,taco,burrito"
val foodSet = splitByCommaAsSet(foods)
// foodSet: scala.collection.immutable.Set[String] = Set(sushi, taco, burrito)
val foodSeq = splitByCommaAsSeq(foods)
// foodSeq: Seq[String] = List(sushi, taco, burrito)

हालांकि, यह काफी दोहरावदार है। आदर्श रूप से, मैं genericSplitByComma[Set](foods) जैसा कुछ चाहता हूं जो genericSplitByComma[Set](foods) पास करने पर सिर्फ एक Set लौटाता है और जब मैं Seq पास करता हूं तो एक Seq लौटाता है।


@ KrzysztofAtłasik का जवाब Scala 2.12 लिए शानदार काम करता है।
यह 2.13 लिए एक समाधान है। (यह पूरी तरह से निश्चित नहीं है कि यह सबसे अच्छा तरीका है)

import scala.collection.Factory
import scala.language.higherKinds

def splitByComma[C[_]](commaDelimited: String)(implicit f: Factory[String, C[String]]): C[String] =
  f.fromSpecific(commaDelimited.split(","))
  // Or, as Dmytro stated, which I have to agree looks better.
  commaDelimited.split(",").to(f)

जिसका उपयोग आप इस तरह कर सकते हैं:

splitByComma[Array]("hello,world!")
// res: Array[String] = Array(hello, world!)

splitByComma[Set]("hello,world!")
// res: Set[String] = Set(hello, world!)

splitByComma[List]("hello,world!")
// res: List[String] = List(hello, world!)

इसके लिए एक सरल उपाय है। अनुरोधित सिंटैक्स नहीं, बल्कि संक्षिप्त रूप में और यह 2.13 संगत होना चाहिए।

def simpleSplitByComma(coll :Iterable[String]) =
  coll.flatMap(_.trim.split(","))

simpleSplitByComma(Set("hello,world"))          //res0: Set(hello, world)
simpleSplitByComma(Seq("bellow,world"))         //res1: List(bellow, world)
simpleSplitByComma(Array("fellow,old"))         //res2: ArrayBuffer(fellow, old)
simpleSplitByComma(Stream("end,of,the,world"))  //res3: Stream(end, ?)






scala-collections