Godot: Menerapkan nilai pengembalian dari hasil()

Dibuat pada 19 Feb 2015  ·  3Komentar  ·  Sumber: godotengine/godot

Untuk membuat fungsi generator, kita membutuhkan hasil(nilai) untuk diimplementasikan. Ini akan bertindak seperti hasil(), tetapi 'nilai' akan diteruskan kembali dan dikembalikan dari panggilan resume().

Ini akan memungkinkan range() dibuat menjadi iterator, daripada membuat array yang berpotensi besar.

Ini juga akan menjadi langkah menuju fitur bagus seperti pemahaman daftar/dikt.

archived feature proposal gdscript

Komentar yang paling membantu

Saya baru saja mulai bekerja dengan Godot (sejauh ini menyukainya) tetapi saya setuju bahwa rasanya yield() harus dapat mengembalikan lebih dari status fungsi. Hasil seperti kembali dengan kemampuan untuk melanjutkan () sehingga fungsi harus dapat "mengembalikan" nilai dengan menghasilkan.

Salah satu pendekatan yang mungkin saya pikirkan adalah menambah [GDScript]FunctionState
( https://docs.godotengine.org/en/3.1/classes/class_gdscriptfunctionstate.html )
untuk memiliki metode value() yang mengembalikan argumen ke yield().

func co1():
     yield(5)

s = co1()
print(s.value())   # prints 5

GDscript sudah memiliki hasil yang mengambil dua nilai dan menunggu sinyal. Namun, versi argumen yang satu ini hanya akan mengembalikan argumennya di FunctionState. Hanya dengan perubahan itu, generator dapat ditulis seperti:

func xrange(count):
    var i = 0
    while i < count:
        yield(i)

func do_stuff():
    var it = xrange(5)
    while it:
        print(it.result())
        it = it.resume()

Ini bekerja cukup baik tetapi ada kehalusan yang layak dipertimbangkan. Ketika fungsi coroutine kembali (bukan menghasilkan) nilai yang dikembalikan bukan FunctionState. Dalam contoh di atas null dikembalikan (karena fungsinya batal) yang kami uji untuk menghentikan loop di do_stuff(). Jika fungsi coroutine mengembalikan nilai [mis. bayangkan return false di akhir xrange()] maka tes itu akan rusak.

Saya pikir saya akan melihat kodenya.
IMO, hasil (nilai) akan menjadi, erm, berharga.

EDIT: Melihat kode ada komplikasi dengan versi sinyal hasil sehingga bagian yang saya tulis di bawah tentang itu dihapus untuk saat ini. Mungkin akan dijabarkan nanti.

Semua 3 komentar

Solusi yang tidak menyenangkan:

func xrange(count, dict):
    var i = 0
    while i < count:
        dict.next = i
        yield()
        i += 1

func do_stuff():
    var curr = {}
    var it = xrange(5, curr)
    while curr.value != null:
        print(curr.value)
        it.resume()

Saya baru saja mulai bekerja dengan Godot (sejauh ini menyukainya) tetapi saya setuju bahwa rasanya yield() harus dapat mengembalikan lebih dari status fungsi. Hasil seperti kembali dengan kemampuan untuk melanjutkan () sehingga fungsi harus dapat "mengembalikan" nilai dengan menghasilkan.

Salah satu pendekatan yang mungkin saya pikirkan adalah menambah [GDScript]FunctionState
( https://docs.godotengine.org/en/3.1/classes/class_gdscriptfunctionstate.html )
untuk memiliki metode value() yang mengembalikan argumen ke yield().

func co1():
     yield(5)

s = co1()
print(s.value())   # prints 5

GDscript sudah memiliki hasil yang mengambil dua nilai dan menunggu sinyal. Namun, versi argumen yang satu ini hanya akan mengembalikan argumennya di FunctionState. Hanya dengan perubahan itu, generator dapat ditulis seperti:

func xrange(count):
    var i = 0
    while i < count:
        yield(i)

func do_stuff():
    var it = xrange(5)
    while it:
        print(it.result())
        it = it.resume()

Ini bekerja cukup baik tetapi ada kehalusan yang layak dipertimbangkan. Ketika fungsi coroutine kembali (bukan menghasilkan) nilai yang dikembalikan bukan FunctionState. Dalam contoh di atas null dikembalikan (karena fungsinya batal) yang kami uji untuk menghentikan loop di do_stuff(). Jika fungsi coroutine mengembalikan nilai [mis. bayangkan return false di akhir xrange()] maka tes itu akan rusak.

Saya pikir saya akan melihat kodenya.
IMO, hasil (nilai) akan menjadi, erm, berharga.

EDIT: Melihat kode ada komplikasi dengan versi sinyal hasil sehingga bagian yang saya tulis di bawah tentang itu dihapus untuk saat ini. Mungkin akan dijabarkan nanti.

Ada beberapa masalah tentang cara kerja yield , jadi akan diganti dengan await yang lebih mudah. Saya belum yakin apakah kami akan membuat generator yang sebenarnya.

Jika Anda masih tertarik dengan ide menambahkan generator, silakan buka proposal baru di pelacak GIP dengan mengikuti template masalah yang diberikan (setelah memeriksa bahwa itu belum ada). Anda dapat merujuk masalah ini dan meringkas ide-ide dalam proposal. Terima kasih sebelumnya!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat