मैं एक समाधान है कि के बारे में के रूप में सरल रूप में आप प्राप्त कर सकते हैं देने के लिए जा रहा हूँ प्रकार सुरक्षा (कोई क्रम अपवाद नहीं, कोई क्रम प्रतिबिंब, आदि) के बारे में कुछ उचित की कमी को देखते हुए सामान्य व्युत्पत्ति के लिए Shapeless का उपयोग कर:
import scala.util.Try
import shapeless._
trait Creator[A] { def apply(s: String): Option[A] }
object Creator {
def create[A](s: String)(implicit c: Creator[A]): Option[A] = c(s)
def instance[A](parse: String => Option[A]): Creator[A] = new Creator[A] {
def apply(s: String): Option[A] = parse(s)
}
implicit val stringCreate: Creator[String] = instance(Some(_))
implicit val intCreate: Creator[Int] = instance(s => Try(s.toInt).toOption)
implicit val doubleCreate: Creator[Double] =
instance(s => Try(s.toDouble).toOption)
implicit val hnilCreator: Creator[HNil] =
instance(s => if (s.isEmpty) Some(HNil) else None)
private[this] val NextCell = "^([^,]+)(?:,(.+))?$".r
implicit def hconsCreate[H: Creator, T <: HList: Creator]: Creator[H :: T] =
instance {
case NextCell(cell, rest) => for {
h <- create[H](cell)
t <- create[T](Option(rest).getOrElse(""))
} yield h :: t
case _ => None
}
implicit def caseClassCreate[C, R <: HList](implicit
gen: Generic.Aux[C, R],
rc: Creator[R]
): Creator[C] = instance(s => rc(s).map(gen.from))
}
निर्दिष्ट बिल्कुल के रूप में (हालांकि नोट करें कि मान Option
में लिपटे रहे हैं प्रतिनिधित्व करने के लिए इस काम तथ्य यह है कि टी वह आपरेशन को पार्स असफल हो सकता है):
scala> case class Person(name: String, age: Double)
defined class Person
scala> case class Book(title: String, author: String, year: Int)
defined class Book
scala> case class Country(name: String, population: Int, area: Double)
defined class Country
scala> val amy = Creator.create[Person]("Amy,54.2")
amy: Option[Person] = Some(Person(Amy,54.2))
scala> val fred = Creator.create[Person]("Fred,23")
fred: Option[Person] = Some(Person(Fred,23.0))
scala> val hamlet = Creator.create[Book]("Hamlet,Shakespeare,1600")
hamlet: Option[Book] = Some(Book(Hamlet,Shakespeare,1600))
scala> val finland = Creator.create[Country]("Finland,4500000,338424")
finland: Option[Country] = Some(Country(Finland,4500000,338424.0))
यहाँ Creator
एक प्रकार वर्ग कि सबूत नहीं है कि हम किसी दिए गए प्रकार में एक स्ट्रिंग पार्स कर सकते हैं प्रदान करता है। हमें String
, Int
इत्यादि जैसे मूल प्रकारों के लिए स्पष्ट उदाहरण प्रदान करना होगा, लेकिन हम केस वर्गों के लिए जेनेरिक रूप से उदाहरण प्राप्त करने के लिए बेकार का उपयोग कर सकते हैं (मानते हैं कि हमारे पास उनके सभी सदस्य प्रकारों के लिए Creator
उदाहरण हैं)।
यह बहुत अच्छा ट्रैविस है! क्या आप इस नोटेशन को थोड़ा सा निर्माता [एच :: टी] 'समझा सकते हैं? मैं यहां किस प्रकार पढ़ूं? – marios
यह पढ़ता है "एचएलिस्ट जिसका सिर एच प्रकार का है और जिसका पूंछ प्रकार टी है"। टी या तो एक और प्रकार का स्तर विपक्ष (एच 2 :: टी 2) या एचएनआईएल यह इंगित करने के लिए है कि उस सूची में कोई और मूल्य नहीं है। –
धन्यवाद निकोलस। एचएलआईस्ट एक बेकार निर्माण है? – marios