読者です 読者をやめる 読者になる 読者になる

テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

Rubyでunixのpipeのようなことをする

Rubyを知っておくと大変便利だ. 転職活動においてプログラミングテストを受ける時, ある場合はC++が使えることもあるが, ある場合はダメなこともある. また, TLEとは疎遠なところでマシな実用コードを書く場合もあり, この場合は関数的に書くのが良い. 従ってRubyは良い選択肢になる.

Rubyの流れるスタイルは美しい. グラサンをしたマーチン・ファウラーが流れるプールで浮き輪に乗りながらコーディングをしている姿を想像してみよう. さて, 流れるスタイルはirbとの相性が良いことが特徴だ. 流れるスタイルは一行で書くことが出来るため, irb上でコードを書いてから本番のコードに持ってくるという開発スタイルが容易となる. パイプ演算子は, Haskell, OCaml, Elixirなどの関数型言語で提供されていて, 特にElixirではある本のタイトルになってしまうほど尊ばれている.

tapメソッドは, デバグに使うことを主目的として提供されている. これはpipeを流れるオブジェクトを受け取り, ブロックに渡す. そして渡ってきたオブジェクトをそのまま返す. 主な目的は, pなどを使ってプリントデバグをすることであり, たぶん99%はこのように使われている.

あなたがいつまでも働かずに流れ続けたい場合も, tapメソッドは役に立つ.

require "set"
[1,2,3].map{|e| e*2}.tap{|e| break Set.new(e)}

このコードは, 2,4,6のセットを返す. そしてRubyは流れるスタイルを推奨しているためSetの追加削除などのメソッドは自分自身や新しいSetを返す. 従っていつまでも流れ続けることが出来る.

breakを使うのが肝だ. この技法Twitterで@yancya氏から教えてもらった. applyやcall, dispatch, pipeなどのメソッドがないかと調べてみたが見つからない. Twitterで公開質問をしたところ, 5分程度でさくっと返ってきた. breakを使うのは, 引数をそのまま戻り値とする仕様であることと, tapのコードがyieldに達する前に抜けることが出来るからだ.

SNSは尊い. SNSは危険な一面もあるが, エンジニアの情報収集にとってはもはや欠かせないツールとなっており, 禁じるのは一切の合理性を欠く.