红宝石串法

时间:2012-04-15 21:26:04

标签: ruby

在我的程序中,我想在字符串中添加双字母的方法。我的问题是有一个公共方法吗?例如:

  

'The'TThhee'

这就是我所拥有的:

puts "Please enter text: "
input = gets
letters = input.chomp.to_s
puts "You entered: " + letters + "."

list_letters = letters.split(//)
list = list_letters.join(". ")* 2.to_i  

puts "Your text is made up of the letters: " + list + "."

4 个答案:

答案 0 :(得分:4)

letters.gsub(/(.)/, '\1\1')

甚至更短:

letters.gsub(/./, '\&\&')

更舒服一点:

class String
  def char_duplicate
    self.gsub(/./, '\&\&')
  end
end

puts "abc".char_duplicate #aabbcc
puts "abca".char_duplicate #aabbccaa

您的示例代码会有所不同。也许你想做类似的事情:

 letters.split(//).map{|x| x * 2 }.join

 letters.each_char.map{|x| x * 2 }.join

答案 1 :(得分:3)

只是为了与众不同:

(['The'.each_char.to_a]*2).transpose.join

答案 2 :(得分:1)

你可以在一条线上完成所有这一切,即使有些做作。我已经去注射,因为我认为没有复制空格会很好。

>> "foo bar".chomp.split("").inject([]) { |a,l| l =~ /\S/ ? a << l*2 : a << l }.join("")
=> "ffoooo bbaarr"

编辑:第二个想法,你也可以

>> "foo bar".gsub(/\S/, '\&\&')
=> "ffoooo bbaarr"

去展示我最近做的Ruby有多少=)

答案 3 :(得分:0)

我会像@knut那样做。然而,对于有趣的多样性,还有更多:

irb(main):002:0> s.chars.map{ |c| c*2 }.join
#=> "TThhee"

irb(main):004:0> s.chars.zip(s.chars).join
#=> "TThhee"

irb(main):005:0> s.chars.inject(""){ |d,c| d << c << c }
#=> "TThhee"

irb(main):010:0> "".tap{ |d| s.each_char{ |c| d << c*2 } }
#=> "TThhee"