2010-10-06 2 views

Trả lời

2

Tôi không tin rằng có một. Bạn có thể xem this bài đăng để thực hiện toán tử kết hợp rỗng.

10

Bạn có thể viết riêng của mình với ngữ nghĩa giống hệt nhau - đây là câu khẳng định cùng loại trong suốt quá trình đánh giá từ trái sang phải, nhưng có thể thay đổi thành?: Để có được đánh giá từ phải sang trái mở rộng các loại theo nhu cầu:

class CoalesceNull[A <: AnyRef](a: A) { def ??(b: A) = if (a==null) b else a } 
implicit def coalesce_anything[A <: AnyRef](a: A) = new CoalesceNull(a) 

scala> (null:String) ?? (null:String) ?? "(default value)" 
res0: String = (default value) 

Nhưng lý do tại sao điều hành này không tồn tại có thể là Option là cách ưa thích để đối phó với các tình huống như vậy cũng như nhiều trường hợp tương tự như xử lý các giá trị không tồn tại:

scala> List((null:String),(null:String),"(default value)").flatMap(Option(_)).headOption 
res72: Option[java.lang.String] = Some((default value)) 

(Nếu bạn là chắc chắn rằng ít nhất một là không null, bạn chỉ có thể sử dụng head; lưu ý rằng điều này hoạt động vì Option(null) chuyển đổi thành NoneflatMap chỉ tập hợp các mục nhập Some(_).)

+2

Tôi tin rằng nó nên là 'def ?? (b: => A)' để làm cho các ngữ nghĩa giống hệt nhau. Tôi nghĩ rằng phía bên phải của toán tử elvis không được đánh giá trừ khi 'a' là' null'. Có thể là sai mặc dù. – sinharaj

+0

@sinharaj - Có lẽ bạn đang đúng. Tôi không quen với cách C# làm điều này. –

3

Hãy thử getOrElse. Bạn tôi đề nghị.

+0

Không phải là toán tử thích hợp nhưng có thể thuận tiện cho các biểu thức đơn giản: 'Tùy chọn (null: Chuỗi) .getOrElse (" giá trị mặc định ")' hoặc 'Tùy chọn (Tùy chọn (null: Chuỗi) .getOrElse (null: String)). GetOrElse ("giá trị mặc định") ' – karmakaze

2

Xem câu trả lời được liên kết, nhưng, nhiều hơn vào vấn đề này, tránh các giá trị rỗng. Sử dụng tùy chọn.

1

This blog post bao gồm cách triển khai "Nhà điều hành Elvis ?:" của Groovy tại Scala. Điều này cũng giống như toán tử của C# '??'.