调试ruby算法

调试ruby算法,ruby,Ruby,我试图将字符串中每个单词的第二个字母大写。例如,如果字符串是how are you,它应该返回[0,R,0],但是我得到的是['nil','nil','nil']。为什么我得零分?我做错什么了吗 def capitalize(string) words = string.split(" ") index = 0 words.each do|word| break if index == words.length p word[index][1].inspect

我试图将字符串中每个单词的第二个字母大写。例如,如果字符串是how are you,它应该返回[0,R,0],但是我得到的是['nil','nil','nil']。为什么我得零分?我做错什么了吗

def capitalize(string)
  words = string.split(" ")
  index = 0
  words.each do|word|
    break if index == words.length
    p word[index][1].inspect
    index += 1
  end
end

capitalize("how are you")

让我们看看这里发生了什么:

index = 0
words.each do |word|
  break if index == words.length
  p word[index][1].inspect
  index += 1
end
在第一次迭代中,word将是how,index将是0,因此您正在执行p word[0][1]。检查。[0]是h,而h[1]是nil,因为字符串h只有一个字符

在第二次迭代中,单词是,索引是1。are[1]是r,r[1]也是零

等等。在每次迭代中,您从word中提取一个字符,然后尝试获取该字符串的第二个字符,该字符始终为零

我怀疑这就是你想要做的:

index = 0
loop do
  break if index == words.length
  p words[index][1]
  index += 1
end
看到区别了吗?它打印单词[index][1],而不是单词[index][1],并一直循环,直到index==words.length为真

然而,由于Ruby有Enumerableeach,您可以让它为您完成迭代单词的工作,并且您根本不需要担心索引。这就是你想要的:

words.each do |word|
  p word[1]
end

另外,您会注意到我使用的是p字[1],而不是p字[1]。请检查。p方法将自动对其每个参数调用inspect。如果您使用p word[1].inspect,您基本上就是在使用puts word[1].inspect.inspect。

让我们看看这里发生了什么:

index = 0
words.each do |word|
  break if index == words.length
  p word[index][1].inspect
  index += 1
end
在第一次迭代中,word将是how,index将是0,因此您正在执行p word[0][1]。检查。[0]是h,而h[1]是nil,因为字符串h只有一个字符

在第二次迭代中,单词是,索引是1。are[1]是r,r[1]也是零

等等。在每次迭代中,您从word中提取一个字符,然后尝试获取该字符串的第二个字符,该字符始终为零

我怀疑这就是你想要做的:

index = 0
loop do
  break if index == words.length
  p words[index][1]
  index += 1
end
看到区别了吗?它打印单词[index][1],而不是单词[index][1],并一直循环,直到index==words.length为真

然而,由于Ruby有Enumerableeach,您可以让它为您完成迭代单词的工作,并且您根本不需要担心索引。这就是你想要的:

words.each do |word|
  p word[1]
end

另外,您会注意到我使用的是p字[1],而不是p字[1]。请检查。p方法将自动对其每个参数调用inspect。如果您使用pWord[1].inspect,那么您基本上就是在使用puts word[1].inspect.inspect。

一个非常简单且干净的解决方案是

def capitalize(string)
  words = string.split(" ")
  words.each_with_index.map do |word, index|
    if index % 2 == 0
        0
    else
        word[1].swapcase
    end
  end
end

capitalize("how are you")

您可以在这里尝试一下

一个非常简单干净的解决方案是

def capitalize(string)
  words = string.split(" ")
  words.each_with_index.map do |word, index|
    if index % 2 == 0
        0
    else
        word[1].swapcase
    end
  end
end

capitalize("how are you")

您可以在这里试用它

@Jordan在检查代码和解释问题方面做得很好

一种选择是使用正则表达式:

R = /
    (?<=     # begin a positive lookbehind
      \b     # match a word break
      [a-z] # match a lower-case letter
    )        # end positive lookbehind
    [a-z]   # match a lower-case letter
    /ix      # case-insensitive (i) and free-spacing regex definition (x) modes

def capitalize(str)
  str.gsub(R) { |c| c.upcase }
end

capitalize("how are you")
  #=> "hOw aRe yOu"

@Jordan在检查代码和解释问题方面做得很好

一种选择是使用正则表达式:

R = /
    (?<=     # begin a positive lookbehind
      \b     # match a word break
      [a-z] # match a lower-case letter
    )        # end positive lookbehind
    [a-z]   # match a lower-case letter
    /ix      # case-insensitive (i) and free-spacing regex definition (x) modes

def capitalize(str)
  str.gsub(R) { |c| c.upcase }
end

capitalize("how are you")
  #=> "hOw aRe yOu"

此处应提供一个班轮:

"how are you".split(" ").map{ |w| w[1].capitalize }
=> ["O", "R", "O"]

此处应提供一个班轮:

"how are you".split(" ").map{ |w| w[1].capitalize }
=> ["O", "R", "O"]

谢谢你的帮助!现在知道了。很高兴能帮忙!如果我的答案解决了你的问题,请随意接受我的答案……但不要急于选择答案,OP也不想阻止其他答案,也不想让那些仍在研究答案的人短路。很多人至少要等上几个小时。施翰,点击你想要接受的答案左边的灰色复选标记。有关您需要了解的其他内容,请参阅。谢谢您的帮助!现在知道了。很高兴能帮忙!如果我的答案解决了你的问题,请随意接受我的答案……但不要急于选择答案,OP也不想阻止其他答案,也不想让那些仍在研究答案的人短路。很多人至少要等上几个小时。施翰,点击你想要接受的答案左边的灰色复选标记。有关您需要知道的其他内容,请参阅。很抱歉,输入错误,它不是0,返回值应该是[O,R,O],替换为“Letter O'sSorry关于输入错误,它不是0,返回值应该是[O,R,O],替换为“Letter O”,这只是您可能感兴趣的另一种方式string=how you then string.split.map.with_index{| s,i | i%2!=0?s[1]。大写:s=0}这是您可能感兴趣的另一种方式string=您当时怎么样string.split.map。使用{u索引{| s,i | i%2!=0?s[1]。大写:s=0}