2012-04-01 32 views
5

Tôi đã đọc rằng câu lệnh if trong scala luôn trả về một biểuscala người mới gặp rắc rối với Option, tương đương với các nhà điều hành ternary

Vì vậy, tôi đang cố gắng để làm như sau (pseudo code)

là những gì
sql = "select * from xx" + iif(order.isDefined, "order by " order.get, "") 

tôi đang cố gắng với

val sql: String = "select * from xx" + if (order.isDefined) {" order by " + order.get} else {""} 

Nhưng tôi nhận được lỗi này:

illegal start of simple expression 

trật tự là một lựa chọn [Chuỗi]

Tôi chỉ muốn có một tham số tùy chọn đến một phương pháp, và nếu điều đó tham số (theo thứ tự trường hợp này) không được thông qua sau đó chỉ cần bỏ qua nó

gì sẽ là cách thành ngữ nhất để đạt được những gì tôi đang cố gắng làm?

- chỉnh sửa -

Tôi đoán tôi vội vã lên quá nhiều yêu cầu

tôi thấy cách này,

val orderBy = order.map(" order by " + _).getOrElse("") 

Đây có phải là đúng cách để làm điều đó?

Tôi nghĩ bản đồ đã được dành cho các mục đích khác ...

+2

Lý do mã của bạn không biên dịch là vì bạn cần dấu ngoặc đơn xung quanh ' if' biểu thức. Nhưng như Tomasz Nurkiewicz chỉ ra, có những cách tốt hơn để viết này anyway. –

+1

Bất cứ ai muốn bình luận về * tại sao * chúng ta cần dấu ngoặc xung quanh if-expression (khác với "vì nó biên dịch")? –

+1

@LuigiPlinge đây chỉ là suy đoán, nhưng có thể là họ muốn tránh nhầm lẫn lập trình viên về cách biểu thức như '1 + if (b) 2 else 3 + 4' sẽ liên kết. Có phải '1 + (nếu (b) 2 else 3) + 4' hoặc '1 + (nếu (b) 2 else 3 + 4)'? Chắc chắn bạn có thể có một ngữ pháp giải quyết sự mơ hồ này (Haskell), nhưng điều đó không có nghĩa là mọi người sẽ không phạm sai lầm vì họ giả định một hành vi khác. –

Trả lời

11

Trước hết bạn không sử dụng Option[T] idiomatically, hãy thử này:

"select * from xx" + order.map(" order by " + _).getOrElse("") 

hoặc với cú pháp khác nhau:

"select * from xx" + (order map {" order by " + _} getOrElse "") 

Tương đương với:

"select * from xx" + order match { 
    case Some(o) => " order by " + o 
    case None => "" 
} 

Hãy xem scala.Option Cheat Sheet. Nhưng nếu bạn thực sự muốn đi theo con đường xấu xí của if s (thiếu dấu ngoặc xung quanh if):

"select * from xx" + (if(order.isDefined) {" order by " + order.get} else {""}) 
+0

Cảm ơn rất nhiều, Tomasz, tôi chỉ tìm thấy nó trên google ... Và có, tôi đang cố gắng tìm hiểu cách thành ngữ nhất để làm việc với Scala ... – opensas

0

... hoặc, nếu bạn thực sự muốn gây ấn tượng với bạn bè:

order.foldLeft ("") ((_,b)=>"order by " + b) 

(Tôi vẫn sẽ đề nghị câu trả lời của Tomasz, nhưng tôi nghĩ rằng điều này không được bao gồm trong bảng scala.Option cheat, vì vậy tôi nghĩ tôi sẽ đề cập đến nó)

+1

Nếu bạn đang gonna gấp, tại sao không sử dụng tiền tố làm giá trị ban đầu, và làm toàn bộ điều trong một lần? 'val sql = order.foldLeft (" select * from xx ") ((_, b) =>" order by "+ b)' –

+0

@AndrzejDoyle bạn nói đúng, đó là cách để làm điều đó ... tôi là tưởng tượng điều này là một phần của truy vấn được tạo động lớn hơn, nơi bạn có một hàm chỉ xây dựng phần "order by", một hàm khác xây dựng mệnh đề "where" và bạn đặt chúng lại với nhau ở cuối –

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