Tôi đã viết một trình phân tích cú pháp để biến đổi một Chuỗi thành một Seq [Chuỗi] theo một số quy tắc. Điều này sẽ được sử dụng trong thư viện.Chuyển đổi một Seq [Chuỗi] thành một kiểu chữ theo cách an toàn
Tôi đang cố chuyển đổi Seq [Chuỗi] này thành một kiểu chữ. Lớp trường hợp sẽ được cung cấp bởi người dùng (vì vậy không có cách nào để đoán nó sẽ là gì).
Tôi đã nghĩ đến thư viện bất ổn vì nó dường như để thực hiện các tính năng tốt và có vẻ như trưởng thành, nhưng tôi không có ý tưởng làm thế nào để tiến hành.
Tôi đã tìm thấy câu hỏi này with an interesting answer nhưng tôi không tìm thấy cách chuyển đổi nó cho nhu cầu của mình. Thật vậy, trong câu trả lời chỉ có một kiểu để phân tích cú pháp (String), và thư viện lặp lại bên trong String. Nó có thể đòi hỏi một sự thay đổi sâu sắc trong cách mọi thứ được thực hiện, và tôi không có đầu mối như thế nào.
Hơn nữa, nếu có thể, tôi muốn làm cho quy trình này trở nên dễ dàng nhất có thể cho người dùng thư viện của tôi. Vì vậy, nếu có thể, không giống như câu trả lời trong liên kết ở trên, kiểu HList sẽ được đoán từ chính lớp vỏ (tuy nhiên theo tìm kiếm của tôi, có vẻ như trình biên dịch cần thông tin này).
Tôi hơi mới với hệ thống kiểu và tất cả những điều tuyệt đẹp này, nếu có ai có thể cho tôi lời khuyên về cách làm, tôi sẽ rất hạnh phúc!
Kind Regards
--- EDIT ---
Như ziggystar yêu cầu, đây là một số có thể có của các chữ ký cần thiết:
//Let's say we are just parsing a CSV.
@onUserSide
case class UserClass(i:Int, j:Int, s:String)
val list = Seq("1,2,toto", "3,4,titi")
// User transforms his case class to a function with something like:
val f = UserClass.curried
// The function created in 1/ is injected in the parser
val parser = new Parser(f)
// The Strings to convert to case classes are provided as an argument to the parse() method.
val finalResult:Seq[UserClass] = parser.parse(list)
// The transfomation is done in two steps inside the parse() method:
// 1/ first we have: val list = Seq("1,2,toto", "3,4,titi")
// 2/ then we have a call to internalParserImplementedSomewhereElse(list)
// val parseResult is now equal to Seq(Seq("1", "2", "toto"), Seq("3","4", "titi"))
// 3/ finally Shapeless do its magick trick and we have Seq(UserClass(1,2,"toto"), UserClass(3,4,"titi))
@insideTheLibrary
class Parser[A](function:A) {
//The internal parser takes each String provided through argument of the method and transforms each String to a Seq[String]. So the Seq[String] provided is changed to Seq[Seq[String]].
private def internalParserImplementedSomewhereElse(l:Seq[String]): Seq[Seq[String]] = {
...
}
/*
* Class A and B are both related to the case class provided by the user:
* - A is the type of the case class as a function,
* - B is the type of the original case class (can be guessed from type A).
*/
private def convert2CaseClass[B](list:Seq[String]): B {
//do something with Shapeless
//I don't know what to put inside ???
}
def parse(l:Seq[String]){
val parseResult:Seq[Seq[String]] = internalParserImplementedSomewhereElse(l:Seq[String])
val finalResult = result.map(convert2CaseClass)
finalResult // it is a Seq[CaseClassProvidedByUser]
}
}
Bên trong thư viện một số tiềm ẩn sẽ có sẵn cho chuyển đổi String thành kiểu chính xác khi chúng được đoán bởi Shapeless (tương tự như câu trả lời được đề xuất trong liên kết ở trên). Giống như string.toInt, string.ToDouble, v.v ...
Có thể có cách khác để thiết kế nó. Nó chỉ là những gì tôi có trong tâm trí sau khi chơi với Shapeless vài giờ.
Bạn có thể đăng mã minh họa những gì bạn mong đợi cuối cùng không? Chỉ chữ ký phương thức sẽ ổn thôi. Có thể chú thích chúng bằng 'thư viện' và' người dùng'. – ziggystar
Bạn có thể đưa ra một ví dụ về một cuộc gọi đến convert2CaseClass và cũng phân tích cú pháp và kết quả sẽ là gì? –
@DidierDupont Tôi đã thêm một số triển khai có thể có vào thư viện theo yêu cầu. Kết quả phải là danh sách các lớp chữ hoa chữ thường. Seq [String] -> Seq [Seq [String]] -> Seq [trường hợp lớp]. Chuyển đổi đầu tiên đã được mã hóa. Cái thứ hai là nơi tôi cần giúp đỡ. – pommedeterresautee