Trong Scala, các biểu thức bạn mô tả có nghĩa là một phương pháp gọi là ?
được gọi trên một đối tượng có tên là some
. Thường xuyên, các đối tượng không có phương thức được gọi là ?
. Bạn có thể tạo chuyển đổi tiềm ẩn của riêng mình thành đối tượng có phương thức ?
để kiểm tra null
ness.
implicit def conversion(x: AnyRef) = new {
def ? = x ne null
}
Ý chí trên, trong bản chất, chuyển đổi bất kỳ đối tượng mà bạn gọi phương thức ?
vào biểu hiện ở phía bên tay phải của phương pháp conversion
(mà không có phương pháp ?
). Ví dụ, nếu bạn làm điều này:
"".?
trình biên dịch sẽ phát hiện rằng một đối tượng String
không có phương pháp ?
, và viết lại nó vào:
conversion("").?
Illustrated trong một thông dịch viên (lưu ý rằng bạn có thể bỏ qua .
phương pháp khi kêu gọi các đối tượng):
scala> implicit def any2hm(x: AnyRef) = new {
| def ? = x ne null
| }
any2hm: (x: AnyRef)java.lang.Object{def ?: Boolean}
scala> val x: String = "!!"
x: String = "!!"
scala> x ?
res0: Boolean = true
scala> val y: String = null
y: String = null
scala> y ?
res1: Boolean = false
Vì vậy, bạn có thể viết:
if (some ?) {
// ...
}
Hoặc bạn có thể tạo ra một chuyển đổi ngầm vào một đối tượng với một phương pháp ?
đó gọi phương thức cụ thể về đối tượng nếu đối số không phải là null
- làm điều này:
scala> implicit def any2hm[T <: AnyRef](x: T) = new {
| def ?(f: T => Unit) = if (x ne null) f(x)
| }
any2hm: [T <: AnyRef](x: T)java.lang.Object{def ?(f: (T) => Unit): Unit}
scala> x ? { println }
!!
scala> y ? { println }
để bạn có thể sau đó viết:
some ? { _.toString }
Building (đệ quy) về câu trả lời soc, bạn có thể mô hình phù hợp trên x
trong các ví dụ trên để tinh chỉnh những gì ?
d oes tùy thuộc vào loại x
. : D
IMO, câu trả lời của Daniel dưới đây là phù hợp nhất. Scala đã có rất nhiều hỗ trợ để xử lý các giá trị có khả năng trống - tốt hơn là tìm hiểu và sử dụng nó hơn là tạo một cú pháp '?' Mới với hàm ý. – Bill
Một lý do để đi với 'null' thay vì' None 'có thể là hiệu suất/sử dụng bộ nhớ - bạn có thể thích phân bổ một đối tượng ngắn ngủi từ chuyển đổi ngầm trên bay thay vì giữ một trình bao bọc' Option'. Cấp, không nhiều người viết mã hiệu năng cao trên JVM, nhưng tôi vẫn nói nó có các ca sử dụng của nó. – axel22