Option
đơn nguyên là một cách biểu cảm tuyệt vời để đối phó với những thứ gì đó hoặc không có gì trong Scala. Nhưng điều gì sẽ xảy ra nếu người ta cần phải đăng nhập một tin nhắn khi "không có gì" xảy ra? Theo tài liệu Scala API,Sử dụng Hoặc để xử lý các lỗi trong mã Scala
Các Hoặc loại thường được sử dụng như một sự thay thế cho scala.Option nơi trái đại diện cho thất bại (theo quy ước) và phải là giống như một số.
Tuy nhiên, tôi không có may mắn để tìm các phương pháp hay nhất bằng cách sử dụng Ví dụ thực tế hoặc thực tế tốt liên quan đến việc xử lý lỗi. Cuối cùng tôi đã đi lên với đoạn mã sau cho dự án của riêng tôi:
def logs: Array[String] = {
def props: Option[Map[String, Any]] = configAdmin.map{ ca =>
val config = ca.getConfiguration(PID, null)
config.properties getOrElse immutable.Map.empty
}
def checkType(any: Any): Option[Array[String]] = any match {
case a: Array[String] => Some(a)
case _ => None
}
def lookup: Either[(Symbol, String), Array[String]] =
for {val properties <- props.toRight('warning -> "ConfigurationAdmin service not bound").right
val logsParam <- properties.get("logs").toRight('debug -> "'logs' not defined in the configuration").right
val array <- checkType(logsParam).toRight('warning -> "unknown type of 'logs' confguration parameter").right}
yield array
lookup.fold(failure => { failure match {
case ('warning, msg) => log(LogService.WARNING, msg)
case ('debug, msg) => log(LogService.DEBUG, msg)
case _ =>
}; new Array[String](0) }, success => success)
}
(Xin lưu ý đây là một đoạn trích từ một dự án thực tế, vì vậy nó sẽ không biên dịch ngày của riêng mình)
Tôi muốn hãy biết ơn cách bạn đang sử dụng Either
trong mã của bạn và/hoặc các ý tưởng tốt hơn về việc tái cấu trúc mã ở trên.
Tôi có thể tìm thấy không đề cập đến bất cứ điều gì trong cuốn sách của Odersky. – skaffman
Có, tôi có "Lập trình trong Scala" và không thể tìm thấy bất kỳ đề cập đến Hoặc trong đó. Sự tương tự tốt nhất tôi biết là Box trong Liftweb được sử dụng cho mục đích mang theo thất bại - nó giống như Option, nhưng với chức năng bổ sung. –
Bất kỳ lựa chọn nào tốt hơn cho 'Tùy chọn [Hoặc [Foo, Bar]]'? – Jus12