2008-10-09 19 views

Trả lời

40

Mảng trong Scala rất đồng nhất. Điều này là do Scala là một ngôn ngữ gõ tĩnh. Nếu bạn thực sự cần các tính năng không đồng nhất giả, bạn cần phải sử dụng một cấu trúc dữ liệu không thay đổi được đa biến theo tham số (hầu hết các cấu trúc dữ liệu bất biến). List là ví dụ kinh điển ở đó, nhưng Vector cũng là một tùy chọn. Sau đó, bạn có thể làm điều gì đó như sau:

Vector("a string", 10, Map("x" -> 1),()=>()) + "another value" 

Kết quả sẽ là loại Vector[Any]. Không phải là rất hữu ích trong việc gõ tĩnh, nhưng mọi thứ sẽ ở trong đó như đã hứa.

Ngẫu nhiên, các "đen cú pháp" cho mảng trong Scala là như sau:

Array(1, 2, 3, 4)  // => Array[Int] containing [1, 2, 3, 4] 

Xem thêm: More info on persistent vectors

+9

Câu trả lời này rất khó hiểu - thực tế là ví dụ của OP hoạt động hoàn toàn tốt với Scala 'Array', như câu trả lời của @ soc. Có các tùy chọn khác như 'Danh sách' và' Vector', nhưng lý do sử dụng hoặc không sử dụng chúng không liên quan gì đến việc trường hợp sử dụng có đồng nhất hay "không đồng nhất giả" hay không. –

+1

Câu trả lời được đặt với biệt ngữ có thể khiến nó khó hiểu. Nó cũng giải thích rất nhiều nếu bạn nhận được những gì anh ta nói. Tôi nghi ngờ việc phân đoạn này được thực hiện với mục đích, vì OP đến từ javascript. – providence

+4

Không, đây thực sự là cách người bản địa nói tiếng Scala. Nó hoàn toàn bình thường. (Và tôi có nghĩa là thành thật này, tôi không cố gắng châm biếm.) –

4

Scala có thể nhận được khả năng cho một danh sách "đồng nhất" sớm : HList in Scala

+3

Mặc dù thông báo rằng HList không thay đổi ngôn ngữ, vì vậy nếu HList có thể làm điều đó, nó luôn ở trong Scala. –

18

Scala sẽ chọn loại phần tử Mảng cụ thể nhất có thể chứa tất cả các giá trị, trong trường hợp này nó cần loại chung nhất Any mà là một siêu kiểu của tất cả các loại khác:

Array("a string", 10, new { val x = 1 },() =>()) :+ "another value" 

Mảng kết quả sẽ là loại Array[Any].

2

Cá nhân, tôi có thể sử dụng các bộ dữ liệu, như herom đề cập trong nhận xét.

scala> ("a string", 10, (1),() => {}) 
res1: (java.lang.String, Int, Int,() => Unit) = (a string,10,1,<function0>) 

Nhưng bạn không thể nối thêm vào cấu trúc như vậy một cách dễ dàng.

HList được đề cập bởi ePharaoh là "được thực hiện cho điều này" nhưng tôi có thể sẽ tự mình xóa nó. Đó là nặng về lập trình loại và do đó có thể mang tải đáng ngạc nhiên với nó (tức là tạo ra rất nhiều lớp học khi biên soạn). Hãy cẩn thận. Một HList ở trên (cần thư viện MetaScala) sẽ được (không chứng minh kể từ khi tôi không sử dụng MetaScala):

scala> "a string" :: 10 :: (1) ::() => {} :: HNil 

Bạn có thể thêm vv (tốt, ít nhất là thêm vào trước) vào một danh sách như vậy, và nó sẽ biết các loại. Việc chuẩn bị tạo một loại mới có kiểu cũ là đuôi.

Sau đó, có một cách tiếp cận chưa được đề cập. Các lớp học (đặc biệt là các lớp chữ thường) rất nhẹ trên Scala và bạn có thể biến chúng thành một lớp lót:

scala> case class MyThing(str: String, int: Int, x: Int, f:() => Unit) 
defined class MyThing 

scala> MyThing("a string", 10, 1,()=>{}) 
res2: MyThing = MyThing(a string,10,1,<function0>) 

Tất nhiên, điều này sẽ không xử lý.

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