为什么这个ruby代码不会返回任何内容?

时间:2016-04-23 14:26:13

标签: ruby

我正在尝试取一个数字并返回一个带有任何奇数的破折号的字符串。此外,字符串不应以短划线开头或结尾。

我写了以下内容,但它没有返回任何内容:

def dasherize_number(num)
  string = num.to_s
  i = 0

  while i<string.length
    if (string[i].to_i % 2) != 0
      string[i] = '-' + string[i] + '-'
    end
    i += 1
  end

  if string[0] == '-'
    string.pop(1)
  end

  if (string.length - 1) == '-'
    string.pop(1)
  end

  string
end

如果我理解正确,它似乎无限循环;控制台没有显示输出,除非我刷新,否则不允许我做任何其他事情。我已经按每个角色审查了代码,但我无法确定它出错的地方。

2 个答案:

答案 0 :(得分:1)

您的代码中存在许多逻辑问题。 这里可能适合你的东西

def dasherize_number(num)
  string = num.to_s
  str_len = string.length

  i = 0

  while i < str_len
    next if string[i] == '-'
    if (string[i].to_i % 2) != 0
      string[i] = '-' + string[i] + '-'
      str_len = string.length
      i += 3
    else
      i += 1
    end
  end

  if string[0] == '-'
    string = string[1..-1]
  end

  if (string[string.length - 1]) == '-'
    string = string[0..-2]
  end

  string.gsub('--', '-')
end

<强>释

  1. 首先,你在while循环i < string.length中遇到了这种情况 哪个不起作用,因为字符串的长度不断变化。所以我已经使用变量来存储值,并在字符串更新时更新变量。

  2. 如果字符串已更新,我们可以确定我们可以跳过下两个索引。 例如:数字输入 - &gt; 122 然后在第一次迭代后,字符串将是-1-22 所以我们不想为下一个索引运行相同的条件,因为那将是1,因此是无限循环。 (希望你明白这一点)

  3. pop不会在字符串上工作,只是因为我们可以使用像数组这样的索引访问字符,我们无法使用pop作为字符串。

  4. 为确保没有连续短划线,我已使用gsub将其替换为单个破折号。

答案 1 :(得分:0)

问题似乎出现在代码的这一部分:

while i<string.length
    if (string[i].to_i % 2) != 0
        string[i] = '-' + string[i] + '-'
    end
    i += 1
end

如果您的string包含奇数,则会将其长度增加2个字符(2x -),但会将其增加1(i+=1)。

将初始字符串长度分配给var并在while循环中检查其长度。

string_length = string.length

while i < string_length
    if ((string[i].to_i % 2) != 0)
        string[i] = '-' + string[i] + '-'
    end
    i += 1
end