2014-06-07 13 views
10

cho đoạn mã sau:nhổ Scala - skip thông số chưa sử dụng

abstract class MyTuple 

... 

case class MySeptet(a: Int, b: Int, c: Int, d: Int, e: Int, f: Int, g: Int) extends MyTuple 

case class MyOctet(a: Int, b: Int, c: Int, d: Int, e: Int, f: Int, g: Int, h: Int) extends MyTuple 

... 

Khi sử dụng vắt tạo ra, là nó có thể bỏ qua các thông số còn lại, giả như họ đang không sử dụng?

ví dụ: Tôi không muốn viết nhiều dấu gạch trong đoạn mã sau:

case MyOctet(a, b, _, _, _, _, _, _) => ... // uses only a and b 
+0

tôi muốn đề nghị cắn đạn và viết các dấu gạch dưới, hay (thậm chí tốt hơn) cố gắng để phá vỡ lớp trường hợp của bạn xuống thành từng miếng nhỏ. –

+2

Hiện tại không thể, nhưng có các đề xuất cho phép khớp với các tham số được đặt tên và mặc định (xem [tại đây] (https://issues.scala-lang.org/browse/SI-5323) và [tại đây] (https://issues.scala-lang.org/browse/SI-6524)) sẽ cho phép một cú pháp dễ dàng cho việc này. – wingedsubmariner

+0

Liên quan: http://stackoverflow.com/questions/3474125/how-to-pattern-match-large-scala-case-classes –

Trả lời

-1
case o: MyOctet => o.a + o.b 
+2

Tôi không phải là downvoter, nhưng điều này không thực sự là một câu trả lời cho "khi sử dụng trình trích xuất được tạo ra "một phần của câu hỏi. –

+0

Tôi cũng vậy. Đoạn mã do tôi đề xuất là lời chào mừng, chỉ để giải quyết vấn đề, vì vậy, giải pháp sử dụng cụ thể của @ kulikov đó rõ ràng là sạch hơn. Tuy nhiên, trong trường hợp sử dụng phức tạp, ví dụ: lồng nhổ lồng nhau, bằng cách sử dụng một vắt có thể là cách duy nhất để đi, do đó câu hỏi. – vucalur

+1

@vucalur: Nếu tôi có cách đối sánh theo kiểu như thế này thì đây sẽ được coi là một kỹ thuật nâng cao và được bảo vệ bởi một lần nhập. Nó đôi khi hữu ích nhưng nói chung là một mùi mã và có rất nhiều hạn chế kỳ lạ với Generics. –

2

Một cách tiếp cận đơn giản để cung cấp cho nhổ tupled lớp dựa trên thực tế trong Array nhổ, do đó bỏ qua các vấn đề gốc .

Hãy

abstract class MyTuple (order: Int) 
case class MySeptet(coord: Array[Int]) extends MyTuple(7) 
case class MyOctet(coord: Array[Int]) extends MyTuple(8) 

và như vậy cho

val o = MyOctet((1 to 8).toArray) 

chúng ta có thể trích xuất hai yếu tố đầu tiên trong một octet như thế này,

o match { 
    case MyOctet(Array(a,b,_*)) => a+b 
    case _ => 0 
} 
res: Int = 3 

Lưu ý điều này không giải quyết vấn đề bỏ qua các tham số còn lại trong các lớp chữ được định nghĩa ở trên.

Cũng lưu ý một điểm yếu của phương pháp này, được minh họa như sau,

scala> val Array(a,b) = Array(1) 
scala.MatchError: [[email protected] (of class [I) 
Các vấn đề liên quan