替换字符串中的所有元音

时间:2016-03-08 12:01:06

标签: ruby string

我做了一个练习,用X替换字符串中的任何元音。以下内容返回错误。我不知道为什么。我不想使用String#replace

def disemvowel (string)
  vowels_caps = [A, E, I, O, U]
  vowels_notcaps = [a, e, i, o, u]

  stringarray = string.split("")

  stringarray.each do |letter|
    if vowels_caps.include? letter or vowels_notcaps.include? letter
        letter = "X" 
    end
  end

  string = stringarray.join("")

  string
end

disemvowel(abcdefghijklmnopqrstuvwxyz)

3 个答案:

答案 0 :(得分:8)

方法名称的最佳选择。

你有一些问题;让我们一次拿一个。第一:

undefined local variable or method `abcdefghijklmnopqrstuvwxyz'

编写字符串时,需要将它们包装在''""中。 Ruby正试图将abcdefghijklmnopqrstuvwxyz解释为letterstringarray之类的变量。所以这应该是这样的:

disemvowel('abcdefghijklmnopqrstuvwxyz')

接下来,uninitialized constant A。当Ruby尝试评估vowel_capsvowel_notcaps

时,会出现同样的问题
vowels_caps = ['A', 'E', 'I', 'O', 'U']

创建字符串数组很常见,所以使用%w的简写可以轻松创建一个由空格分隔的单词数组:

vowels_caps = %w[A E I O U]
vowels_notcaps = %w[a e i o u]

现在你运行脚本,但似乎没有任何反应。确保打印输出:

puts disemvowel('abcdefghijklmnopqrstuvwxyz')

很好,所以有一些输出,但它只是字母表。这里的失败是您希望letter = "X"替换stringarray内的字母,但事实并非如此。 letter是它自己的变量,独立于stringarray - 它不是指向数组本身的指针。有几种方法可以解决这个问题,但我认为最明确的可能是从each切换到map,因为您之后已经尝试join结果。 each返回原始数组的位置,map返回一个包含每次迭代结果的数组。

resultarray = stringarray.map do |letter|
  if vowels_caps.include? letter or vowels_notcaps.include? letter
    "X"
  else
    letter
  end
end
puts resultarray.inspect

我只是暂时将那张照片放在那里,以确认X确实为每个元音加了下:

["X", "b", "c", "d", "X", "f", "g", "h", "X", "j", "k", "l", "m", "n", "X", "p", "q", "r", "s", "t", "X", "v", "w", "x", "y", "z"]

作为旁注 - 这可能偶尔会引发一场战争 - 你应该在布尔逻辑中优先||而不是or。运营商have different precedence并以can surprise you方式使用or

if vowels_caps.include?(letter) || vowels_notcaps.include?(letter)

现在只需join就可以像往常一样备份,而且实际上没有必要将其重新分配给string。 Ruby返回函数中最后一个表达式的值,它可以是:

resultarray.join("")

瞧!

$ ruby disemvowel.rb
XbcdXfghXjklmnXpqrstXvwxyz

答案 1 :(得分:2)

应该这么简单。使用String#tr

'abcdefghijklmnopqrstuvwxyz'.tr('aeiouAEIOU', 'X')
#=> "XbcdXfghXjklmnXpqrstXvwxyz"

'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.tr('aeiouAEIOU', 'X')
#=> "XBCDXFGHXJKLMNXPQRSTXVWXYZXbcdXfghXjklmnXpqrstXvwxyz"

答案 2 :(得分:2)

str = "abcdefghijklmnopqrstuvwxyz"
str.gsub(/[aeiou]/i, 'x')
# => "xbcdxfghxjklmnxpqrstxvwxyz"