2011-01-09 30 views

Trả lời

25

Tên của các nhà điều hành là null-coalescing operator. Bài đăng trên blog ban đầu mà tôi liên kết với điều đó đã đề cập đến sự khác biệt trong việc hợp nhất giữa các ngôn ngữ không được thực hiện. Một so sánh mới hơn giữa C# và Ruby null coalescing có thể được tìm thấy here.

Nói tóm lại, bạn có thể sử dụng ||, như trong:

a_or_b = (a || b) 
+0

Liên kết hiện đã chết. – orourkedd

+0

@orourkedd Cảm ơn, tôi đã làm lại một chút với một liên kết mới. –

+2

Đây thực sự là một "nhà điều hành giả mạo". – Kelvin

12

Nếu bạn không nhớ coalescing sai, bạn có thể sử dụng || điều hành:

a = b || c 

Nếu sai có thể là một giá trị hợp lệ, bạn có thể làm:

a = b.nil? ? c : b 

đâu b được kiểm tra cho nil, và nếu nó là một được gán giá trị của c, và nếu không, b.

+0

Tôi đã thử 'a = b hoặc c; đặt a'. Bất ngờ, ngạc nhiên, trong ruby ​​1.8.6 của tôi, nó in giá trị của b.Lý do là 'hoặc' có mức ưu tiên thấp hơn' = ' – Shuo

+0

' hoặc' không phải là toán tử boolean mà là toán tử dòng điều khiển trong ruby: http://devblog.avdi.org/2010/08/02/using-and -and-or-in-ruby/ – orourkedd

+0

Thật không may đoạn thứ 2 có thể có tác dụng phụ nếu 'b' là một phương thức (tức là nó được gọi là hai lần). – Kelvin

3

Hãy lưu ý rằng Ruby có các tính năng cụ thể đối với thông thường không đồng bộ hóa với [] hoặc 0 hoặc 0.0.

Thay vì

x = y || [] # or... 
x = y || 0 

... bạn có thể (vì NilClass thực hiện chúng) chỉ làm ...

x = y.to_a # => [] or .. 
x = y.to_i # or .to_f, => 0 

Điều này làm cho một số mẫu thiết kế phổ biến như:

(x || []).each do |y| 

... trông đẹp hơn một chút:

x.to_a.each do |y| 
+1

Bạn cũng sẽ thường thấy đó là '[* x] .each do | y |'. –

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