Функция получает Ruby не будет принимать пустую строку более одного раза - PullRequest
2 голосов
/ 02 декабря 2008

Я пытаюсь написать простую функцию ruby, которая может запрашивать у пользователя значение, и если пользователь сам нажимает клавишу ВВОД, используется значение по умолчанию. В следующем примере первый вызов функции Prompt может быть обработан нажатием клавиши ENTER, и будет использовано значение по умолчанию. Тем не менее, во второй раз, когда я вызываю Prompt и нажимаю ENTER, ничего не происходит, и оказывается, что мне нужно нажать какой-то другой символ, прежде чем ENTER, чтобы вернуться из вызова get.

Должен быть какой-то способ очистить входной буфер, чтобы избежать этой проблемы. Кто-нибудь знает, что делать?

Спасибо

David

def BlankString(aString)
   return (aString == nil) ||
          (aString.strip.length == 0)
end


#Display a message and accept the input
def Prompt(aMessage, defaultReponse = "")
   found = false
   result = ""
   showDefault = BlankString(defaultReponse) ? "" : "(#{defaultReponse})"
   while not found
      puts "#{aMessage}#{showDefault}"
      result = gets.chomp
      result.strip!
      found = result.length > 0
      if !found
         then if !BlankString(showDefault)
                 then
                    result = defaultReponse
                    found = true
              end
      end
   end

   return result
end


foo = Prompt("Prompt>", "sdfsdf")
puts foo

foo = Prompt("Prompt>", "default")
puts foo

Ответы [ 4 ]

1 голос
/ 02 декабря 2008

Я попробовал ваш код (под Windows), и он, кажется, работает нормально. Какую ОС вы используете?

1 голос
/ 02 декабря 2008

Технически это не ответ, но в любом случае он вам поможет: используйте Highline (http://highline.rubyforge.org/),, это сэкономит вам много горя, если вы создадите интерактивный интерфейс командной строки, подобный этому

0 голосов
/ 02 декабря 2008

Я подтвердил (запустив программу за пределами Komodo), что проблема фактически возникает исключительно внутри Komodo. Я благодарю всех за обратную связь и за то, что нашли время для проведения независимого теста (который я не имел, хотя), чтобы помочь сузить проблему.

0 голосов
/ 02 декабря 2008

Я также попробовал ваш код (под OSX) с ruby ​​1.8.6, и он работал нормально:

:! ruby prompt.rb
Prompt>(sdfsdf)

sdfsdf
Prompt>(default)

default

Что вы получаете, когда запускаете следующее?

c = gets
b = gets
a = gets
p [ a, b, c ]

Я просто нажимаю "Enter" 3 раза и получаю

["\n", "\n", "\n"]

Я предполагаю, что неправильно в том, что вы вводите бесконечный цикл в своем выражении while, не передавая ему defaultResponse (в каком-то коде, который вы фактически запускаете, которого нет в вашем примере).

...