【问题标题】:why does this ruby code not return anything?为什么这个红宝石代码不返回任何东西?
【发布时间】:2016-04-23 14:26:13
【问题描述】:

我正在尝试获取一个数字并返回一个字符串,其中包含任何奇数周围的破折号。此外,字符串不应以破折号开头或结尾。

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

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

如果我理解正确,它似乎在无限循环;控制台不显示任何输出,除非我刷新,否则不允许我做任何其他事情。我已经按每个字符查看了代码,但我不知道哪里出了问题。

【问题讨论】:

  • 正如作者在他/她的问题中提到的,该方法已在控制台中调用。 @ hac13 请参阅下面的答案。问题似乎出在while 循环中。
  • @Uzbekjon OP 在哪里说该方法已在控制台中调用?
  • 我不太确定“调用”一个方法是什么意思,但如果它意味着运行它 - 我已经输入了 'dasherize_number(4567)' 并且控制台不允许我做很多其他事情
  • @hac13 你必须在问题中写下。
  • 糟糕。对不起。以后会记得这样做。

标签: ruby


【解决方案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 &lt; string.length 这是行不通的,因为字符串的长度不断变化。所以我使用了一个变量来存储值并在字符串更新时更新变量。

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

  3. pop 不适用于字符串,因为我们可以使用索引(如数组)来访问字符,但我们不能将pop 用于字符串。

  4. 为了确保没有连续的破折号,我使用gsub 将它们替换为单个破折号。

【讨论】:

  • 这一切都说得通。我现在看到了。唯一的麻烦是当有两个奇数相邻时,我会得到一个额外的破折号。没有说清楚是我的错。当我调用 (333) 的函数时,我得到 '3--3--3' 而不是 '3-3-3';中间只需要一个破折号。
  • @hac13 请查看最后的编辑。这应该删除连续的破折号
  • 魔术!那是缺失的部分,又学到了另一个新东西
  • 试过了,但不幸的是直到我有 15 分才算数
【解决方案2】:

问题似乎出在这部分代码中:

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

【讨论】:

  • 你测试过这段代码吗?我想这里给你一个惊喜……:)
  • 不,我没有。我只是指出了我可以发现的逻辑问题。剩下的,我认为,是问题作者的工作。但是,现在你让我感兴趣了! :) 分享一下你还能发现什么?
  • 我明白了……() 周围的 if!是的! :)
  • 我没看到。你指的是第 5 行吗?
  • @Uzbekjon 好点。这正是问题所在。我认为由于 string.length 现在大于 string_length 我不会遍历整个字符串。例如,如果字符串是“12”,那么循环将通过“1-”而不是“2”。我认为最好的方法是将字符存储在另一个变量中。
猜你喜欢
  • 2023-03-07
  • 1970-01-01
  • 2011-07-25
  • 1970-01-01
  • 2023-02-07
  • 2023-03-30
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多