Ruby修改一段字符串

时间:2013-04-07 17:45:16

标签: ruby string

Ruby的新手。这是一个简单的家庭作业。 secret_code函数需要接受输入字符串并执行以下操作:

  1. 在空格前的第一个字母块中,除了第一个字符之外的所有字母
  2. 反转字符串
  3. 因此,如果输入为“super duper”,则输出应为“repud REPUs”。

    我将函数编码如下:

    def secret_code(input) 
      input.split(" ").first[1..-1].each_char do |i|
        input[i] = i.upcase
      end
      return input.reverse
    end
    

    它通过了单元测试,但我想知道是否有更好的方法来编码它。是否可以避免使用循环?我试过了

    return input.split(" ").first[1..-1].upcase.reverse
    

    但这并没有奏效。任何关于如何清理它的想法都值得赞赏!

5 个答案:

答案 0 :(得分:8)

"super duper".sub(/(?<=.)\S+/, &:upcase).reverse

答案 1 :(得分:3)

这个怎么样:

def secret_code(input)
  first_space = input.index(' ')
  (input[0] + input[1...first_space].upcase + input[first_space..-1]).reverse
end

请注意,在Ruby中,始终返回方法中的最后一个表达式,因此您可以省略最终的return

答案 2 :(得分:1)

s = "super duper"

words = s.split(' ')
words.first[1..-1] = words.first[1..-1].upcase
words.each { |word| word.reverse! }
s = words.reverse.join(' ')
puts s # => repud REPUs

答案 3 :(得分:1)

不一定更好,但可以肯定的是,它可以在没有循环的情况下完成......

def f x
  (b = [(a = x.split)[0].upcase, *a.drop(1)].join(' ').reverse)[-1] = x[0, 1]
  return b
end

答案 4 :(得分:1)

您可以尝试以下方法:

a = "super duper"
p a.gsub(a.split[0...1].join(' '),a.split[0...1].join(' ').capitalize.swapcase).reverse

输出:

"repud REPUs"