2010-11-06 38 views

Trả lời

2

Tôi đoán bạn đang tìm kiếm match (hoặc chỉ đơn giản là if/else if/else).

2
case class Paired(x: Int, y: Int) 

def foo(x: Any) = x match { 
    case string : String => println("Got a string") 
    case num : Int if num < 100 => println("Number less than 100") 
    case Paired(x,y) => println("Got x and y: " + x + ", " + y) 
    case unknown => println("??: " + unknown) 
} 

Hai câu lệnh đầu tiên phù hợp với kiểu mẫu. Thứ ba cho thấy việc sử dụng một Extractor để chia nhỏ dữ liệu thành các phần cấu thành và gán các phần đó cho các biến. Phần thứ ba hiển thị một mẫu khớp biến đổi sẽ khớp với bất kỳ thứ gì. Không được hiển thị là _ case:

case _ => println("what") 

Giống như biến mẫu khớp, khớp với bất kỳ thứ gì, nhưng không ràng buộc đối tượng phù hợp với biến.

Lớp chữ thường ở trên cùng là viết tắt của Scala để tạo trình trích xuất cũng như chính lớp đó.

1

Tất nhiên, không phải match cũng không if thực hiện chính xác điều tương tự như cond. Một khả năng là làm như thế này:

object Cond { 
    def apply(clauses: Iterable[(()=>Boolean,()=>Any)]): Any = { 
    clauses find (_._1()) map (_._2()) getOrElse() 
    } 
} 

Đối tượng này chấp nhận nơi mà mỗi mục là một cặp hàm trả về Boolean và hàm trả về Bất kỳ. Nó cố gắng tìm một mục có hàm đầu tiên trả về true, dừng tìm kiếm nếu nó tìm thấy một hàm, gọi hàm thứ hai trên một mục tìm thấy và trả về kết quả của hàm đó (hoặc() nếu không tìm thấy).

Ví dụ:

val clauses = Seq(
    ({()=>false}, {()=>println("foo")}), 
    ({()=>true}, {()=>println("bar")}) 
) 
Cond(clauses) 

def checkYear(year: Int) = { 
    Cond(Seq(
    ({()=>year % 400 == 0}, {()=>42}), 
    ({()=>true}, {()=>{c:Char => (c.toString * 3)}}) 
)) 
} 

ETA: Vâng, tôi biết nó là xấu xí, nhưng nó hoạt động.

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