koheitakahashiのブログ

2020.07.01にプログラマーとして生を受けた私が学んだことや、日常について徒然に書いていきます。

Rubyでwcコマンドを作成しました。

はじめに

Fjordbootcampで「Rubyでwcコマンドを作ろう」という課題がありました。なんとか提出物にOKをもらえたので、新しく学んだことや感想を書きたいと思います💪

wcコマンドとは?

ターミナルのwcコマンドとは、コマンドに渡したファイルの行数、単語数、バイト数を表示してくれるというコマンドです。もし、ファイルが渡されない場合には、標準入力の行数、単語数、バイト数を表示してくれます。

ここで、気をつけなければならなかったことは、単語数の定義でした。wcコマンドでは単語数は、スペースで区切られて1単語とするということです。しっかり、公式のマニュアルに書いているので、まずコマンド作成するためにはマニュアルの内容をしっかり読んでおく必要があることを学びました💦

作ったもの

他の受講生のカンニング防止のために、ソースコードを載せられませんが、本物のwcコマンドと比較したスクリーンショットが以下になります🙇‍♂️

f:id:NMP300:20190905151956p:plain
自作wcコマンドと本物のwcコマンドとの比較

学んだこと

OptionParser.new.parse!(ARGV)は、配列を返すということ

最初に詰まったのがこれでした。

optparseは、コマンドラインのオプションを扱うことができるライブラリです。 これによって、オプションを登録することでき、opt.parse(ARGV)でコマンドラインで渡された文字列をオプションか引数かを解析してくれる素晴らしいライブラリです❗️

しかし、上手く使いこなせなかった私は、opt.parse(ARGV)で返された値が配列だと分からず、文字列オブジェクトとして、以降のコードを書いていたために、エラーが出されて苦戦していました。

しっかりと返された値がどのオブジェクトなのかを理解することが大切だと学びました。

クラス設計は難しいということ

この前に「Rubyでlsコマンドを作ろう」というプラクティスがあり、その頃はベタに書く(クラス設計を深く考えずに動くことを優先して書く)だけでも大分苦戦してしまいました。しかし、その苦戦した経験があってか、今回はベタ書きはすんなりクリアできました。

しかし、難しいのはクラス、メソッドをしっかり考えて定義するということ。クラス定義は本当に悩みました。「このメソッドは、処理的にはこっちのクラスに入れた方がスムーズなんだけど、論理的に考えたら合わないよなぁ」と頭を悩ます時間が長かったです💦

とりあえずは、先生に教えてもらったデータ構造と表現方法は分けるということを意識し、オブジェクト指向実践ガイドで学んだことを少しづつ意識しながら、なんとか形にはなりました。

こればかりは、経験を積み重ねるしかないと思うので、より良い設計ができるように意識して日々の課題をこなしていきたいと思います💪

制御文字もバイト数に含まれるということ

標準入力を受け取った時に、本物のコマンドよりもバイト数が大きく表示されてしまうという問題がありました。ls -l | wcの結果のことです。

この原因として、自作のlsコマンドが本物のlsコマンドよりも多く空白文字を出力していたということが判明しました。このような空白文字、改行などを制御文字と呼ぶようです。

実際の表示には目に見えて分からない制御文字もバイト数に含まれるということで、最初は原因が分からず悶々としていました💦

感想

最初lsコマンドの課題に取り組んだときは、「Ruby入門を一通り読んで基礎的なことは分かったつもりだったけど、実際にどのように作るか検討もつかない」という状態でした。そのため、「このRubyのプラクティスが終わる日は来るのだろうか😱」と不安になりました。

しかし、なんとかlsコマンドを提出でき、wcコマンド作成ではベタ書きを少しスムーズにやれるようになり、Rubyに少しだけ慣れてきたという実感があります❗️

そのように自分の成長を感じられると、やる気が上がってきます💪就職に向けて自分のペースで、着実に成長して行けたら良いなと思います💪

次はGitについて学んで行きます❗️