Tôi có các hàm đại diện cho các bước trong quy trình. Mỗi chức năng cũng biết bước tiếp theo, nếu có. Tôi muốn để có thể làm điều gì đó như:Có thể tạo kiểu hàm đệ quy trong Kotlin không?
fun fooStep() : Step? {
... do something ...
return ::barStep // the next step is barStep
}
Các chức năng này được gọi từ một chức năng điều phối Trung ương, trong đó có chứa mã một chút như thế này:
var step = startStep
while (step != null) {
step = step()
}
Lưu ý rằng logic trong một bước cụ thể cũng xác định bước tiếp theo, nếu thậm chí có một bước.
Tôi nghĩ tôi có thể xác định Step
như:
typealias Step =() -> Step?
Vì vậy, một Step
là một hàm trả về một Step
, hoặc null. Tuy nhiên, điều này không thể biên dịch với:
Kotlin: Recursive type alias in expansion: Step
Tôi có thể giải quyết vấn đề này bằng cách gói chức năng vào đối tượng. ví dụ:
data class StepWrapper(val step:() -> StepWrapper?)
và thay đổi chữ ký chức năng của tôi cho phù hợp.
Thật không may, điều này có nghĩa rằng tôi không thể chỉ cần sử dụng literals chức năng (ví dụ: ::barStep
), nhưng thay vì phải bọc chúng trong một StepWrapper
:
fun fooStep() : StepWrapper? {
... do something ...
return StepWrapper(::barStep)
}
(Tôi cũng phải thay đổi vòng lặp văn của tôi, cho phù hợp.)
Tôi muốn tránh sự cần thiết phải tạo các đối tượng bao bọc này, nếu có thể. Có cách nào để làm điều này trong Kotlin?
https://github.com/Kotlin/KEEP/blob/master/proposals/type-aliases.md Không theo này, ít nhất là không sử dụng một typealias – Novaterata
Có một lý do thuyết phục rằng một hàm Bước cần biết bước tiếp theo? Một cách tiếp cận khác là có một hàm Step trả về một Điều kiện, kết hợp với một đồ thị của các tham chiếu hàm Step. Mỗi nút trong biểu đồ chứa hàm bước được gọi và sau đó là Bản đồ <Điều kiện, Bước> của những gì cần gọi tiếp theo tùy thuộc vào Điều kiện được trả về. Sau đó sẽ có một người thi hành có thể đi qua biểu đồ này. – roobyroo
@roobyroo Lợi ích của phương pháp 'Bản đồ <Điều kiện, Bước>' đối với phương pháp 'StepWrapper' được mô tả trong câu hỏi là gì? –