Một dòng nếu câu lệnh không hoạt động


191
<%if @item.rigged %>Yes<%else%>No<%end%>

Tôi đã nghĩ về một cái gì đó như thế này?

if @item.rigged ? "Yes" : "No" 

Nhưng nó không hoạt động. Ruby có ||=nhưng tôi thậm chí không chắc chắn làm thế nào để sử dụng thứ đó.


Không rõ dòng nào không hoạt động (hoặc cả hai?)
ymoreau

Câu trả lời:


399

Xóa ifkhỏiif @item.rigged ? "Yes" : "No"

Toán tử ternary có hình thức condition ? if_true : if_false


1
Nếu điều kiện của bạn kết thúc bằng '?' Có thể thả nó? Tức là nếu điều kiện là @ customer.sales.present? bạn có thể bỏ '?'? ... Đừng lo lắng. Tìm thấy một số mã tôi đã có và kiểm tra nó. Câu trả lời là 'không'
Jay Killeen

@JayKilleen Bạn đã đúng. Ruby là tất cả về thủ thuật thông minh, nhưng nó thông minh (:
Nikita Rybak

1
@NikitaRybak s/that/not that :)
Austin

180

Trong Ruby, điều kiện và thenphần của ifbiểu thức phải được phân tách bằng dấu phân cách biểu thức (nghĩa là ;hoặc dòng mới) hoặcthen từ khóa.

Vì vậy, tất cả những thứ này sẽ hoạt động:

if @item.rigged then 'Yes' else 'No' end

if @item.rigged; 'Yes' else 'No' end

if @item.rigged
  'Yes' else 'No' end

Ngoài ra còn có một toán tử có điều kiện trong Ruby, nhưng điều đó là hoàn toàn không cần thiết. Toán tử có điều kiện là cần thiết trong C, bởi vì nó là toán tử: trong C, iflà một câu lệnh và do đó không thể trả về một giá trị, vì vậy nếu bạn muốn trả về một giá trị, bạn cần sử dụng một cái gì đó có thể trả về một giá trị. Và điều duy nhất trong C có thể trả về một giá trị là các hàm và toán tử, và vì không thể tạo ifhàm trong C, nên bạn cần một toán tử.

Trong Ruby, tuy nhiên, iflà một biểu thức. Trong thực tế, mọi thứ đều là một biểu thức trong Ruby, vì vậy nó đã có thể trả về một giá trị. Không cần toán tử điều kiện để tồn tại , hãy để một mình sử dụng nó.

BTW: thông thường đặt tên cho các phương thức được sử dụng để đặt câu hỏi với dấu chấm hỏi ở cuối, như thế này:

@item.rigged?

Điều này cho thấy một vấn đề khác khi sử dụng toán tử có điều kiện trong Ruby:

@item.rigged? ? 'Yes' : 'No'

Thật khó để đọc với nhiều dấu hỏi gần nhau.


74

Một dòng nếu:

<statement> if <condition>

Trường hợp của bạn:

"Yes" if @item.rigged

"No" if !@item.rigged # or: "No" unless @item.rigged

14
Hoặc "No" unless @item.riggedđể ngăn chặn!
Veger 13/2/2015

Giải pháp này khác ở chỗ nó trả về nilthay vì 'Yes'nếu item.riggedđúng. Một dòng nếu hoặc trừ khi các câu lệnh trở lại nilnếu điều kiện không được đáp ứng.
Pellmeister

23

Từ những gì tôi biết

3 lớp lót

  1. a = 10 if <condition>

thí dụ:

a = 10 if true # a = 10
b = 10 if false # b = nil
  1. a = 10 unless <condition>

thí dụ:

a = 10 unless false # a = 10
b = 10 unless true # b = nil
  1. a = <condition> ? <a> : <b>

thí dụ:

a = true ? 10 : 100 # a = 10
a = false ? 10 : 100 # a = 100

Tôi hy vọng nó sẽ giúp.


2
Con chó Đây là câu trả lời hay nhất - Tôi thích cách nó ngắn gọn tương phản cả ba cách. Cảm ơn!
MrVocellect

7

Cả hai cấu trúc một dòng shell và C đều hoạt động (ruby 1.9.3p429):

# Shell format
irb(main):022:0> true && "Yes" || "No"
=> "Yes"
irb(main):023:0> false && "Yes" || "No"
=> "No"

# C format
irb(main):024:0> true ? "Yes" : "No"
=> "Yes"
irb(main):025:0> false ? "Yes" : "No"
=> "No"

chỉ có ví dụ thứ hai là ruby
idiomatic

7

nếu điều kiện khác có thể được bao phủ với toán tử ternary

@item.rigged? ? 'Yes' : 'No'

2

Để đơn giản, Nếu bạn cần mặc định một số giá trị nếu không, bạn có thể sử dụng:

@something.nil? = "No" || "Yes"

1

Bạn có thể dùng ----

(@ mục. tưới tiêu)? "Có không"

Nếu @ item.rigged là đúng, nó sẽ trả về 'Có', nó sẽ trả về 'Không'

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.