Khi một trong hai bên của ==
lànull
hoặc nếu toán hạng đầu tiên của ==
đánh giá để null, sau đó Scala sẽ không gọi equals
. Vì vậy, trong trường hợp này, có, x == null
giống như x eq null
; phương pháp equals
là không phải là được gọi. Chú ý đến các trường hợp dưới đây.
Hãy xem xét điều này:
class X {
// this is just for testing
// any equals that returns true when the other object is null
// is arguably broken. thus even though it may be invoked
// the end semantics should remain the same
override def equals(x: Any) = true
}
var x = new X()
x == null // false -- compiler optimization?
null == x // false
var y = null
y == x // false -- see documentation below, y is null, x is not
x == y // true -- x does not evaluate to null, equals invokes
x eq y // false
Và lưu ý rằng:
(new X()) == null
Kết quả trong một cảnh báo nói rằng một "một đối tượng tươi" sẽ không bao giờ bằng nhau (để null).
Tôi nghi ngờ có thể có nhiều hơn một chút/mã khác được phát ra cho x == y
hơn x == null
(trong trường hợp phải bằng lệnh), nhưng chưa được kiểm tra.
Mã hóa vui vẻ.
Mục 6.3 (The Null Value) của Scala Language Specification đã cho biết:
Giá trị null là loại scala.Null, và do đó tương thích với tất cả các tài liệu tham khảo kiểu. Nó biểu thị một giá trị tham chiếu liên quan đến một đối tượng “null” đặc biệt. Đây đối tượng thực hiện phương pháp trong lớp scala.AnyRef như sau:
- [null] eq (x) và [null] == (x) trả về true khi và chỉ khi tham số x cũng là đối tượng “vô giá trị”.
- ne (x) và! = (X) trả về true iff đối số x cũng không phải là đối tượng “rỗng”.
- isInstanceOf [T] luôn trả về false.
- asInstanceOf [T] trả về đối tượng “rỗng” nếu T tuân theo scala.AnyRef và ném NullPointerException theo cách khác.
Tham chiếu đến bất kỳ thành viên nào khác của đối tượng “rỗng” sẽ gây ra một lỗi NullPointerException.
Nguồn
2011-08-14 06:08:43
Nhưng để so sánh với 'null', có sự khác biệt nào không? Tôi có thể sử dụng 'null == last' ở đây không? – Freewind