2012-04-15 7 views
0

私のプログラムでは、文字列に2文字のメソッドを追加したいと思います。私の質問はそれに公開方法がありますか?たとえば:ruby​​ string method

'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
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 
+2

'グループ。 –

+0

@AndrewMarshallありがとう、私は私の答えを採用 – knut

1

あなたもやや不自然な場合は、単一のラインにそれをすべて行うことができます。おそらく、あなたのような何かをやってみたかったです。私はスペースを複製していいのではないと思ったので注射のために行った。

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

EDIT:考え直しで、あなたもちょうど

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

私は最近=やった方法を少しルビー示すことを行くことができます)

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" 
3

だけ異なるようにする:GSUB(/./、 '\&\&')は `一致する必要がなくなり

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