Tôi đã đọc this question nhưng tôi có câu hỏi cơ bản hơn về từ khóa crossinline
. Tôi không thực sự chắc chắn nó đang giải quyết vấn đề gì và nó giải quyết nó như thế nào.Từ khóa chéo của Kotlin
Từ the Kotlin Docs,
Lưu ý rằng một số chức năng inline có thể gọi lambdas truyền cho họ như là các thông số không trực tiếp từ các cơ quan chức năng, nhưng từ một bối cảnh thực hiện, chẳng hạn như một đối tượng cục bộ hoặc một hàm lồng nhau. Trong trường hợp như vậy, luồng kiểm soát không phải cục bộ cũng không được phép trong lambdas. Để chỉ ra rằng, tham số lambda cần phải được đánh dấu bằng modifier crossinline:
[Nhấn mạnh thêm]
Tuyên bố này là mơ hồ đối với tôi. Đầu tiên, tôi gặp khó khăn khi thực sự hình dung những gì có nghĩa là "trường hợp như vậy". Tôi có một ý tưởng chung về vấn đề là gì nhưng không thể đưa ra một ví dụ hay về nó.
Thứ hai, cụm từ "Để chỉ ra rằng" có thể được đọc theo nhiều cách. Để chỉ ra cái gì? Không được phép trường hợp cụ thể? Rằng nó là được phép? Dòng điều khiển phi cục bộ đó trong định nghĩa hàm đã cho là (hoặc không được) cho phép?
Tóm lại, tôi gặp khó khăn trong việc tìm hiểu ngữ cảnh sử dụng điều này thực sự là gì, ngữ cảnh sử dụng nó giao tiếp với khách hàng, và kết quả mong đợi của việc áp dụng từ khóa này là gì.
Vì vậy, từ khóa 'crossinline' ngăn chặn lambda chứa từ khóa' return' (kết quả là trả về không phải cục bộ) sẽ không có ý nghĩa xác định từ cách lambda được sử dụng trong hàm. – melston
Tôi cũng giả định rằng việc trả lại nhãn không bị ảnh hưởng bởi việc sử dụng 'crossinline', đúng không? – melston
@melston, vâng, miễn là * local *. Nghĩa là, 'someList.forEach {item -> someCrossInline {return @ forEach item}}' không được phép, bởi vì đó là sự trả về không phải cục bộ cho lambda 'crossinline', nhưng' someList.forEach {item -> someCrossInline {return @someCrossInline item}} 'là tốt (xin lỗi cho mã lớn trong một bình luận). – hotkey