Điều kiện nội tuyến trong Lua (a == b? "Yes": "no")?


89

Có cách nào để sử dụng điều kiện nội tuyến trong Lua không?

Nhu la:

print("blah: " .. (a == true ? "blah" : "nahblah"))

1
Có một bài viết hay trên wiki lua-users về toán tử bậc ba, cùng với giải thích vấn đề và một số giải pháp.
Marcin

Câu trả lời:


121

Chắc chắn rồi:

print("blah: " .. (a and "blah" or "nahblah"))

31
+1 cho câu trả lời. Tuy nhiên, tôi không nghĩ điều này hoàn toàn đúng - tôi không sử dụng LUA - nhưng tôi nghĩ rằng nó có chung một "lỗ hổng" với cách tiếp cận này so với toán tử bậc ba trong các ngôn ngữ khác. Hãy tưởng tượng: (cond and false-value or x)Điều đó sẽ dẫn đến xtrong mọi trường hợp.

1
Điều đó cũng không in ra giá trị của A phải không?
corsiKa

11
@glowcoder No. "Toán tử kết hợp (và) trả về đối số đầu tiên nếu giá trị này là false hoặc nil; ngược lại, và trả về đối số thứ hai. Toán tử disjunction (hoặc) trả về đối số đầu tiên nếu giá trị này khác nil và false ; nếu không, hoặc trả về đối số thứ hai của nó. Cả và và hoặc sử dụng đánh giá rút gọn, nghĩa là, toán hạng thứ hai chỉ được đánh giá nếu cần thiết "- from lua.org/manual/5.0/manual.html

3
@pst đúng rằng nếu mục đích là a and false or truesẽ không đưa ra câu trả lời giống như not a. Thành ngữ này thường được sử dụng cho các trường hợp giá trị mong muốn if alà true không thể là falseor nil.
RBerteig

1
Nếu bạn đang sử dụng biểu mẫu này với các biến, bạn có thể giả định rằng biến thứ hai là không sai, có nghĩa là bạn nên viết a and assert(b) or c.
HoverHell

29

Nếu a and t or fkhông phù hợp với bạn, bạn luôn có thể tạo một hàm:

function ternary ( cond , T , F )
    if cond then return T else return F end
end

print("blah: " .. ternary(a == true ,"blah" ,"nahblah"))

tất nhiên, sau đó bạn có điểm rút ra là T và F luôn được đánh giá .... để giải quyết vấn đề đó bạn cần cung cấp các hàm cho hàm bậc ba của mình và điều đó có thể trở nên khó sử dụng:

function ternary ( cond , T , F , ...)
    if cond then return T(...) else return F(...) end
end

print("blah: " .. ternary(a == true ,function() return "blah" end ,function() return "nahblah" end))

Tôi nghĩ rằng điều này hữu ích nhất cho các biến boolean
Vyacheslav

Câu trả lời này thực sự tốt hơn câu trả lời hàng đầu vì nó cũng hoạt động cho các boolean.
Деян Добромиров

Tôi nghĩ rằng một trường hợp cạnh phổ biến hơn rằng giải pháp này chứa là khi tnil.
NetherGranite
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.