Возможно ли преобразовать параметры в ruby ​​/ irb? - PullRequest
2 голосов
/ 12 марта 2011

Я новичок в ruby ​​... интересно, возможно ли следующее:

В настоящее время я запускаю тестовое приложение в irb (irb -r test.rb) и выполняю вручную различные команды, реализованные в test.rb. Одна из этих функций в настоящее время реализована следующим образом:

def cli(cmd)
  ret=$client.Cli(cmd)
  print ret, "\n"
end

Где $client.Cli() принимает строку. В настоящее время я набираю следующее в приглашении IRB > cli "some command with parameters"

Это отправляется через сокет, и результаты возвращаются

Я бы хотел сделать это БЕЗ кавычек. Это было бы только для этой команды Есть ли способ сделать это вообще в ruby? если нет, то как бы вы расширили irb для этого?

Для тех, кто знает «С», это будет выглядеть следующим образом:

#define CLI(CMD) cli(#CMD)
CLI(Quadafi and Sheen walk into a bar...)

где предварительно обработанный вывод:

cli("Quadafi and Sheen walk into a bar...")

Спасибо

Ответы [ 2 ]

2 голосов
/ 12 марта 2011

Вы могли бы на самом деле обезопасить исправление метода gets классов IRB::StdioInputMethod и IRB::ReadlineInputMethod и выполнить перезапись, если вызывается метод cli, добавив в файл test.rb следующее:

module IRB
  def self.add_quotes(str)
    str.gsub(/^cli (..+?)(\\+)?$/, 'cli "\1\2\2"') unless str.nil?
  end

  class StdioInputMethod
    alias :old_gets :gets

    def gets
      IRB::add_quotes(old_gets)
    end
  end

  class ReadlineInputMethod
    alias :old_gets :gets

    def gets
      IRB::add_quotes(old_gets)
    end
  end
end

Таким образом, любая входная строка, соответствующая cli ..., будет заменена на cli "..." до ее оценки.

0 голосов
/ 12 марта 2011

Я не думаю, что это возможно, потому что команда, которую вы набираете для irb, должна анализировать как ruby, и все эти голые слова будут сообщать об ошибках вроде этого:

NameError: undefined local variable or method `hello' for main:Object

(Моя первая попытка,Я просто назвал это через cli hello.)

Но если вы не возражаете против более радикальных изменений, вы можете сделать что-то вроде этого:

$ cat /tmp/test_cases
hello world
one
two
three
riding the corpse sled

$ ruby -e 'def f(arg) puts arg end' -ne 'f($_)' < /tmp/test_cases
hello world
one
two
three
riding the corpse sled

Я просто определил простую функциюf() здесь показано, как это работает;Вы можете заменить f($_) на $Client.cli($_) и установить глобальную переменную $Client в первом аргументе -e.И вы можете пропустить < /tmp/test_cases, если вы хотите ввести их в интерактивном режиме:

$ ruby -e 'def f(arg) puts arg end' -ne 'f($_)'
hello
hello
world
world

Конечно, если вы хотите, чтобы он был более продвинутым, чем я, я бы просто написал скрипт дляделайте все, а не создавайте что-то отвратительное из команд -pe или -ne.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...