こんにちは!Webコーダー・プログラマーの貝原(@touhicomu)です。
今日は、Rubyのchompを主に解説する他、chop、strip、gsubについてもchompと比較して解説します。
この記事では、
- chompとは
- chompの使い方
- chomp!の使い方
- each_lineなどとchompを併用する方法
- chomp、chop、strip、gsubの使い方の比較
などの基本から応用的な使い方に関しても学習していきます。このページで、Rubyのchomp、chop、strip、sgubの使い方をよく把握して自分のスキルとしていきましょう!
chompとは
chompとは
ファイルから1行ずつ文字列を読み込んだ際に、文字列の末尾に改行コードが含まれている場合があります。こういったケースは、多くの場面で存在し、その時に末尾の改行コードを削除するために、chompメソッドがあります。
chompは文字列の末尾に改行コードがあった場合に、文字列の末尾の改行コードを削除します。chompは文字列の末尾に改行コードがなかった場合は、なにもしません。
つまり、文字列の内容をそのまま反映し、末尾の改行コードだけを取り除きたい場面で、とりあえずchompメソッドを適用しておけば、想定した文字列が得られます。
このように、ファイルから1行ずつ文字列を読み込み、文字列の末尾に改行コードがまぎれこんでいる場合などに、chompが使用されます。実際にサンプルコードを見てみましょう。
string = "ruby\n" p string p string.chomp
実行結果:
"ruby\n" "ruby"
以上のように、文字列の末尾の改行コードが取り除かれています。なお、改行コードについて詳しくは、以下の記事を参照してください。
chompの使い方
前章でも述べましたが、chompは文字列の末尾の改行コードを削除します。
# 末尾にのみ改行コードを持つ文字列の場合 string1 = "ruby\n" p string1 # 末尾の改行コードは削除される p string1.chomp
実行結果:
"ruby\n" "ruby"
しかし、chompは末尾の改行コード以外の改行コードは削除しません。実際のサンプルコードで確認してみましょう。
# 末尾以外の場所にも改行コードを持つ文字列の場合 string2 = "rub\ny" p string2 # 末尾の改行コードしか削除されない p string2.chomp
実行結果:
"rub\ny" "rub\ny"
このような結果になる理由は、chompはもともとファイルから1行ずつ読み込んだ行の文字列の末尾の改行コードを削除する目的だけに作成されたメソッドだからです。文字列に含まれるすべての改行コードを削除するには、後で述べるより汎用的なgsubを用います。
chomp!の使い方
chompは文字列の改行コードを削除した結果を文字列として返します。
しかし、元の文字列は変更しません。代わりに、元の文字列の改行コードを削除してしまう破壊的メソッドchomp!があります。破壊的メソッドとは変数に破壊的メソッドを適用した場合、変数の値そのものを変更してしまうメソッドのことです。
元の変数の値を破壊してしまうことから、破壊的メソッドと呼ばれます。実際のサンプルコードで確認してみましょう。
string = "ruby\n" p "---- chomp" p string.chomp p "---- chomp後のstring" p string p "---- chomp!" p string.chomp! p "---- chomp!後のstring" p string
実行結果:
"---- chomp" "ruby" "---- chomp後のstring" "rubyn" "---- chomp!" "ruby" "---- chomp!後のstring" "ruby"
以上のように、chompは元の文字列を破壊しませんが、chomp!は元の文字列を破壊して変更しています。非破壊的メソッドを使用するか、破壊的メソッドを使用するかの判断は、その時々のコードにどちらが適切か判断する必要があります。
なお、Rubyには非破壊的メソッドと破壊的メソッドの両方が用意されている場合が多いです。よく確認してコードを書いていきましょう。
each_lineなどとchompを併用する方法
each_lineとchomp
改行コードで区切られた複数行の文字列は、each_lineメソッドで1行ずつループできます。各行の文字列の末尾には改行コードが付いています。そこで、これらの改行コードをchompで削除し、標準出力に表示するサンプルコードを確認していきましょう。
# 文字列中に複数の改行を含む複数行の文字列。 strings = "ruby\npython\njava\n" # each_lineで行ごとにループ strings.each_line do |string| # 各行の末尾には改行コードが付いているのでchompで削除する p string.chomp end
実行結果:
"ruby" "python" "java"
以上のように、複数行文字列stringsをeach_lineで1行ずつループし、chompで改行コードを削除しています。
最後に、改行コードを削除した文字列を標準出力に表示しています。なお、each_lineの他、文字列に適用できる便利なメソッドについて詳しくは、以下の記事を参照してください。
readlinesとchomp
ファイルからデータを文字列の配列として読み込むFile.readlinesメソッドがあります。このメソッドも、文字列の末尾に改行コードが付いています。
そこで、今回もchompを使って改行コードを削除して、標準出力に表示してみましょう。ファイルから読み込んだ文字列の配列にeachメソッドを使って1行ずつループし、1ループごとにchompメソッドを使用します。
サンプルコードは以下のようになります。また、”sample.txt”ファイルも用意してください。
# readlinesでファイルを読み込み、eachで行ごとにループ File.readlines("sample.txt").each do |line| # 各行の末尾には改行コードが付いているのでchompで削除する p line.chomp end
用意するテキストファイル(sample.txt):
ruby python java php scala
実行結果:
"ruby" "python" "java" "php" "scala"
以上のように、File.readliesによりテキストファイルを読み込み、文字列の配列にしています。文字列の配列の各要素である、各行の文字列の末尾の改行コードをchompメソッドで削除し表示できました。
chomp、chop、strip、gsubの使い方の比較
chompの使い方
文字列から改行コードを削除するメソッドは、chomp、chop、strip、gsubなどがあります。それぞれを使った実際のサンプルコードと実行結果を比較して、どのような違いがあるのかを把握しておきましょう。
まずは、chompのサンプルコードをみてみましょう。
# 文字列中に複数の改行を含む複数行の文字列。 strings = " ruby \n python \n java \n" p "---- chomp" p strings.chomp p "---- chomp後のstring" p strings
実行結果:
"---- chomp" " ruby \n python \n java " "---- chomp後のstring" " ruby \n python \n java \n"
以上のように、chompは、文字列の末尾の改行コードのみを削除します。またchomp後のstringは破壊されていません。そのため、chompは非破壊的メソッドです。
chopの使い方
次に、chopを見ていきましょう。chopは文字列の末尾の1文字を削除します。
ただし、chompと違い末尾の1文字が改行コードであるかないかにかかわらず1文字削除します。
# 文字列中に複数の改行を含む複数行の文字列。 strings1 = " ruby \n python \n java\n" strings2 = " ruby \n python \n jav\na" p "---- chop" p strings1.chop p strings2.chop p "---- chop後のstring" p strings1 p strings2
実行結果:
"---- chop" " ruby \n python \n java" " ruby \n python \n jav\n" "---- chop後のstring" " ruby \n python \n java\n" " ruby \n python \n jav\na"
以上のように、chopは文字列の末尾の1文字のみを、改行コードであるかないかにかかわらず削除します。このようにchopはchompより少し汎用的な用途に使用されます。
chopをchompの代わりに使用するには、あらかじめ文字列の末尾が改行コードであることをend_with?メソッドなどで確認する必要があります。また、chopは非破壊的メソッドです。(!を付けてchop!にすれば、破壊的メソッドに変わります。)
stripの使い方
stripは文字列の前後のホワイトスペースをすべて削除します。ホワイトスペースとは、改行コード、半角スペース、タブの3つを含んだ総称です。
これら3つの文字は画面上では見えないため、透明で白い文字であるとの意味合いで、ホワイトスペースと呼ばれています。文字列の前後のすべてのホワイトスペースを削除しますが、文字列の中間にあるホワイトスペースは削除しません。
実際のサンプルコードで確認してみましょう。
# 文字列中に複数の改行を含む複数行の文字列。 strings = " ruby \n python \n java \n" p "---- strip" p strings.strip p "---- strip後のstring" p strings
実行結果:
"---- strip" "ruby \n python \n java" "---- strip後のstring" " ruby \n python \n java \n"
以上のように、stripは文字列の前後のホワイトスペースをすべて削除します。
ただし、文字列の中間のホワイトスペースは削除しません。また、stripは非破壊的メソッドです(!を付けてstrip!にすれば、破壊的メソッドに変わります)。stripについて詳しくは、以下の記事を参照してください。
gsubの使い方
gsubは正確には正規表現による文字列置換メソッドです。第一引数に与えた正規表現にマッチする文字列をすべて第二引数の文字列に置換します。
これを利用して、改行コードにマッチする正規表現/(rn?|n)/を空文字””に置換することで、文字列中の改行コードをすべて削除します。なお、rはキャリッジリターンという文字でWindowsのテキストファイルの改行文字の直前に置かれている文字です。
また、Macはrが単独で改行文字として扱われます。正規表現の?は、?の直前の文字が存在する場合、または、?の直前の文字が存在しない場合、両方にマッチします。今回はWindows、Mac両方に対応できるよう、rn?という正規表現を使用しています。
# 文字列中に複数の改行を含む複数行の文字列。 strings = " ruby \n python \n java \n" p "---- gsub" p strings.gsub(/(\r\n?|\n)/,"") p "---- gsub後のstring" p strings
実行結果:
"---- gsub" " ruby python java " "---- gsub後のstring" " ruby \n python \n java \n"
以上のように、gsubにより、文字列中のすべての改行コードを削除できました。また、gsubは非破壊的メソッドです。(!を付けてgsub!にすれば、破壊的メソッドに変わります。)
正規表現、gsubについて詳しくは、以下の記事を参照してください。
Rubyを独学で頑張っているけど先が見えない方のために
そんな方、実はいらっしゃるのではないでしょうか?
そんな方であれば、これから先の話は必要ないでしょう。そっとページの閉じるボタンを押しましょう。
しかし、「先が見えない」と心の底では勘付いているそこの奥さん。この先を読み進めて、一緒に課題を深堀りしていきましょう。
なぜ「先が見えない」という不安や悩みを抱えてしまうのか
さて、「一寸先は闇だ・・・」とお悩みを抱えている方に、なぜ独学でRubyを勉強しているにもかかわらず、そのような現状を抱えてしまうのか、一緒に考えていきましょう。
先が見えない現状を踏まえ、課題として考えられるものは以下のどれかに該当するでしょう。
- プログラミングの上達が見えない
- プログラミングを継続できない気がする
- プログラミングスキルを習得した姿がイメージできない
- プログラミングスキルを活かした仕事を獲得するイメージができない
これらのどれかに該当することによって、「なんとなくプログラミング学習をしている」という状態になってしまいます。
これらの要因は、三日坊主になる理論と同じなんですが、「プログラミング学習をしなきゃ」とプログラミング学習を頑張ってしまっている状態になってしまっています。
受験勉強をやった経験のある方なら頭がもげるほどに首を縦に振ってしまう方も多いのですが、「今日も5時間勉強するぞ」や「今日はこの章を終わらすぞ」というように、学習を進めることに意識が行き過ぎてしまうと、ある程度学習を継続した後に「先が見えない・・・」となってしまいます。
未来に光を当て、プログラミング学習を「成果が出るもの」にするために
先ほど、「なぜ先が見えないという悩みや不安を抱えてしまうのか」という疑問に対しての答えを示していきました。
これらの課題というのは、独学をしていれば9割の方がぶつかってしまう壁だそうで、いわば、あるあるの現象なのです。
独学をしていて、「なんか前に進めていないぞ」と感じるのはこのせいなんですね。甘く見がちですが、非常にやっかい。
これがさらにやっかいさを極めているのは、上記に挙げた課題のほとんどが、1人で解決できないものばかりだからです。
実は、これらのほとんどが経験者に助けてもらいながら解決しないと、すぐに違う方向へと流れてしまいます。
そう言い切れるのは、以前の私もそうだったからです。
エンジニアやプログラマー関連のキャリアに詳しい方や現役のエンジニアに相談しながら修正を加え、学習を実践して今があります。
という方もいるでしょう。そういう時にこそ、プログラミングスクールの無料カウンセリングを利用するのです。
という考えに辿りついてしまいますよね。結論から言うと弊社では、そういった強引な営業等を行うことはありませんので、安心して受講できます。
「プログラミング学習の先ある未来」を光で明るく照らすには、弊社の無料カウンセリングがぴったりだと断言できます。それくらい無料カウンセリングに自信を持っているのです。
さらに、無料カウンセリングには以下の3大特典もついてきます!
- 「最短1ヶ月で開発ができる学習方法」電子書籍(非売品)
- 効率的なオリジナル学習カリキュラム
- 未経験の転職(フリーランス)を可能にするキャリアサポート
上記の特典だけでも他のスクールにはないポイントだと自信を持っている無料カウンセリング特典です。
ただプログラミング学習をする毎日から、ワクワクしながらプログラミング学習できる毎日に変える体験を一度でいいのでしてみませんか?
まとめ
今回は、Rubyのchompについて学習しました!学習のポイントを振り返ってみましょう!
- chomp、chomp!で文字列の末尾の改行コードを削除できる
- chompは非破壊的メソッドで、chomp!は破壊的メソッド
- 複数行文字列のeach_line、ファイルのreadliesで1行ずつループして、各行でchompを使用し改行コードを削除できる
- chompの利用用途に似た、chop、strip、gsubなどがある
以上の内容を再確認し、ぜひ自分のプログラムに生かし学習を進めてください!