2011-08-29 29 views
7

này hoạt độngLàm thế nào để xác định loại scala không có chức năng đối số?

def func(f: => Int) = f 

này Dosn't (bên trong lớp ví dụ)

type EmptyFunct = => Int 

hoặc

phiên bản
type EmptyFunct = (=> Int) 

Scala 2,9 Hai câu hỏi:

  1. Tại sao đường cú pháp không làm việc trong trường hợp thứ hai?
  2. Cách xác định hàm này không có đường cú pháp?
+0

Bạn có thể cho một ví dụ về việc sử dụng của 'EmptyFunct' cho thấy lý do tại sao'() => Unit' không phù hợp với nhu cầu của bạn? – Nicolas

Trả lời

12

=> Int không chính xác là một hàm không có tham số, nó là đối số Int với lời gọi theo quy ước truyền tên. (Tất nhiên, đó là khá tốt một điểm, vì nó được thực hiện bằng cách đi qua một chức năng mà không có tham số).

Hàm không có đối số được viết () => Int. Bạn có thể làm type EmptyFunct =() => Int.

Nó không phải là một loại. Bên trong func, f sẽ được nhập là Int. Một đối số của type() => Int sẽ không.

def func(f: => Int) = f *2 

func (: => Int) Int

Nhưng

def func(f:() => Int) : Int = f*2 

error: value * is not a member of() => Int

+0

Vì vậy, không có cách nào để tạo bộ sưu tập không có hàm arg (: => Unit)? – yura

+0

Xem phản hồi của tôi: 'Bộ sưu tập [Chức năng0 [Đơn vị]]' – Nicolas

+0

Nếu bạn đang tìm kiếm (: => Đơn vị *) đối số lặp lại, nó không được phép. Thật vậy, đó chỉ có thể là Seq [Unit] (Seq chứa các giá trị, không phải là các đối số gọi các quy ước). Và hoàn toàn vô dụng. Những gì bạn muốn là Seq [Function0 [Unit]] (hoặc Seq [() => Unit], nó có nghĩa là cùng một thứ). Ký hiệu sẽ ít thuận tiện hơn:() => x + = 1 thay vì x + = 1. –

3

Bạn nên sử dụng Function0

Trong trường hợp đầu tiên nó không hoạt động vì bạn khai báo một hàm luận không nhưng vì bạn chỉ ra rằng các tham số được gọi theo tên.

+0

Đây không phải là giải pháp cho vấn đề của tôi. Bởi vì Function0 thực sự có kiểu() => T không (=> T) như tôi đã thực hiện và không hoạt động chút nào. – yura

0

Tôi không thấy nhiều ý nghĩa trong một phương pháp, trả lại một int, gọi không có tham số. Hoặc nó trả về một hằng số, vì vậy bạn có thể sử dụng hằng số, hoặc nó sẽ sử dụng một var?

Vì vậy, chúng ta hãy đi với một var:

var k = 10 
val fi = List (() => k * 2,() => k - 2) 
val n = fi(0) 
n.apply 
k = 11 
n.apply 

kết quả là 20, sau đó 22.

+0

"Tôi không thấy nhiều ý nghĩa trong một phương thức, trả về một int, được gọi ra không có tham số." Một bộ đếm? – Nicolas

+0

Hoặc bất kỳ chức năng gọi lại nào có tất cả ngữ cảnh trong giai đoạn tạo – yura

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