Tôi muốn để có thể làm điều này:Scala - thêm unapply để int
scala> val Int(i) = "1"
i: Int = 1
Nhưng Int
không có một phương pháp unapply
.
Tôi đã tìm thấy this answer cung cấp hướng dẫn về cách thêm ngầm một phương thức vào đối tượng hiện có, vì vậy tôi đã dùng thử. Giải pháp mà họ đưa ra cho công trình, nhưng không may là không phù hợp với mẫu. Dưới đây là những gì tôi có:
object UnapplyInt {
val IntRE = """^(\d+)$""".r
def unapply(v: String): Option[Int] = v match {
case IntRE(s) => Some(s.toInt)
case _ => None
}
}
implicit def int2unapplyInt(objA: Int.type) = UnapplyInt
Những trường hợp thử nghiệm đều tốt:
val UnapplyInt(i) = "1" // pattern matching with unapply is fine
val i = Int.unapply("1").get // implicit conversion is fine
Nhưng người tôi muốn thất bại:
scala> val Int(i) = "1"
<console>:10: error: object Int is not a case class constructor, nor does it have an unapply/unapplySeq method
val Int(i) = "1"
^
Nếu các công trình chuyển đổi ngầm và mô hình phù hợp với unapply
công trình, tại sao Scala không đặt hai thứ này lại với nhau để phù hợp với mô hình ngầm?
Ha! Giải pháp được đề xuất của bạn là những gì tôi đang sử dụng hiện tại. Tôi không hoàn toàn hài lòng với nó bởi vì nó đòi hỏi phải có hai không gian tên khác nhau, có nghĩa là tôi không thể có 'Int.MaxValue' và' val Int (i) = "5" 'trong cùng một vị trí. – dhg
@dhg Đúng. Và bây giờ tôi nghĩ nhiều hơn về nó, tôi nghĩ lý do trong câu trả lời của tôi không hoàn toàn đúng. Lý do thực sự là các biểu thức mẫu không thể giống như các biểu thức thông thường vì Scala phải xác định thứ gì là các nhà xây dựng và biến là gì ... – Owen
Bạn mất tôi ở phần cuối cùng đó. – dhg