我做了一个练习,用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)
答案 0 :(得分:8)
方法名称的最佳选择。
你有一些问题;让我们一次拿一个。第一:
undefined local variable or method `abcdefghijklmnopqrstuvwxyz'
编写字符串时,需要将它们包装在''
或""
中。 Ruby正试图将abcdefghijklmnopqrstuvwxyz
解释为letter
或stringarray
之类的变量。所以这应该是这样的:
disemvowel('abcdefghijklmnopqrstuvwxyz')
接下来,uninitialized constant A
。当Ruby尝试评估vowel_caps
和vowel_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"