Событийно-ориентированное программирование: простой пример

Даже очень простой и очень неполный: хотим мы, например, получить пользовательский ввод, как-то его обработать в callback'е и получить после того, как всё-таки пользователь соизволит что-то ввести — некий результат на базе введённых данных.

Хотя в примере это не показано (но будет показано в дальнейших примерах, это уж будьте спокойны на сей счёт), но в то самое время, пока пользователь что-то неспеша тупит и вводит — мы можем преспокойно выполнять ещё тысячи зелёных потоков, которые сделают что-нибудь разумное, доброе и вечное. Например, разогреют мышку пользователя до 150 градусов по Цельсию или нервно помигают светодиодами игровой клавиатуры Why not? :)

Итак, вот вам piece-of-code:
class AnyEvent
    def initialize
    end
    def input(&block : String -> Int32)
        promise=Channel(Int32).new
        spawn do
            s=""
            while s.empty?
                print "Press any keys, then hit Enter -> "
                s=gets || ""
            end
            promise.send(block.call(s))
        end
        promise
    end
end

wait_event=AnyEvent.new
input_result=wait_event.input do |keys_was_pressed|
    puts "String is #{keys_was_pressed}"
    keys_was_pressed.size
end
puts "I've received #{input_result.receive} characters as an answer. Thank you SO much! :)"


Обдумывайте.

И счастливых выходных!

0 комментариев