2015-07-19 10 views
2

Я пишу приложение командной строки, которое использует клавиатуру, чтобы показать пользователю выбранную в данный момент опцию, а также выбор опции и другие функции, такие как отображение всех возможных команд.Лучший способ сопоставления ввода с клавиатуры методам в ruby ​​

Мой вопрос: какие лучшие практики в рубине для этого? В настоящее время у меня есть класс input_handler, который инициализируется классом, который я хочу выполнить. Обработчик ввода использует класс команд, который фактически запускает методы, прикрепленные к команде. Код у меня выглядит, как показано ниже:

class Command 
    attr_reader :key, :alt_name, :action_object, :action, :registered 

    def initialize(key, alt_name=nil) 
    @key = key.to_s 
    @alt_name = alt_name == nil ? @key.to_sym : alt_name.to_sym 
    @registered = false 
    end 

    def send(input) 
    @action_object.send(action, input) 
    end 

    def register(action_object, action) 
    @action_object = action_object 
    @action = action 
    @registered = true 
    end 

    def is_command?(key) 
    @key == key.to_s || @alt_name == key.to_s.to_sym 
    end 
end 

class InputHandler 
    include InputHelper 
    attr_reader :commands 

    def initialize(action_object) 
    @action_object = action_object 
    generate_commands 
    end 

    #Returns whatever the command action returns 
    def get_input 
    input = read_char 
    get_command(input).send(input) if get_command(input).registered 
    end 

    def register_commands(command_hash) 
    command_hash.keys.each do |key| 
     get_command(key).register(@action_object, command_hash[key]) 
    end 
    end 

    def registered 
    @commands.select {|command| command.registered == true} 
    end 
end 

Я интересно, если я после надлежащего способа отображения методов на нажатие клавиш (метод read_char читает первый ввод ключа без необходимости ввода быть нажата). Является ли способ, которым я его написал, подвержен сложной отладке, или это то, как я написал это слишком косвенно, чтобы легко вводить ошибки?

+0

«Я следую правильному пути ...» Это работает? – iain

+0

Прежде чем написать очень длинный ответ о том, как это сделать, используете ли вы Linux, Mac или Windows? – Schylar

+0

Я на Ubuntu Linux –

ответ

1

Рубин поставляется с readlines, возможно, вы могли бы использовать его, чтобы сделать грязную работу:

require 'readline' 

LIST = [ 
    'search', 'download', 'open', 
    'help', 'history', 'quit', 
    'url', 'next', 'clear', 
    'prev', 'past' 
].sort 

comp = proc { |s| LIST.grep(/^#{Regexp.escape(s)}/) } 

Readline.completion_append_character = " " 
Readline.completion_proc = comp 

while line = Readline.readline('> ', true) 
    p line 
end 

(от docs) Он использует tab для автоматического заполнения и tabtab для включения в список, так что «s {вкладка} «приводит к« поиску »,« p {tab} {tab} »в« прошлом предыдущем ».

Смежные вопросы