调试ruby算法
我试图将字符串中每个单词的第二个字母大写。例如,如果字符串是how are you,它应该返回[0,R,0],但是我得到的是['nil','nil','nil']。为什么我得零分?我做错什么了吗调试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
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}