5

Có,Làm thế nào để vượt qua một hoặc không có biến arg trong scala?

def test(args: Any*) = args.size 

Tôi muốn gọi nó với danh sách đối số rỗng tùy thuộc vào điều kiện, nhưng tránh if/else.

Tôi đã đi ra với giải pháp này:

test(List("one").filter(_ => condition) : _*) 

Có cách tốt hơn thế này?

Đối với bối cảnh nhiều hơn, tôi đang chơi với Play 2.0 scala, và có điều này:

user => Redirect(routes.Application.index).withSession("username" -> user._1).withCookies(
    List(Cookie("rememberme", Crypto.sign(user._1) + "-" + user._1)).filter(_ => user._3) : _*) 

nơi user._3 là boolean rembemberme.

Tôi không muốn gọi vớiSession hoặc gọi nó với danh sách đối số trống (không phải để tạo nhanh Cookie) nếu rememberme là sai, theo cách scala.

Cảm ơn bạn.

Trả lời

7

tôi nghĩ rằng trong trường hợp này nhúng một if/else sự là giải pháp sạch:

test((if (condition) Seq("one") else Seq.empty) : _*) 
+0

Cảm ơn bạn, tôi đồng ý đây là sạch nhất, và tôi thực sự không muốn tránh nếu/else, nhưng tránh danh sách instantiating, vì vậy tôi chỉ thiếu Seq.empty hoặc Nil, vì vậy câu trả lời thứ hai cũng hữu ích :) – avalez

+1

@alavez nếu mục tiêu của bạn là để tránh instantiating một Danh sách, đây là một thất bại lớn, bởi vì đó chính xác là những gì 'Seq' làm! Bạn tránh nó bằng cách gán một phần trước withCookies với 'val t', sau đó gọi' if (user._3) t.withCookies (...) else t.withCookies() '. Biến tạm thời là tốt! –

+0

Cảm ơn bạn đã bình luận. Tôi có nghĩ rằng việc sử dụng Nil sẽ tránh được danh sách instantiating không? Và chỉ để hiểu rõ hơn, Seq.empty bằng cách nào đó tốt hơn hay tệ hơn Nil? – avalez

3

Trong khi sử dụng bộ lọc danh sách chắc chắn hoạt động, có vẻ như không phù hợp ở đây vì bạn muốn toàn bộ danh sách hoặc danh sách trống và không cần phải lặp qua danh sách thành viên.

Nếu bạn thực sự muốn tránh if/else, bạn có thể quấn danh sách trong một Option[List[Any]] và sử dụng của Lựa chọn filtergetOrElse phương pháp

test(Some(List("one")).filter{_ => condition}.getOrElse(Nil): _*) 

Bạn cũng có thể sử dụng match, mà trong trường hợp này là tương đương với if/else

test((condition match {case true => List("one"); case _ => Nil}) : _*) 
+0

Vì vậy, tôi đã kết thúc với: thử nghiệm ((if (condition) Seq ("one") khác Nil): _ *) – avalez

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