Trong khi các tính năng được sử dụng không phải là hiếm, tôi sẽ thừa nhận là một sự kết hợp khá kỳ lạ của các đối tượng địa lý. Bí quyết cơ bản là bất kỳ khối nào trong Scala là một biểu thức, với kiểu giống như biểu thức cuối cùng trong khối. Nếu biểu thức cuối cùng đó là một hàm, điều này có nghĩa là khối có kiểu chức năng, và do đó có thể được sử dụng làm đối số cho "bản đồ" hoặc "foreach". Điều xảy ra trong những trường hợp này là khi "map" hoặc "foreach" được gọi, khối được đánh giá. Khối đánh giá thành một hàm (i => i * 5 trong trường hợp đầu tiên), và hàm đó sau đó được ánh xạ trên phạm vi.
Có thể sử dụng cấu trúc này cho khối để xác định các biến có thể thay đổi và hàm kết quả sẽ thay đổi biến mỗi khi được gọi. Các biến sẽ được khởi tạo một lần, được đóng bởi hàm và giá trị của chúng được cập nhật mỗi lần hàm được gọi.
Ví dụ, đây là một cách hơi ngạc nhiên tính 6 số thừa đầu tiên
(1 to 6) map {
var total = 1
i => {total *= i;total}
}
(BTW, xin lỗi cho việc sử dụng thừa làm ví dụ. Đó là một trong hai hoặc chức năng quy tắc progamming Guild fibonacci.. Bạn phải giải quyết vấn đề đó, mang theo các chàng trai xuống đại sảnh.)
Lý do ít quan trọng hơn để có một khối trả về một hàm là định nghĩa các hàm trợ giúp trước đó trong khối. Ví dụ, nếu ví dụ thứ hai của bạn là thay vì
(1 to 3) foreach {
def line = Console.readLine
i => println(line)
}
Kết quả sẽ là ba dòng được đọc và lặp lại một lần mỗi, trong khi ví dụ của bạn có dòng đọc một lần và lặp lại ba lần.
Nguồn
2010-07-10 20:55:29
Câu trả lời chính xác hơn nhiều so với tôi. +1 – VonC
Trong ví dụ giai thừa, bạn nên sử dụng 'total * = i' thay vì giới thiệu một biến thứ hai có tên' counter' –
Vâng, tôi nhận ra rằng sau này. Sẽ chỉnh sửa –