2015-05-29 19 views
6

Ai cũng có thể đặt ánh sáng lên biểu thức này. Có vẻ như cả hai đều giống nhau nhưng họ thì không.Sự khác biệt giữa || a = b và a = a || b trong ruby?

a || a = b or a ||= b 

a = a || b 

nếu

a = 4b = 6, sản lượng luôn là 4

này luôn luôn nhầm lẫn và misconcept tôi. Ai đó có thể vui lòng giải thích nó?

+1

Có thể muốn đọc [bài viết này] (http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html). 'a || a = b', 'a = a || b', và 'a || = b' là tất cả hơi khác nhau trong tự nhiên. – Oka

Trả lời

10

tìm kiếm a nếu a là truthy, trả a, nếu không a = b được thực hiện ví dụ: bạn gán giá trị b 's để a.

a = a || b 

Đây là thao tác gán. Tại đây, bạn chỉ định giá trị cho a bất kể giá trị nó nắm giữ là bao nhiêu. Vì vậy, a bằng a || b. Trong phần thứ hai của tuyên bố bạn đang tìm kiếm a. Nếu giá trị của nó là trung thực, bạn sẽ chỉ định giá trị đó trở về số a, nếu không bạn sẽ chỉ định giá trị b cho a.

TL; DR

a = a || b được gán một giá trị (tùy thuộc vào điều kiện)-a không phụ thuộc vào những gì đánh giá cao nó giữ.

a ||= b trở a nếu đã hiện diện, nếu không làm a = b

Giải thích với ví dụ:

Bạn có thể nghĩ a || a = b như a || (a = b). Bây giờ, hãy giả sử a = 4b = 6.

Từ bởi thứ tự ưu tiên, đây là một hoạt động OR và vì thứ tự của hoạt động cho HOẶC được trái sang phải chúng ta bắt đầu với a đầu tiên:

# lets call this Fig. 1 
     a || (a = b) 
    ^
     | 
     . 
    (here) 

a này có giá trị 4, đó là một giá trị truthy . Do đó việc đánh giá dừng lại và ở đó và 4 được trả lại. (Tại sao? Gợi ý:true || anything = true)

Bây giờ, hãy giả sử a = nilb = 6. Chúng ta bắt đầu lại từ cùng một vị trí (Hình 1). Vì anil là sai trong Ruby, chúng tôi di chuyển sang bên phải của thao tác OR, tức làa = b

# lets call this Fig. 2 
     a || (a = b) 
      ^
       | 
       . 
      (here) 

Vì đây là một hoạt động chuyển nhượng, nó sẽ được thực hiện và chúng tôi sẽ kết thúc giao 6-a.

Quay lại a = a || b. Bạn có thể nghĩ điều này là a = (a || b). Rõ ràng theo thứ tự ưu tiên của nó một hoạt động gán. Vì thứ tự các phép toán cho phép gán là phải sang trái, nên (a || b) được đánh giá trước tiên.

# lets call this Fig. 3 
     a = (a || b) 
      ^
      | 
      . 
      (here) 

Nếu a = 4b = 6, a || b sẽ trở lại 4(như đã trình bày ở trên). Khác nếu a = nilb = 6, a || b sẽ trả lại 6.

Bây giờ, bất kỳ giá trị nào được trả lại từ hoạt động || này sẽ được gán cho a đầu tiên.

# lets call this Fig. 4 
     a = (a || b) 
    ^
     | 
     . 
    (here) 
+0

Cảm ơn câu trả lời của bạn, bạn có thể giải thích bằng ví dụ có thể giúp chúng tôi hiểu nó tốt hơn không. –

+0

@ChitrankSamaiya Tôi đã cố gắng giải thích câu trả lời của mình với các ví dụ trong bản chỉnh sửa mới nhất của tôi. Hãy kiểm tra. – shivam

+0

Câu trả lời hay nhất +1 –

4

Một chung quan niệm sai lầm là:

a ||= b tương đương với a = a || b, nhưng nó hoạt động như a || a = b

Trong a = a || b, một được thiết lập để một cái gì đó bằng cách tuyên bố trên tất cả chạy, trong khi với a || a = b, a chỉ được đặt nếu sai là hợp lý (ví dụ: nếu không phải là số không hoặc sai) vì || là 'đoản mạch'.

Hãy để tôi giữ cho rằng đơn giản:

Nghĩa là, nếu phía bên tay trái của || so sánh là đúng, có không cần kiểm tra phía bên tay phải.

nhiều tài liệu tham khảo RubyInside

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