0

我不明白为什么这种方法不起作用。当我输入一个应该通过 if 语句的值时,它不起作用。

def getBase
    puts "What is the base URL for the test?"
    x = gets
    if (x.include? 'http://') && ((x.split('.').at(x.split('.').length - 1).length) == 3)
      return x
    else
      puts "That is in the incorrect format."
      puts "Please format your url like this"
      puts "http://example.com"
      getBase
    end
end

输入' http://test.com '

结果:语句重复并且不退出递归

4

2 回答 2

2

当您获得输入时,它会在末尾gets包含换行符(来自用户点击返回)。\n所以你x实际上是"http://test.com\n"

要摆脱这种用法String#chomp

x = gets.chomp

那应该这样做。

于 2013-06-12T23:23:50.027 回答
1

如果目的是强制执行正确的 URL 格式和/或确保它是 HTTP URL,为什么不使用专门设计的工具呢?Ruby 的URI类是你的朋友:

require 'uri'

URI.parse('http://foo.bar').is_a?(URI::HTTP)
=> true

URI.parse('ftp://foo.bar').is_a?(URI::HTTP)
=> false

URI.parse('file://foo.bar').is_a?(URI::HTTP)
=> false

URI.parse('foo.bar').is_a?(URI::HTTP)
=> false

我会更像这样编写代码:

require 'uri'

def get_base
  loop do
    puts "What is the base URL for the test?"
    x = gets.chomp
    begin
      uri = URI.parse(x)
      return uri.to_s if uri.is_a?(URI::HTTP)
    rescue URI::InvalidURIError
    end
    puts "That is in the incorrect format."
    puts "Please format your URL like this:"
    puts
    puts "    http://example.com"
  end
end

puts "Got: #{ get_base() }"
于 2013-06-13T00:30:34.473 回答