2010-02-15 42 views
40

Tôi bắt đầu học scala vài ngày trước và khi học nó, tôi so sánh nó với các ngôn ngữ khác functional programming như (Haskell, Erlang) mà tôi đã quen thuộc với nó. Scala có chuỗi guard không?Scala có bảo vệ không?

Tôi đã đi qua kết hợp mẫu trong Scala, nhưng có khái niệm nào tương đương với các vệ sĩ với otherwise và tất cả không?

Trả lời

51

Có, nó sử dụng từ khóa if. Từ phần Case Classes của A Tour của Scala, gần cuối:

def isIdentityFun(term: Term): Boolean = term match { 
    case Fun(x, Var(y)) if x == y => true 
    case _ => false 
} 

(này không được đề cập trên trang Pattern Matching, có lẽ vì Tour là một cái nhìn tổng quan nhanh chóng như vậy.)


Trong Haskell, otherwise thực sự chỉ là một biến được liên kết với True. Vì vậy, nó không thêm bất kỳ sức mạnh nào vào khái niệm khớp mẫu. Bạn có thể lấy nó chỉ bằng cách lặp lại mẫu ban đầu của bạn mà không cần bảo vệ:

// if this is your guarded match 
    case Fun(x, Var(y)) if x == y => true 
// and this is your 'otherwise' match 
    case Fun(x, Var(y)) if true => false 
// you could just write this: 
    case Fun(x, Var(y)) => false 
19

Có, có bảo vệ mẫu. Chúng được sử dụng như thế này:

def boundedInt(min:Int, max: Int): Int => Int = { 
    case n if n>max => max 
    case n if n<min => min 
    case n => n 
} 

Lưu ý rằng thay vì otherwise, vì bạn chỉ cần mô tả mẫu mà không cần bảo vệ.

+0

Điều gì sẽ là 'n' trong trường hợp này và vui lòng cung cấp ví dụ làm việc ở trên. – Jet

+1

@Jet 'n' sẽ là đối số cho hàm. [Ở đây] (http://ideone.com/HhSuF0) là một ví dụ về cách sử dụng hàm. – sepp2k

+0

OK, cảm ơn :-) – Jet

8

Câu trả lời đơn giản là không. Nó không phải là chính xác những gì bạn đang tìm kiếm (một kết hợp chính xác cho cú pháp Haskell). Bạn sẽ sử dụng "trận đấu" tuyên bố Scala với một người bảo vệ, và cung cấp một thẻ hoang dã, như:

num match { 
    case 0 => "Zero" 
    case n if n > -1 =>"Positive number" 
    case _ => "Negative number" 
} 
3

tôi vấp bài này tìm cách áp dụng bảo vệ cho trận đấu với nhiều đối số, nó không phải là thực sự trực quan, vì vậy Tôi đang thêm một ví dụ ngẫu nhiên ở đây.

def func(x: Int, y: Int): String = (x, y) match { 
    case (_, 0) | (0, _) => "Zero" 
    case (x, _) if x > -1 => "Positive number" 
    case (_, y) if y < 0 => "Negative number" 
    case (_, _) => "Could not classify" 
} 

println(func(10,-1)) 
println(func(-10,1)) 
println(func(-10,0)) 
Các vấn đề liên quan