显示交替大写和小写的代码仅返回小写?

时间:2014-03-18 01:58:12

标签: ruby if-statement methods

我正在尝试编写一个函数,将字符串显示为交替的大写和小写字母。

例如:

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

此代码仅以小写形式返回字符串。

3 个答案:

答案 0 :(得分:1)

"My name is ballouta!"
.gsub(/\w/).with_index{|s, i| i.even? ? s.upcase : s.downcase}
# => "My NaMe Is BaLlOuTa!"

答案 1 :(得分:0)

您正在使用upcasedowncase,两者都会返回更改后的值(您未保存和使用)。

就地替代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)没问题。