LoginSignup
0
0

Ruby芸160チャレンジ(#16)内部状態を保持しながら処理を繰り返す

Last updated at Posted at 2023-12-15

この記事は何

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は便利。書きっぷりに慣れる必要がある。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0