我正在尝试编写一个函数,将字符串显示为交替的大写和小写字母。
例如:
str= "My name is ballouta!"
==> My NaMe Is BaLlOuTa!
我的代码是:
def alt_case
flag = 0
str = ''
self.scan(/./) do |b|
if flag == 0
b.upcase ;
flag = 1
str = str + b
else
b.downcase
flag = 0
str = str + b
end #end if
end #end do
str
end #end method
此代码仅以小写形式返回字符串。
答案 0 :(得分:1)
"My name is ballouta!"
.gsub(/\w/).with_index{|s, i| i.even? ? s.upcase : s.downcase}
# => "My NaMe Is BaLlOuTa!"
答案 1 :(得分:0)
您正在使用upcase
和downcase
,两者都会返回更改后的值(您未保存和使用)。
就地替代upcase!
和downcase!
可能会帮助您。
答案 2 :(得分:0)
编辑:在我发布之前,我看到@bjhaid在评论中提出了与我相同的解决方案。我会回答我提供的解释。
现在您的问题已经得到解答,让我建议一种更改代码的方法,使其更像Ruby:
class String
def alt_case
split.map { |w| w.chars.map.with_index{ |s,i|
i.even? ? s.upcase : s.downcase }.join }.join(' ')
end
end
"My name is ballouta!".alt_case #=> "My NaMe Is BaLlOuTa!"
以下是其工作原理:
self #=> "My name is ballouta!" (default receiver)
a = self.split #=> ["My", "name", "is", "ballouta!"]
b = a.map { |w| w.chars.map.with_index{ |s,i|
i.even? ? s.upcase : s.downcase }.join }
#=> ["My", "NaMe", "Is", "BaLlOuTa!"]
b.join(' ') #=> "My NaMe Is BaLlOuTa!"
在计算b
时,请考虑w => "name"
:
c = w.chars #=> ["n", "a", "m", "e"]
d = c.map.with_index{ |s,i| i.even? ? s.upcase : s.downcase }
#=> ["N", "a", "M", "e"]
d.join #=> "NaMe"
我将此方法添加到String类只是因为这就是你所做的,但总的来说我不建议这样做; alt_case(string)
没问题。