2013-07-20 43 views
8

Tại sao công việc này:Thêm giá trị cho bản đồ Scala

val x = Map[Int,Int]() 
val y = (1, 0) 
x + y 

nhưng không này?

val x = Map[Int,Int]() 
x + (1, 0) 

Các lỗi được sản xuất là:

<console>:11: error: type mismatch; 
found : Int(1) 
required: (Int, ?) 
      x + (1,0) 
      ^

Nếu tôi được nhập (1,0) vào REPL, nó đúng loại nó như (Int,Int).

tôi nên thêm rằng điều này hoạt động tốt:

x + (1 -> 0) 

Trả lời

6

Đây là một sự mập mờ gây ra bởi sự tương đồng giữa các ký hiệu cho các bộ và một cho danh sách tham số:

x + (1,0) là ký hiệu cho x.+(1,0) nhưng thật đáng buồn là không có phương pháp nào trên x mất hai thông số Int. Những gì bạn muốn là x.+((1,0)), tức là x + ((1,0)).

Có gì đó trong Scala được gọi là tự động tupling, xem this question and answers, viết lại, ví dụ: println (1,2) đến println((1,2)). Ngoại trừ việc này sẽ không hoạt động ở đây vì phương thức + nhận số lượng đối số thay đổi và không phải là một đối số đơn lẻ như println.

Bạn nhận được thông báo lỗi lạ vì nó mong đợi mọi giá trị trong danh sách tham số (1,0) là một bộ dữ liệu, như trong myMap + ((1,2), (1,3), (3,4)). Nó tìm thấy một số Int thay vì (Int, Int), do đó có lỗi.

+0

Cảm ơn lời giải thích tuyệt vời để đi cùng với câu trả lời! – kanielc

2

thêm một cặp ngoặc đơn để làm cho nó làm việc:

val x = Map[Int,Int]() 
x + ((1, 0)) 
Các vấn đề liên quan