この記事は何
shellgei160を通じて言語習得 Advent Calendar 2023に参加しています。
書籍「シェル芸ワンライナー160本ノック」の例題をRubyで解いてみて、Rubyの学習に役立てようとするものです。
例題はこちらのリポジトリで公開されているものに限ります。
https://github.com/shellgei/shellgei160
実行環境など
- Docker image: ruby:3.0.2
- 上記リポジトリをクローンした上で、リポジトリのルートディレクトリ直下に
answer-ruby
ディレクトリを作り、その中に解答となるファイルを作成していきます。
今回のテーマ
$ n="XYZ";(for i in {A..C};do n+=$i;echo $n;done);echo $n
XYZ
という文字列に対し、A
からC
を徐々に連結した接尾辞をつけます。ただし元の文字列は変えない。
# output
XYZA
XYZAB
XYZABC
XYZ
解
2パターン考えた。
ふんわりyield
を使うと綺麗に書けそうだなと思ったが、実装が思いつかず諦めた版。
text = 'XYZ'
suffix = 'ABC'
(0..suffix.length - 1).each do |i|
puts text + suffix[0..i]
end
puts text
後から調べてyield
を使ってみた版。
text = 'XYZ'
suffix = 'ABC'
def growing_suffix(suffix)
s = ''
suffix.each_char do |c|
s += c
yield s
end
end
growing_suffix(suffix) do |s|
puts text + s
end
puts text
所感
- クラスを作るほどではないが内部状態を保持したい処理を書くのに
yield
は便利。書きっぷりに慣れる必要がある。