Ruby中的递归并不像我认为的那样工作

时间:2013-06-12 23:08:54

标签: ruby recursion

我不明白为什么这种方法不起作用。当我输入一个应该传递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'

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

2 个答案:

答案 0 :(得分:2)

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

要摆脱这种使用String#chomp

x = gets.chomp

应该这样做。

答案 1 :(得分: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() }"