2014-06-12 15 views
15

Tôi mới vào grails tôi tìm thấy trong rất nhiều ví dụ rằng một biến có thể kết thúc với dấu chấm hỏi (?) như thế nàymục đích dấu chấm hỏi (?) Sau một biến trong Groovy

boolean equals(other) { 
    if(other?.is(this)) 
    return true 
} 

trên là gì code contains Nếu điều kiện trong trường hợp kia kết thúc bằng a? vì vậy tôi muốn biết ý nghĩa của đại diện đó

Trả lời

33

?. là một toán tử an toàn không được sử dụng để tránh NPE không mong muốn.

if (a?.b) { .. } 

là giống như

if (a != null && a.b) { .. } 

Nhưng trong trường hợp này is() đã là an toàn vô giá trị, do đó bạn sẽ không cần đến nó

other.is(this) 

nên được tốt.

+1

Tôi không quen với Groovy, nhưng 'other.is' hoạt động như thế nào nếu' other' là null? – chepner

+5

Câu hỏi hay. Việc triển khai 'is' nằm trong [DefaultGroovyMethods] (https://github.com/groovy/groovy-core/blob/master/src/main/org/codehaus/groovy/runtime/DefaultGroovyMethods.java#L179) trong đó người gọi và callee được đại diện bởi param cho phương pháp này và sau đó kiểm tra đối tượng tham chiếu bình đẳng, do đó, không có hoạt động được thực hiện trên người gọi. – dmahapatro

+0

NPE = 'NullPointerException' – StockB

3

Có một sự tinh tế của ?., số Safe navigation operator, không được đề cập trong câu trả lời của @ dmahapatro.

Hãy để tôi đưa ra một ví dụ:

def T = [test: true] 
def F = [test: false] 
def N = null 

assert T?.test == true 
assert F?.test == false 
assert N?.test == null // not false! 

Nói cách khác, a?.b cũng giống như a != null && a.b chỉ khi thử nghiệm cho một giá trị boolean. Sự khác biệt là người đầu tiên có thể đánh giá là a.b hoặc null, trong khi người thứ hai chỉ có thể là a.b hoặc false. Điều này quan trọng nếu giá trị của biểu thức được chuyển sang biểu thức khác.

Các vấn đề liên quan