2011-12-14 47 views
13

Có thể một số giải thích cho tôi ý nghĩa của mã Ruby sau đây không? (Tôi thấy đoạn mã này trong dự án của một người):'|| =' toán tử trong Ruby

car ||= (method_1 || method_2 || method_3 || method_4) 

Sự khác biệt giữa mã trên và mã sau là gì?

car = method_1 || method_2 || method_3 || method_4 

---------- cập nhật --------------

Ok, tôi có ý nghĩa của ||= điều hành sau khi đọc @ Lời giải thích của Dave, số câu hỏi tiếp theo của tôi là nếu cả hai method_2, method_3method_4 trả về một giá trị, giá trị của một người nào sẽ được gán cho car? (Tôi cho rằng carnil ban đầu)

+1

http://stackoverflow.com/questions/995593/what-does-mean-in-ruby –

+1

Trùng lặp: ['|| =' có nghĩa là gì trong Ruby?] (Http://StackOverflow.Com/q/995593 /), [có nghĩa là gì? || = 'có nghĩa là trong Ruby?] (Http://StackOverflow.Com/q/3800957/), [là gì | || =' trong ruby?] (Http: // StackOverflow.Com/q/3945711/), [Ký hiệu ống đôi trong phép gán biến đổi của Ruby?] (Http://StackOverflow.Com/q/4500375/), [Toán hạng '' || = '” là gì? ruby] (http://StackOverflow.Com/q/5124930/), [có nghĩa là gì? || = 'có nghĩa là trong ngôn ngữ Ruby?] (http://StackOverflow.Com/q/5230162/), [Là toán tử ruby ​​'|| =' thông minh?] (http://StackOverflow.Com/q/2989862/),… –

+0

… ['|| =' có nghĩa là gì?] (http://StackOverflow.Com/q/ 7556902 /), ["| | = =" làm gì trong Ruby 1.9.2?] (Http://StackOverflow.Com/q/7714803/), và có lẽ nhiều người khác nữa. Xem thêm [Danh sách cuối cùng của các chuỗi và trang '|| =' (HOẶC Bình đẳng)] (http://Ruby-Forum.Com/topic/151660/). –

Trả lời

10

Đây là một toán tử gán cho 'Chuyển nhượng có điều kiện'

Xem ở đây ->http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Operators

nhượng có điều kiện:

x = find_something() #=>nil 
x ||= "default"  #=>"default" : value of x will be replaced with "default", but only if x is nil or false 
x ||= "other"  #=>"default" : value of x is not replaced if it already is other than nil or false 

điều hành || = là một biểu thức viết tắt của biểu thức:

x = x || "default" 

EDIT:

Sau khi nhìn thấy chỉnh sửa OP của, ví dụ chỉ là một phần mở rộng này, có nghĩa là:

car = method_1 || method_2 || method_3 || method_4 

sẽ gán các phi nil đầu tiên hoặc giá trị trả về không sai về method_1, method_2, method_3 , method_4 (theo thứ tự đó) đến car hoặc nó sẽ giữ lại giá trị cũ của nó.

+1

Giải thích của bạn hơi khác so với những người khác, nhưng tôi thích lời giải thích của bạn vì bạn đã chỉ ra điểm quan trọng của việc sử dụng toán tử này (gán điều kiện). Mặc dù nó là tốt hơn nếu bạn cũng có thể đề cập đến x || = Y bằng x = x || y –

+0

Vui lòng kiểm tra cập nhật của tôi, tôi có một câu hỏi mới liên quan đến nhà điều hành. –

+0

Xin chào, rất vui vì tôi đã trợ giúp - Tôi đã chỉnh sửa câu trả lời của mình để bao gồm thêm một chút - hy vọng nó sẽ giải quyết nhận xét đầu tiên của bạn và cập nhật câu hỏi của bạn. – Dave

4
car ||= (method_1 || method_2) 

tương đương với

car = (car || (method_1 || method_2)) 

Nói chung,

x op= y 

nghĩa

x = x op y 
+0

@ Leem.fin: Bạn cũng thấy bản chỉnh sửa của tôi. 'xe || = bất cứ điều gì' có nghĩa là 'xe = xe || bất cứ điều gì' –

+0

Oh! Tôi hiểu rồi. Tôi nghĩ nó sẽ '||' với tất cả các kết hợp có thể với phần bên phải của dấu '=' đó là lý do tại sao tôi thêm nhiều phương thức hơn. –

+0

@ Armen, bạn nghĩ gì về lời giải thích của @ Dave –

0

xe || = (phương pháp_1 || method_2)

bằng

xe = xe || (Method_1 || method_2)

+0

-1. Cái này sai. 'a || = b' giống như' a || a = b' hơn 'a = a || b', mặc dù nó là trong thực tế, không tương đương với * hoặc một * của những người. –

0

trong ngắn hạn nó bằng:

car = car || method_1 || method_2 

chi tiết hơn, đó là một chút phức tạp hơn:

car = (defined?(car) && car) || (method_1 || method_2) 

trong mọi trường hợp, những gì diễn ra sau khi ||= sẽ chỉ được thực hiện nếu car:

  • chưa được xác định
  • false
  • nil
1
car ||= (method_1 || method_2 || method_3 || method_4) 

xe sẽ giữ được giá trị của nó sau khi tuyên bố này được chạy, nếu xe ban đầu không phải là con số không.

Nếu ô tô không có giá trị trước báo cáo này, giá trị số không nil đầu tiên trả về từ phương thức_1, phương thức_2, ... sẽ được gán cho ô tô.


car = method_1 || method_2 || method_3 || method_4 

Trong trường hợp này, chiếc xe sẽ được tái gán giá trị nil không đầu tiên quay trở lại ra khỏi phương pháp ngay cả khi xe đã có một giá trị nil không trước khi tuyên bố này chạy

3

các ||= toán tử đầu tiên kiểm tra, nếu giá trị của bạn car đã được đặt. Nếu car trả lại không, giá trị đầu tiên sẽ được gán ở bên phải không trả về nil hoặc false.

Vì vậy, được đưa ra ví dụ của bạn từ trên cao, nếu bạn gán giá trị cho chiếc xe như

car = "BMW" 

và bạn thực hiện bạn mã đoạn, giá trị của chiếc xe sẽ vẫn là "BMW";

Nếu lợi nhuận method_1 (ví dụ) String "Value from Method 1" và xe là nil hoặc false, sau đó xe Chuỗi này sẽ được giao cho xe

car = nil 
car ||= (method_1 || method_2) 
car # => "Value from Method 1" 

Nếu method_1 cũng trả nil/false, nó sẽ kiểm tra sự giá trị trong phương thức_2, v.v., cho đến khi nó nhận được một số loại giá trị thực

Sự khác biệt với đoạn mã thứ hai của bạn là, trong trường hợp ||= biến car sẽ được đánh giá đầu tiên và đặt lại biến thành không hoặc sai.

Nếu bạn chỉ sử dụng =, không có đánh giá nào sẽ xảy ra và ô tô sẽ được đặt thành giá trị đầu tiên ở bên phải không trả về 0 hoặc không đúng.

- CẬP NHẬT -

Để trả lời câu hỏi cập nhật của bạn, giá trị ở bên phải sẽ được đánh giá từ trái sang phải, vì vậy một trong những đầu tiên mà không trả lại nil hoặc false sẽ được chỉ định.

car = nil 
# method_1 => "nil" 
# method_2 => "false" 
# method_3 => "value method 3" 
# method_4 => "I won't be called" 

car ||= (method_1 || method_2 || method_3 || method_4) 
# => "value method 3" 
+0

Xin chào, câu trả lời của bạn cũng rất rõ ràng. Tôi upvoted của bạn. Cảm ơn bạn! –

+0

cảm ơn và chúc mừng :-) – klaffenboeck

0

câu trả lời để cập nhật:

method_2 được giao vì nó là người đầu tiên không phải là sai, không bằng không giá trị trong danh sách.