2015-03-29 11 views
14

giống như câu hỏi tương tự: Convert match statement to partial function when foreach is used. Bây giờ tương tự, IntelliJ yêu cầu tôi cải thiện mã của tôi. Sự khác biệt là, mà tôi sử dụng giá trị cho phù hợp:scala: chuyển đổi câu lệnh đối sánh thành mẫu phù hợp với chức năng ẩn danh - với các giá trị

val matchMe = "Foo" 
keys.foreach(key => 
    key match { 
    case `matchMe` => somethingSpecial() 
    case _ => somethingNormal(key, calcWith(key)) 
    }) 

Refactoring này cho một chức năng mô hình khớp nặc danh sẽ giống như thế:

keys.foreach { 
    case `matchMe` => somethingSpecial(_) 
    case _ => somethingNormal(_, calcWith(_)) //this doesn't work 
} 

Lưu ý rằng trong trường hợp thứ hai, tôi không thể sử dụng _ vì tôi cần nó hai lần. Có cách nào để sử dụng chức năng phù hợp với mẫu ẩn danh ở đây không?

Trả lời

20

Bạn không thể sử dụng ký tự đại diện _ ở đây, mục đích của nó là để cho biết bạn không quan tâm đến giá trị bạn đang đối sánh.

Bạn có thể sử dụng một tham số có tên:

keys.foreach { 
    case `matchMe` => somethingSpecial(matchMe) 
    case nonSpecialKey => somethingNormal(nonSpecialKey, calcWith(nonSpecialKey)) 
} 

Nếu không có bất kỳ hạn chế đặt trên nó, nó sẽ phù hợp với bất kỳ giá trị. Lưu ý rằng thứ tự của case s là quan trọng, vì case x => ... khớp với mọi thứ và về cơ bản sẽ tắt các câu lệnh case khác.


Là một sang một bên, tôi không nghĩ rằng somethingSpecial(_) của bạn những gì bạn muốn/mong đợi nó. Đó chỉ là phiên bản ngắn của x => somethingSpecial(x), không phải là somethingSpecial(matchMe).

+0

'f (_)' là 'x => f (x)'. Và 'ks foreach {case _ => f (_)}' không phải là 'ks foreach {case x => f (x)}'. –

+0

Chết tiệt. Thats thực sự không mới với tôi .. Cảm ơn rất nhiều Marth! –

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