2015-01-07 68 views

回答

0

該教程將某種隱含定義爲「視圖」,但是這個術語在社區中還沒有真正引起注意(部分原因是因爲「視圖」已經意味着其他事物)。大多數人(IME)會將該鏈接中描述的內容稱爲「隱式轉換」。

最好的用例是「pimp my library pattern」,相當於例如「其他語言中的「擴展方法」,即將新方法添加到不能自行更改的第三方類型。通常你這樣做是因爲第三方類型「真正」符合一些常見的超級界面,但圖書館的作者並沒有讓它們的類「擴展」適當的類型。或者你只是爲了節省自己的一些打字工作。例如。最近,我不喜歡的東西下面(類型/方法名是不正確的,但應該給你一個想法),因爲AWS API有一個回調接口,而不是一個階未來接口

class PimpedAwsTransfer(inner: AwsTransfer) { 
    def responseFuture = Future.fromCallback { 
    cb => 
     inner.onSuccess(new AwsCallback({ 
     def callback(response: TransferResponse) = cb(transferResponse) 
     })) 
    } 
} 
implicit def pimpAwsTransfer(transfer: AwsTransfer) = new PimpedAwsTransfer(transfer) 

現在someTransfer.responseFuture是一個有效的方法調用在AwsTransfer上製作,並將調用我在PimpedAwsTransfer中定義的方法。所以,我可以寫這樣的代碼:

for { 
    response1 <- transfer1.responseFuture 
    response2 <- transfer2.responseFuture 
} yield {...} 

(注意,在現代的斯卡拉你可以使用一個implicit class而非class + implicit def,但是這是同樣的事情剛糖)

我可能只是有一靜態convertAwsTransferToFuture()功能某處,但通過將方法放在AwsTransfer對象上,我使API更像我想要使用的那個。這主要是關於適應第三方類型。

有些人也將這些隱式轉換用作轉換,即使第三方類型符合其自己的接口。海事組織這是一個不太好的用途,因爲它可能導致非常混亂的代碼;這些用法通常可以用類型類型替換,使用隱式方法參數而不是隱式轉換。

@Gangstead是正確的,視圖邊界在2.11中被棄用,但它們只是你鏈接的一小部分。