2017-06-09 14 views
5

Gần đây tôi đã thảo luận về cú pháp của Ruby sau đây với một đồng nghiệp:nếu câu lệnh sau khi gán biến - mức độ phổ biến như thế nào?

value = if a == 0 
      "foo" 
     elsif a > 42 
      "bar" 
     else 
      "fizz" 
     end 

Tôi chưa thấy loại này logic nhiều cá nhân, nhưng đồng nghiệp của tôi lưu ý rằng nó thực sự là một Rubyism khá phổ biến. Tôi đã cố gắng googling chủ đề và không tìm thấy bài viết, trang, hoặc SO câu hỏi thảo luận về nó, làm cho tôi tin rằng nó có thể là một kỹ thuật rất quan trọng của thực tế. Một đồng nghiệp khác, tuy nhiên, tìm thấy cú pháp khó hiểu và thay vào đó sẽ viết logic trên như thế này:

if a == 0 
    value = "foo" 
elsif a > 42 
    value = "bar" 
else 
    value = "fizz" 
end 

Những bất lợi đó là tuyên bố lặp đi lặp lại của value = và sự mất mát của một ngầm else nil, nếu chúng ta muốn sử dụng nó. Điều này cũng giống như nó liên kết với nhiều tính năng đường cú pháp khác được tìm thấy trong Ruby.

Câu hỏi của tôi là, mức độ phổ biến của kỹ thuật này trong Ruby? Có một số loại đồng thuận về việc liệu cộng đồng cảm thấy như thế này nên được sử dụng hoặc tránh?

+1

Tôi muốn nói, nó khá thành ngữ. Tôi thường xuyên sử dụng nó. –

+2

Lưu ý: đây không phải là câu lệnh 'if', đó là biểu thức' if' * *, chính xác là * tại sao * nó hoạt động ở vị trí đầu tiên. (Trong thực tế, không có câu lệnh nào trong Ruby, mọi thứ đều là một biểu thức và mọi thứ đều trả về một giá trị.) –

+0

Nó tương tự như 'x = case (y); khi .... 'và' x = (y = 3)? 3: 1', phổ biến. –

Trả lời

4

Thực tế là ifcase giá trị trả về làm cho một số mã rất chặt chẽ, gọn gàng, nhưng vẫn có thể hiểu được. Đó là một mô hình phổ biến trong Ruby khi bạn giao dịch với nhiệm vụ thông qua phân nhánh.

Con đường tôi có xu hướng tiếp cận định dạng này là để áp dụng một mức độ thụt đầu dòng để làm cho sự phân công rõ ràng, nhưng không quá "đẩy" mã trong quá xa:

value = 
    if a == 0 
    "foo" 
    elsif a > 42 
    "bar" 
    else 
    "fizz" 
    end 

Hoặc nếu bạn muốn có một case :

value = 
    case 
    when a == 0 
    "foo" 
    when a > 42 
    "bar" 
    else 
    "fizz" 
    end 

Trong nhiều trường hợp, bạn sẽ thấy một phương pháp mà có if là cơ quan để xác định kết quả:

def value(a) 
    if a == 0 
    "foo" 
    elsif a > 42 
    "bar" 
    else 
    "fizz" 
    end 
end 

Sau đó, không cần có sự thụt lề kỳ quặc.

6
value = if condition 
      x 
     else 
      y 
     end 

là điểm chung. Nó tự vay để làm sạch tình trạng này:

if condition 
    value = x 
else 
    value = y 
end 

Hãy xem hướng dẫn kiểu Ruby này. Đó là hướng dẫn phổ biến về cách viết mã Ruby.

https://github.com/bbatsov/ruby-style-guide#use-if-case-returns

+0

Khi, ở đây, không có 'elsif' một biểu thức bậc ba nhỏ gọn và đọc tốt:' value = condition? x: y'. –

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