Как я могу проверить мою строку ввода? - PullRequest
2 голосов
/ 20 июня 2011

Вот мой код:

loop do
  print "Input word: "
  word = gets.chomp
  if word.nil? or word.empty?
    puts "Nothing to input."
  else
    if word.index(":") != -1
      puts "Illegal character ':'"
    else
      break
    end
  end
end

Есть ли более элегантный способ проверки входной строки?

Ответы [ 4 ]

7 голосов
/ 20 июня 2011

Как то так?

loop do
  print "Input word: "
  word = gets.chomp

  if word.empty?
    puts "No input."
  elsif word.include?(":")
    puts "Illegal character ':'"
  else
    break
  end
end
2 голосов
/ 21 июня 2011

Это отделяет сложную логику от IO

def validation_message_for_word(word)
  case
  when (word.nil? or word.empty?) then "Nothing to input."
  when word.include?(":") then 'Illegal character ":".'
  else nil
  end
end

word = nil # To ensure word doesn't get thrown away after the loop
loop do
  print "Input word: "
  word = gets.chomp
  validation_message = validation_message_for_word(word)
  break if validation_message.nil?
  puts validation_message
end

Теперь, если вы хотите выполнить его модульное тестирование, вы можете присвоить validation_message_for_word различные строки и проверить возвращаемое значение.

Если вам нужна интернационализация, вы можете сделать

def validation_type_for_word(word)
  case
  when (word.nil? or word.empty?) then :no_input
  when word.include?(":") then :illegal_character
  else nil
  end
end

def validation_message(language, validation_type)
  {:en => {:no_input => "No input", :illegal_character => 'Illegal character ":"'},
   :lolcat => {:no_input => "Invizibl input", :illegal_character => 'Character ":" DO NOT LIEK'}}.fetch(language).fetch(validation_type)
end

word = nil # To ensure word doesn't get thrown away after the loop
loop do
  print "Input word: "
  word = gets.chomp
  validation_type = validation_type_for_word(word)
  break if validation_type.nil?
  puts validation_message(:lolcat, validation_type)
end
0 голосов
/ 20 июня 2011

Зависит от того, что «элегантный» означает для вас, но как фанат рефакторинга условных операторов в легко читаемые извлеченные методы, я бы посмотрел на что-то вроде:

def has_valid_input(word)
  return true unless word.include?(":")
  puts "Illegal." 
  return false
end

def is_not_empty(word)
  return true unless word.empty?
  puts "empty"
  return false
end

loop do
  print "Input word: "
  word = gets.chomp
  break if is_not_empty(word) && has_valid_input(word)
end
0 голосов
/ 20 июня 2011

Лично я предпочитаю избегать вложенных, если / иначе:

loop do
    print "Input word: "
    word = gets.chomp
    if word.nil? or word.empty?
        puts "Nothing to input."
        #break, exit, nothing, or whatever ....
    end
    if word.index(":") != 0
        puts "Illegal character ':'"
    else
        break
    end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...