2012-12-30 24 views
19

Tôi tò mò - điểm chung của loại U khi khai báo phương thức 's foreach?Điểm chung của loại chung trong foreach là gì?

def foreach[U](f: A => U): Unit 

Kể từ kiểu trả về của Function1 là hiệp biến, tại sao có thể không có được chỉ là:

def foreach(f: A => Any): Unit 

?

+0

Tôi không có thời gian để đưa ra một ví dụ, nhưng tôi mạnh mẽ nghi ngờ nó là để cho các inferencer loại bỏ qua 'foreach' khi nói đến suy ra kiểu trả về của một hàm. Nhưng tôi không biết một trường hợp nào trên đỉnh đầu của tôi, nơi nó sẽ quan trọng (nghĩa là 'Bất kỳ' sẽ không dẫn đến suy luận tương tự). –

Trả lời

9

Không phải là Martin Odersky , Tôi chỉ có thể đoán :-) Nhìn vào Scaladoc của foreach, tôi thấy điều này:

/** Applies a function `f` to all elements of this $coll. 
    * 
    * @param f the function that is applied for its side-effect to every element. 
    *    The result of function `f` is discarded. 
    *    
    * @tparam U the type parameter describing the result of function `f`. 
    *    This result will always be ignored. Typically `U` is `Unit`, 
    *    but this is not necessary. 
    * 
    * @usecase def foreach(f: A => Unit): Unit 
    */ 

Vì vậy, loại trả về f không quan trọng và kết quả của nó luôn bị hủy. Điều này, với tôi, gợi ý rằng việc sử dụng một tham số kiểu chung ở đây để đánh dấu kiểu trả về chỉ là một tài liệu nhỏ, nói rằng "kiểu trả về có thể là bất cứ thứ gì, thực sự bất cứ điều gì, bạn thích". Trong khi một kiểu trả về của Any có thể gợi ý cho (một số) độc giả một số loại hạn chế đối với các loại hàm áp dụng ở đây.

Một khía cạnh khác là Scala đã được thiết kế rất có ý thức để trở thành chung từ đầu. Vì vậy, với tôi - sử dụng một tham số kiểu chung ở đây phù hợp với triết lý chung của ngôn ngữ, trong khi sử dụng Any - mặc dù về mặt kỹ thuật có thể sử dụng - sẽ là một cách tiếp cận hoàn toàn không chung chung với tỷ lệ phần còn lại của ngôn ngữ.

-5

Có thể cho phép bạn kế thừa từ Traversable và sử dụng một số giá trị trả lại U từ f: A => U?

trait TraversableWithHandler[+A, E <: Option[Throwable]] extends Traversable[A] { 
    override def foreach[U](f: A => U): Unit 
    def handleError(t: E) 
} 

Ví dụ trong jQuery, trở lại của false từ bên foreach tương đương với break, bất kỳ giá trị khác nhau là một continue.

sử dụng Case

breakable { 
    List(1,2,3).foreach(_ match { 
    case 1 => println("ok") 
    case 2 => 
     println("Sort of, soft interrupt?") 
     return false 
    case 3 => break 
    }) 
} 

Bởi vì các mã tiếp theo (song song), không bao giờ phá vỡ (giải pháp Throwable Stackless dường như phi lý tưởng trong trường hợp này?):

import scala.util.control.Breaks._ 

breakable { 
    (0 to 100).toList.par.foreach(_ match { 
    case n if (n <= 50) => 
     println("#" * 100) 
     try { break } catch { 
     case t: Throwable => println("" + t); break 
     } 
    case n if (n > 50) => 
     println("" + n) 
    case _ => "ok" 
    }) 
} 
+0

-1: Do các ngoại lệ không có ngăn xếp được sử dụng cho luồng điều khiển trong các trường hợp như vậy, và có giá trị trả về chính thức không được sử dụng trong trường hợp này, điều này là _highly_ không. Ngoài ra, bạn không thực sự hiển thị bất kỳ trường hợp sử dụng nào. Tôi không biết cách sử dụng chữ ký ở trên. –

+0

Điều này sẽ trái ngược với Scaladoc có nội dung: "Kết quả của hàm' f' bị loại bỏ. " –

+5

Câu trả lời này không chỉ là sai, nó có khả năng rất khó hiểu. Bạn vừa đổi tên tham số kiểu để nó đổ bóng 'scala.Boolean' - bạn chắc chắn không có cách nào đó hạn chế phương thức được khai báo trong' Traversable'. –

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