ruby 显示交替的大写和小写的代码是否只返回小写?

siv3szwd  于 2022-11-04  发布在  Ruby
关注(0)|答案(3)|浏览(180)

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

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

此代码将字符串返回为小写ONLY。

6bc51xsx

6bc51xsx1#

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

# => "My NaMe Is BaLlOuTa!"
x8goxv8g

x8goxv8g2#

您使用的是upcasedowncase,这两个函数都返回修改后的值(您没有保存和使用该值)。
就地替代upcase!downcase!可以帮助您解决这个问题。

shstlldc

shstlldc3#

编辑:我看到@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)就可以了。

相关问题