【问题标题】:Code to display alternating upper and lower-case returns lower-case only?显示交替大写和小写的代码仅返回小写?
【发布时间】:2014-04-23 12:33:35
【问题描述】:

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

例如:

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

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

【问题讨论】:

  • 你想要b.upcase!b.downcase!,而不是b.upcaseb.downcase
  • 你应该编辑把class String放在开头,end放在最后。在将!(“bang”)添加到upcasedowncase 之后,您的代码将可以工作,但它可以变得更像Ruby 并进行了相当大的改进。
  • "My name is ballouta!".chars.map.with_index { |ch,i| i.even? ? ch.upcase : ch }.join # => "My nAmE Is bAlLoUtA!" 如果替换中包含空格

标签: ruby if-statement methods


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

【讨论】:

    【解决方案2】:

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

    就地替代品upcase!downcase! 可以帮助您。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2016-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-15
        • 2012-11-13
        相关资源
        最近更新 更多