2012-03-07 41 views
6

Tôi đã có một lỗi lạ ngày hôm qua rằng tôi cuối cùng đã giảm xuống còn đoạn mã sau:Bất ngờ hành vi với implicits

Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_29). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> class X extends Function[String, Int] { def apply(x: String) = Integer.parseInt(x) } 
defined class X 

scala> implicit val x = new X 
x: X = <function1> 

scala> "56"/2 
res2: Int = 28 

Tôi hy vọng điều này để ném một ngoại lệ, vì String không có một phương pháp /. Thay vào đó, Scala coi biến ngầm là một phương thức ngầm (vì nó thực hiện Function[String,Int]) và chuyển đổi chuỗi "56" thành số nguyên 56.

Cách này hoạt động? Dựa trên các quy tắc tìm kiếm tiềm ẩn, tôi không nghĩ rằng các biến tiềm ẩn hoạt động như các hàm sẽ được xem xét.

+1

Thông báo tốt, cảm ơn. – Odomontois

+0

Trên thực tế, một chuyển đổi 'ngầm định' hoạt động bởi vì nó được tự động chuyển thành một giá trị hàm (đó là _eta expand_). –

Trả lời

7

Ngữ nghĩa của chuyển đổi ngầm là chính xác những gì bạn đã quan sát. Nếu bạn xác định một chuyển đổi ngầm thông qua một phương pháp ngầm,

trait A 
trait B 

implicit def aToB(a : A) : B = new B {} 

bạn sẽ thấy rằng bây giờ bạn có một giá trị chức năng tiềm ẩn A => B,

scala> implicitly[A => B] 
res1: A => B = <function1> 

Và, nơi bạn có một phương thức với một cái nhìn bị ràng buộc,

def foo[T <% B](t : T) : B = t 

này tương đương với,

def foo[T](t : T)(implicit conv : T => B) : B = conv(t) 

tức là. đối số ngầm định tương ứng với khung nhìn bị ràng buộc có dạng chính xác giống như giá trị hàm ẩn được tạo ra bởi định nghĩa phương thức ngầm.

+0

Vì vậy, các phương thức ngầm được giảm xuống các biến tiềm ẩn của kiểu hàm? Hoặc Scala chỉ xử lý cả hai trường hợp? – Bill

+1

Trong bất kỳ ngữ cảnh nào trong đó phương thức phải được thống nhất dưới dạng giá trị hàm (bao gồm các ứng dụng liên quan đến giới hạn xem), có. Trong ví dụ của tôi, nếu bạn vừa làm (new A {}: B), phương thức sẽ được áp dụng mà không thực sự tạo đối tượng hàm trước, nhưng cơ chế giống hệt nhau, do đó bạn đã quan sát hành vi. –

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