0

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

'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

4 回答 4

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
于 2012-04-15T21:29:23.167 回答
3

只是要与众不同:

(['The'.each_char.to_a]*2).transpose.join
于 2012-04-15T21:41:38.850 回答
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 =)

于 2012-04-15T21:36:38.853 回答
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"
于 2012-04-15T21:40:56.287 回答