Có vẻ như tôi không phải lúc nào cũng lặp lại định nghĩa tuple dài dòng mỗi lần tôi cần. Tôi chỉ có thể đặt tên nó và sử dụng làm tên loại? Sẽ được tốt đẹp để đặt tên cho các lĩnh vực của nó cũng thay vì sử dụng ._1, ._2, vvTôi có thể đặt tên một bộ tuple (xác định cấu trúc?) Trong Scala 2.8 không?
Trả lời
Về câu hỏi đầu tiên của bạn, bạn chỉ có thể sử dụng một loại bí danh:
type KeyValue = (Int, String)
Và, tất nhiên, Scala là một hướng đối tượng ngôn ngữ, do liên quan đến thứ hai của bạn về làm thế nào để chuyên một tuple, từ kỳ diệu là thừa kế:
case class KeyValue(key: Int, value: String) extends (Int, String)(key, value)
vậy là xong. Lớp học thậm chí không cần một cơ thể.
val kvp = KeyValue(42, "Hello")
kvp._1 // => res0: Int = 42
kvp.value // => res1: String = "Hello"
Lưu ý, tuy nhiên, kế thừa từ trường hợp lớp (mà Tuple2
là), bị phản đối và có thể không được công nhận trong tương lai. Dưới đây là cảnh báo trình biên dịch bạn nhận được cho định nghĩa lớp ở trên:
cảnh báo: trường hợp lớp
class KV
có tổ tiên lớp trường hợpclass Tuple2
. Điều này đã không được chấp nhận vì làm phức tạp quá mức cả việc sử dụng và triển khai. Thay vào đó, bạn nên sử dụng các trình giải nén để khớp mẫu trên các nút không phải lá.
Bí danh loại là tốt để đặt tên cho Tuple của bạn, nhưng thay vào đó hãy thử sử dụng lớp chữ hoa. Bạn sẽ có thể sử dụng tên thông số
Ví dụ với tuple:
def foo(a : Int) : (Int, String) = {
(a,"bar")
}
val res = foo(1)
val size = res._1
val name= res._2
Với một lớp trường hợp:
case class Result(size : Int , name : String)
def foo(a : Int) : Result = {
Result(a,"bar")
}
val res = foo(1)
val size = res.size
val name= res.name
Dưới đây là một giải pháp mà tạo ra một bí danh loại và một đối tượng nhà máy.
scala> type T = (Int, String)
defined type alias T
scala> object T { def apply(i: Int, s: String): T = (i, s) }
defined module T
scala> new T(1, "a")
res0: (Int, String) = (1,a)
scala> T(1, "a")
res1: (Int, String) = (1,a)
Tuy nhiên như những người khác đã đề cập, bạn có thể chỉ cần tạo một lớp chữ hoa chữ thường.
Mặc dù những người khác đã nói, các lớp rõ ràng (trường hợp) là tốt nhất theo nghĩa chung.
Tuy nhiên đối với các tình huống cục bộ những gì bạn có thể làm là sử dụng tuple extractor để cải thiện mã dễ đọc:
val (first, second) = incrementPair(3, 4)
println(s"$first ... $second")
Cho một phương pháp trả lại một tuple:
def incrementPair(pair: (Int, Int)) : (Int, Int) = {
val (first, second) = pair
(first + 1, second + 1)
}
- 1. Tôi có thể đặt bộ chọn mục tiêu-C trong cấu trúc không?
- 2. Tôi có thể xác định bản đồ có khóa là cấu trúc không?
- 3. Tôi có thể 'mở rộng' một cấu trúc trong C?
- 4. Có thể tạo một tập hợp api như Scala 2.8 trong Haskell không?
- 5. Tôi không thể xác định mặc định nếu tôi xác định nhiều nhà xây dựng quá tải trong Scala?
- 6. Có nhiều cách khác để xác định một bộ tuple chỉ với một mục không?
- 7. tại sao có thể sử dụng cấu trúc không xác định trong c
- 8. Có vòng lặp do-until (postcondition) trong Scala 2.8 không?
- 9. Tôi có thể xác định các gói tùy chọn trong bộ cài đặt không?
- 10. Có bất kỳ "hình phạt" nào để xác định cấu trúc bên trong một hàm không?
- 11. có thể xác định hàm bên trong cấu trúc C không?
- 12. Làm thế nào để xác định nhiều thẻ tên trong một cấu trúc
- 13. Scala - làm thế nào để xác định một loại cấu trúc đề cập đến chính nó?
- 14. Các tham số mẫu Tuple và Cấu trúc trong D
- 15. Tôi có thể đặt tuple vào một mảng trong python không?
- 16. PyV8, tôi có thể thao tác cấu trúc DOM không?
- 17. Có thể tạo cấu trúc cho cấu trúc khác không?
- 18. Tôi nên chỉ định loại dữ liệu không có cấu trúc giống như JSON trong Scala như thế nào?
- 19. Cấu trúc dường như xác định không có trường hợp nào trong Unix v6
- 20. xác định cấu trúc tĩnh const
- 21. cấu trúc nội bộ chính xác của tệp JAR
- 22. Cấu trúc C có thể được xác định nhiều lần không?
- 23. Cách diễn giải cấu trúc không có định nghĩa?
- 24. Tôi có thể tạo định nghĩa cấu trúc plist tùy chỉnh không?
- 25. cấu trúc không tên một loại trong C++
- 26. Cấu trúc định thời để định dạng có thể in
- 27. sizeof() cấu trúc không xác định. Tại sao?
- 28. C chức năng gọi lại được xác định trong một không gian tên chưa đặt tên?
- 29. Có thể định nghĩa một mảng các cấu trúc hoặc các đối tượng trong VBA không?
- 30. Có cấu trúc dữ liệu "Đặt" trong .Net không?
Đừng tuples làm việc nhanh hơn so với trường hợp các lớp học? Nhiệm vụ là việc xử lý phức tạp một lượng lớn dữ liệu đơn giản, một loại số-crunching. – Ivan
@Ivan: Tuples * là * lớp chữ thường, đúng không? –
Tuples thực sự là trường hợp lớp học! –