たのしいRuby(第2版) 「はじめてのRuby」〜printメソッドを知る 2日目「文字列」〜

昨日の続きです。


■これは「たのしいRuby 第2版」を元にしています。
Amazon CAPTCHA

改行文字と「\」

文字列の「\n」は改行を表すと説明しました。普通の文字を使って、改行をかけろかげて、たとえば、

Hello,
Ruby
!

と表示させるには

print("Hello,\nRuby\n!\n")

と書くことができます。もっとも、

print("Hello,
Ruby
!
")

などと書いても同じように表示されます。しかし、この書き方だとプログラムが読みにくくなってしまうので、あまりよい書き方ではありません。せっかく改行を表す書き方があるのですから、それを使うのが良いでしょう。

とりあえず、やってみましょう。

  • helloruby.rb
print("Hello,\nRuby\n!\n")

print("Hello,
Ruby
!
")
  • 実行結果
C:\enjoy_ruby>ruby helloruby.rb
Hello,
Ruby
!
Hello,
Ruby
!

ちゃんとなりましたね。

プログラムを書くときは、”読みやすいか”というのは重要な問題です。
プログラムは書いたらもう一度も触らない、ということは稀ではないでしょうか。メンテナンスをしていかなければなりませんし、他人が読むかもしれません。そのプログラムを再利用するかもしれません。
読みやすく、シンプルであることに越したことないのです。

あまりに読みにくかったりすると、メンテナンスにものすごくコストがかかってしまったりします。あと、何より、読んでいて気持ち良くないというのもあるかもしれません。
読みやすいコードを書くためには、先人の素晴らしいコードを読むのが一番勉強になるのではないでしょうか。
先人のプログラムには、きれいすぎて感動する作品がたくさんあります。そこから学べばよいと思います。
なんか、アーティスト作品みたいですよね。いや、プログラムはアーティスティックですよ。

特別な文字の表示

プログラムには、あらかじめ予約された特別な文字があります。「"」や「\」、「'」などいろいろあります。それらを文字列として表示させるにはどうしたらよいのでしょうか?

  • 「"」を表示させたい
print(""")

こうやると「"」が出力されるでしょうか?やってみましょう。

  • 実行結果
C:\enjoy_ruby>ruby helloruby.rb
helloruby.rb:1: unterminated string meets end of file
helloruby.rb:1: syntax error, unexpected $end, expecting ')'
print(""")
         ^

syntax error になってしまいましたね。

「"」を文字列として表現したい場合、「\」を「"」の前に書く必要があります。

print("\"")

実行してみましょう。

C:\enjoy_ruby>ruby helloruby.rb
"


ちゃんと「"」が表示されました。
このように、特別な文字を表示させる場合、「\(エスケープシーケンスと言います)」を前に書く必要があります。


エスケープシーケンス - Wikipedia

「''」と「""」

文字列オブジェクトを作るための区切り文字には、「""」(ダブルクォート)ではなく、「''」(シングルクオート)を使うこともできます。先ほどのプログラムを、

print('Hello,\nRuby\n!\n')

とシングルクォートに書き換えて実行してみましょう。

  • 実行結果
C:\enjoy_ruby>ruby helloruby.rb
Hello,\nRuby\n!\n

と、「''」の中の文字がそのまま表示されてしまうようになります。
このように、「''」で囲った文字列は、「\n」などの特殊文字の解釈を行いません。そのまま表示します。ただし、例外として、「/」と「'」を、文字列の中に文字そのものとして含めたいときにのみ、その文字の前に「/」を付けます。こんな感じです。

print('Hello, \'Ruby\'.')
print('Hello, \\ Ruby.')

実際に動かしてみましょう。

  • 実行結果
C:\enjoy_ruby>ruby helloruby.rb
Hello, 'Ruby'.Hello, \ Ruby.

たしかに、例外の文字はちゃんと表示されますね。


環境

C:\enjoy_ruby>ruby -v
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]