2013-07-02 25 views
6

Đây là một mã ngắn:Scala: áp dụng xem

import scala.language.implicitConversions 

implicit def str2int(str:String) = str.toInt 

object Container { 
    def addIt[A](x: A)(implicit str2int: A => Int) = 123 + x 
    def addIt2(x: String)(implicit str2int: String => Int) = 123 + x 
} 

println(Container.addIt("123")); 
println(Container.addIt2("123")); 

Hai câu hỏi:

  1. là "(implicit str2int: A => Int)" gọi là một cái nhìn? Khi bạn nói "chế độ xem", phần nào của mã cụ thể cho biết?
  2. Tại sao addIt trả về 246 trong khi addIt2 trả về một chuỗi "123123"?

Bất kỳ tài nguyên nào tốt về chủ đề này cũng sẽ được đánh giá cao. Cảm ơn bạn.

Trả lời

4

Chế độ xem có nghĩa là loại A có thể được "xem" dưới dạng B, được chỉ định bởi hàm ẩn A => B. Vì vậy, vâng, cả hai đối số ẩn trong addItaddIt2 là các chế độ xem.

addIt2 trả về 123123 vì (thật không may) có thể gọi + trên hai đối tượng mà một trong số đó là String. Cú đá này trước khi Scala nhìn vào khả năng áp dụng chuyển đổi str2int. Nếu bạn không muốn điều đó, bạn có thể áp dụng một cách rõ ràng quan điểm:

def addIt2(x: String)(implicit str2int: String => Int) = 123 + str2int(x) 

Hoặc bạn có thể ẩn chuyển đổi any2stringadd:

object Container { 
    import Predef.{any2stringadd => _} 
    def addIt2(x: String)(implicit str2int: String => Int) = 123 + x 
} 
2
  1. Có nó là một cái nhìn ngầm, nhưng nó doesn không chỉ ra bất kỳ phần mã cụ thể nào. Nó chỉ nói rằng loại A nên được 'chuyển đổi', tốt nhất là ngầm để nhập Int, ví dụ: trình chuyển đổi ngầm nên nằm trong phạm vi khi phương thức này được gọi.

  2. Hình như khi biên dịch dịch phương thức đầu tiên, nó sẽ thấy 123. + (X: A) và cố gắng tìm ẩn cho loại A mà '+' sẽ biên dịch.

Trong trường hợp thứ hai, nó thấy 123. + (X: Chuỗi) và có chuyển đổi ẩn trong Scala Predef. Đó là trong thực tế một quirk trong việc thực hiện Scala. Việc kê khai ngầm là:

final class StringAdd(self: Any) { 
    def +(other: String) = self.toString + other 
} 

Nó còn lại trong scala để thuận tiện của cựu nhà phát triển Java được sử dụng cú pháp như sau: 123 + "something" và hy vọng nó sẽ là một chuỗi.

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