2011-08-29 33 views

Trả lời

10

Nó có nghĩa là một khối mã mà bạn có thể chạy.

Vì vậy, ví dụ:

scala> def doTwice(op: =>Unit) = {op; op} 
doTwice: (op: => Unit)Unit 

scala> doTwice({println("Hi")}) 
Hi 
Hi 

Trong trường hợp này =>Unit{println("Hi")}

Here "SomeType" là đơn vị vì println không tạo ra một giá trị. Nếu nó tạo ra một Int, nó sẽ là =>Int.

+1

Oooh, tôi hiểu rồi. Cảm ơn! Đây là những gì tôi ghét về scala. Đó là ridiculously cứng để google những thứ như thế này :) Cảm ơn thần cho những người tốt và stackoverflow :) – Arg

+4

Nice ví dụ. Ở đây, 'op' được gọi là tham số * theo tên * (ngược với * theo giá trị *). Lưu ý rằng nó sẽ làm việc tốt như nhau để viết 'doTwice (println (" Hi "))'. Khi bạn gọi một hàm trong Scala, cú pháp không cho biết bạn có đang truyền tham số bằng * name * hay bằng * value * hay không. –

+2

@Arg [SymbolHound] (http://symbolhound.com/) là bạn của bạn. –

2

Nó chỉ là một loại giá trị hàm không có tham số. Ví dụ của Owen thật tuyệt, chỉ biết rằng "A => B" là một hàm có tham số có loại A và giá trị trả về với loại B và "=> B" là hàm không có tham số và trả về một giá trị có loại B.

6

Nó chỉ ra hai điều. Đầu tiên, vì tiền tố =>, nó cho biết thông số sẽ được chuyển qua by name. Sau đó, nó cho biết loại tham số được truyền phải là SomeType.

Một số người kết hợp cả hai, nghĩ rằng => SomeType là một loại chính nó - không phải vậy. Đó là sự kết hợp của hai thứ: chiến lược đánh giá tham số và kiểu tham số.

Vì vậy, giải thích ngắn gọn về cuộc gọi theo tên, trong trường hợp liên kết wikipedia không làm cho mọi việc rõ ràng, nếu bạn có điều này:

def f[A](x: => A) = { x; x } 
f(some stuff) 

Sau đó Scala sẽ thực hiện điều này như thế này:

{ some stuff; some stuff } 

Khi gọi điện theo giá trị, những gì xảy ra là nhiều hơn như thế này:

val x = some stuff 
{ x; x } 

cũng lưu ý rằng các tham số là luôn là được đánh giá theo cuộc gọi theo giá trị, nhưng chỉ một lần. Khi gọi theo tên, tham số có thể không bao giờ được đánh giá là (ví dụ: nếu nó thuộc chi nhánh không thực thi của số if), nhưng có thể được đánh giá nhiều lần.

+1

[A] đại diện cho trường hợp này là gì? tôi đã nhìn thấy nó ở một số nơi, nhưng vẫn không nhận được nó –

+1

@elimence Đó là một tham số _type_. Nó là một kiểu không được biết tại điểm mà 'f' được khai báo, nhưng sẽ được biết tại điểm' f' được sử dụng. Hàm 'f' là hợp lệ đối với tất cả các kiểu' A', và trong trường hợp này, không có giới hạn nào về 'A' có thể là gì.Tôi có thể đã sử dụng 'A <: SomeConcreteType' để chỉ ra một ranh giới thấp hơn (' A' phải là một 'SomeConcreteType' hoặc subtype của nó),' A>: SomeOtherType' ('A' phải là một superclass của' SomeOtherType') , cũng như chỉ ra 'A' phải là một phần của một số tham số ngầm định, dẫn đến các giới hạn tùy ý về những gì' A' có thể. –

+0

Cảm ơn Daniel, đã nhận ngay bây giờ –

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