gpt4 book ai didi

ruby - 尝试使用 Ruby while 循环查找字符串的元音

转载 作者:数据小太阳 更新时间:2023-10-29 07:43:11 26 4
gpt4 key购买 nike

def count_vowels(string)
vowels = ["a", "e", "i", "o", "u"]
i = 0
j = 0
count = 0

while i < string.length do
while j < vowels.length do
if string[i] == vowels[j]
count += 1
break
end

j += 1
end

i += 1
end

puts count
end

我无法发现哪里出了问题。如果这个程序遇到辅音,它就会停止。另外,如何使用“.each”方法解决同样的问题?

最佳答案

问题是您永远不会将 j 重置为零。

你的外层 while 循环第一次运行时,即将 string 的第一个字符与每个元音进行比较,j 从0(代表“a”)到 4(代表“u”)。然而,第二次外循环运行时,j 已经是 4,这意味着它随后递增到 5、6、7 等等。 vowels[5]vowels[6] 等的计算结果均为 nil,因此第一个字符之后的字符永远不会被计为元音。

如果将 j = 0 行移动到外部 while 循环中,您的方法将正常工作。


你的第二个问题,关于 .each,表明你已经在沿着正确的路线思考。 while 在 Ruby 中很少见,.each 肯定会有所改进。事实证明,您不能在 String 上调用 .each (因为 String 类不包含 Enumerable ),因此您必须首先使用String#chars方法。这样,您的代码将如下所示:

def count_vowels(string)
chars = string.chars
vowels = ["a", "e", "i", "o", "u"]
count = 0

chars.each do |char|
vowels.each do |vowel|
if char == vowel
count += 1
break
end
end
end

puts count
end

不过,在 Ruby 中,我们有更好的方法来做这类事情。一个特别适合这里的是 Array#count .它获取一个 block 并为数组中的每个项目评估它,然后返回 block 返回 true 的项目数。使用它我们可以编写这样的方法:

def count_vowels(string)
chars = string.chars
vowels = ["a", "e", "i", "o", "u"]

count = chars.count do |char|
is_vowel = false
vowels.each do |vowel|
if char == vowel
is_vowel = true
break
end
end

is_vowel
end

puts count
end

不过,这并没有短多少。我们可以使用的另一个好方法是 Enumerable#any? .它为数组中的每个项目评估给定的 block ,并在找到 block 返回 true 的任何项目时返回 true。使用它可以使我们的代码超短,但仍然可读:

def count_vowels(string)
chars = string.chars
vowels = %w[ a e i o u ]

count = chars.count do |char|
vowels.any? {|vowel| char == vowel }
end

puts count
end

(在这里您会看到我引入了另一个常见的 Ruby 习惯用法,即用于创建数组的“百分比文字”表示法:%w[ a e i o u ]。这是创建数组的常用方法没有所有这些引号和逗号的字符串。你可以 read more about it here .)

做同样事情的另一种方法是使用 Enumerable#include? ,如果数组包含给定项,则返回 true:

def count_vowels(string)
vowels = %w[ a e i o u ]
puts string.chars.count {|char| vowels.include?(char) }
end

...但事实证明,String 也有一个 include? 方法,因此我们可以改为这样做:

def count_vowels(string)
puts string.chars.count {|char| "aeiou".include?(char) }
end

还不错!但我把最好的留到最后。 Ruby 有一个很棒的方法叫做 String#count :

def count_vowels(string)
puts string.count("aeiou")
end

关于ruby - 尝试使用 Ruby while 循环查找字符串的元音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26769800/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com