Pythonでは文字列s
に対しs[a:b:n]
とするとs
のa
番目からb
番目の1個手前までn
個飛ばしで文字が取り出される。
一方Rubyの文字列クラスにもslice
メソッドがあり、
'abcdefg'.slice(1...5)
または
'abcdefg'[1...5]
はPythonの
'abcdefg'[1:5]
と同様であるが"n個飛ばし"はできない。
考えた強引なやり方
- まず
a
番目からb
番目の1個手前までの部分文字列を取り出す - 部分文字列から
インデックス%n==0
となる文字を取り出して繋げる(mapとjoinを使う)
例えばPythonでの'abcdefg'[1:5:3]
はRubyでは以下のように書ける。
'abcdefg'[1...5].each_char.with_index.map { |c, idx| c if idx%3==0 }.join
idx%3==0
は(idx%3).zero?
でも可。また、2つ飛ばしならidx.even?
とも書ける。
別解
コメントでEnumerator::ArithmeticSequenceを使った方法を教えていただきました。
str = 'abcdefg'
(1...5).step(3).map{ |i| str[i] }.join