在Ruby中使用循环修改字符串

在Ruby中使用循环修改字符串,ruby,Ruby,我有一个字符串数组。我需要检查字符串是否包含字母“s”。如果是,我必须将其替换为“th” 基本上,就这些 n = gets.to_i word = "" words = Array.new(n) for i in 1..n word = gets words.push(word) end for w in 1..words.size for i in 0..word.length if w[i] == "s" w[i] = "th"

我有一个字符串数组。我需要检查字符串是否包含字母“s”。如果是,我必须将其替换为“th”

基本上,就这些

n = gets.to_i
word = "" 
words = Array.new(n)
for i in 1..n
    word = gets
    words.push(word)
end

for w in 1..words.size
   for i in 0..word.length
        if w[i] == "s"
        w[i] = "th"
        end
    end
end

puts words

它什么都不替换(只返回输入),我不知道为什么。

看起来您刚刚开始使用Ruby,下面是一些提示。这里最明显的问题是使用
for
,这听起来很奇怪,但在Ruby中几乎从未使用过。
each
enumerator和friends几乎完全用于迭代对象,而且它们更好,因为它们所做的远远不止是简单的迭代<代码>每个带有索引的\u和
每个带有对象的\u都是必需的

您还使用了许多中间变量,这些变量实际上不提供任何功能,如果将它们折叠在一起,代码将更加整洁

例如,要从标准输入中获取单词列表:

words = $stdin.readlines.map(&:chomp)
它接收所有输入行,并在每行上运行
chomp
,删除任何换行符

如果要重新编写此列表以将
s
替换为
th
,请执行以下操作:

words.map! do |word|
  word.gsub(/s/, 'th')
end
gsub
方法通常用字符串替换正则表达式匹配项。在本例中,它与字母
s
匹配。这些可能会变得更加复杂,我强烈建议你们看看它们,至少了解它们能做些什么。这是一个棘手的,但微妙的强大的工具,将随时派上用场


记住Ruby有非常特殊的文档。如果您有一个String类型的对象,字符串可以执行的所有方法都将在中详细说明。不要羞于检查,这里有很多非常有用的工具。

为什么要
gsub(/s/,'th')
而不是
gsub(/s/,'th')
?@CarySwoveland最好尽早了解正则表达式,不要永远对它们感到困惑和害怕,仅此而已。用火审判@塔德曼给出了一个很好的答案,但以后考虑在选择答案之前等待更长时间。快速选择可能会阻碍其他答案,并使仍在处理答案的答案短路。不用着急。这里的许多人在做出选择之前至少要等上几个小时,有些人要等更长的时间。