2012-08-13 40 views
13

Tôi nghĩ đây sẽ là sử dụng chính xác các lớp ngầm mới của Scala 2.10:Làm thế nào để sử dụng Scala 2.10 lớp ngầm

implicit case class IntOps(i: Int) extends AnyVal { 
    def twice = i * 2 
} 

11.twice 

Rõ ràng không:

<console>:13: error: value twice is not a member of Int 
       11.twice 
       ^

Tôi có thiếu một cái gì đó (Scala 2.10 .0-M6)?

+3

Đây là lỗi. Tôi đã mở [SI-6227] (https://issues.scala-lang.org/browse/SI-6227), mặc dù nó sẽ không làm tôi ngạc nhiên khi khám phá ra nó là một bản sao. –

+0

một 'lớp ẩn' không thể là một 'trường hợp lớp', đó là lý do duy nhất. – Valerin

Trả lời

21

Một đầu mối là desugaring các lớp tiềm ẩn, giải thích trong the SIP-13:

implicit class RichInt(n: Int) extends Ordered[Int] { 
def min(m: Int): Int = if (n <= m) n else m 
... 
} 

sẽ được biến đổi bởi trình biên dịch như sau:

class RichInt(n: Int) extends Ordered[Int] { 
def min(m: Int): Int = if (n <= m) n else m 
... 
} 
implicit final def RichInt(n: Int): RichInt = new RichInt(n) 

Như bạn có thể thấy, hàm ẩn được tạo có cùng tên với các lớp gốc. Tôi đoán nó được thực hiện như thế này để làm cho các lớp ngầm định dễ nhập hơn.

Như vậy trong trường hợp của bạn, khi bạn tạo một ngầm lớp trường hợp, có sự mâu thuẫn giữa tên phương pháp tạo ra bởi các implicit từ khóa và đối tượng đồng hành tạo ra bởi các từ khóa case.

+0

Ok, điều đó có ý nghĩa, cảm ơn –

+0

Với tôi, điều này trông giống như một lỗi. 'case' tạo phương thức' apply', ngụ ý phương thức với tên của lớp. – soc

+0

@Nicolas xin lỗi vì đã hỏi sau hơn 3 năm. Nhưng tôi sẽ đánh giá cao nếu bạn có thể cho thấy làm thế nào để có được mã desugared. Cảm ơn – Polymerase

2

Điều này cho thấy có một sự mơ hồ:

val ops: IntOps = 11 

<console>:11: error: ambiguous reference to overloaded definition, 
both method IntOps of type (i: Int)IntOps 
and object IntOps of type IntOps.type 
match argument types (Int) and expected result type IntOps 
     val ops: IntOps = 11 
         ^

Không chắc gì chính xác xảy ra. Nhưng khi không sử dụng một case class nó có vẻ tốt đẹp:

implicit class IntOps(val i: Int) extends AnyVal { 
    def twice = i * 2 
} 

11.twice // ok 
Các vấn đề liên quan