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

まぁ・・・はじめてじゃないけどw
でも、まだスタートラインに立ってる感じもしないので、気分的にははじめて。


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


Rubyを動かす

コンソール(CUI)で動かしていきます。その理由は、

GUIは使用しているOSやツールキットなどに依存しているので、汎用のものが作りにくい
Rubyでは、単なる文字処理の方がシンプルでわかりにくい

まぁ、ほとんどのことがテキスト処理ですので、CUIが適していると思います。
コンピュータはプログラムの集合体ですからね。


Hello,Ruby!

さて、さっそく書いみましょう。

  • helloruby.rb
print("Hello, Ruby!!")
  • 実行してみる
C:\enjoy_ruby>ruby helloruby.rb
Hello, Ruby!!

ちゃんと、動きましたね。Rubyの世界へ入場です。


今回書いたプログラムを分析してみる

  • helloruby.rb
print("Hello, Ruby!!")

たった1行ですが、さまざまな要素があります。すこし詳しく見てみましょう。


オブジェクト

"Hello, Ruby!!"

これをStringオブジェクト、または文字列オブジェクト、あるいは単に文字列と呼びます。「Hello,Ruby!!」という文字列を意味するオブジェクト、というわけです。

Rubyでは、文字列、数値、時刻などさまざまなデータがオブジェクトになります。

上記の解説通り、Rubyでは、すべてオブジェクトで表現されます。
どういうことかというと、

irb(main):001:0> "Hello,Ruby!!".class
=> String

"Hello,Ruby!!"のクラスがStringだと言う事がわかりますね。


メソッド

print

今回は、printというメソッドを使っています。

「print」は、メソッドです。メソッドとは、オブジェクトを扱うための手続きのことです。

printメソッドは、「()」の中の内容をコンソールに出力するメソッドです。ですから、helloruby.rbでは、「Hello,Ruby!!」という文字列オブジェクトが表示されています。

メソッドに渡す情報のことを引数(ひきすう)といいます。たとえば、printメソッドの機能を説明する場合には「printメソッドは引数として与えられた文字列をコンソールに出力します」といった使い方をします。

Rubyオブジェクト指向なのに、printは関数?

それにしても、Rubyオブジェクト指向言語のはずなのに、print()はおもいっきり関数っぽく見えますよね。

それには、わけがあります。

Ruby には厳密な意味では関数はありませんが、Kernel モジュールで 定義されているメソッドは (どこからでも関数形式で呼び出せるので) 他言語における関数のように使えます。これらのメソッドを再定義する 場合は他の場所への影響を考えて行なう必要があります。

irb(main):002:0> method(:print)
=> #<Method: Object(Kernel)#print>

プログラミング言語 Ruby リファレンスマニュアル
プログラミング言語 Ruby リファレンスマニュアル


組み込み関数というものです。


もっとprint

上記の例では、"Hello,Ruby!!"という文字列を第一引数として渡していますが、引数はいくつまでわたせるのでしょうか。
まず、printの仕様を見てみましょう。

print([arg1[, arg2, ...]])
引数を順に出力します。引数が与えられない時には変数 $_ の値を出力します。文字列以外のオブジェクトが引数として与えられた場合には、当該オブジェクトを to_s メソッドにより文字列に変換してから出力します。ただし、nil に対しては文字列 "nil" を出力します
変数 $, (出力フィールドセパレータ)に nil でない値がセットされている時には、各引数の間にその文字列を出力します。変数 $\ (出力レコードセパレータ)に nil でない値がセットされている時には、最後にそれを出力します。
nil を返します。

引数を順に出力します。

やってみましょう。

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


ちなみに、printに引数1000個以上渡しても大丈夫です。コンピュータが許す限り大丈夫です。


文字列以外のオブジェクトが引数として与えられた場合には、 当該オブジェクトを to_s メソッドにより文字列に変換 してから出力します。

  • helloruby.rb
print(1)
C:\enjoy_ruby>ruby helloruby.rb
1

あれ?文字列?みためだと分かりずらいですね・・・。でも文字列に変換されているはずです。どうやったら証明できるだろう・・。


ただし、nil に対しては文字列 "nil" を出力します

やってみましょう。

  • helloruby.rb
print(nil)
  • 実行結果
C:\enjoy_ruby>ruby helloruby.rb
nil

えーと・・・分かりにくいです>< windowsコンソール・・・。


「出力フィールドセパレータ」ってなに?

printの仕様に書いてある、「出力フィールドセパレータ」とはなんでしょうか。

プログラミング言語 Ruby リファレンスマニュアル
こちらに、

$\
出力レコードセパレータを表す文字列です。 print が最後にこの文字列を出力します。
デフォルトは nil で、何も出力しません。

Rubyには「コマンドラインオプション」というものがありますので、「-l」オプション「を使って「出力レコードセパレータ」を出力してみましょう。

プログラミング言語 Ruby リファレンスマニュアル

-l
行末の自動処理を行います。まず、$\ を $/ と同じ値に設定し, printでの出力時に改行を付加するようにします。それから, -n フラグまたは-pフラグが指定されていると gets で読み込まれた各行の最後に対して String#chop!を行います。

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

一行改行が加わりました。

ちなみに、「$\ を $/ と同じ値に設定」の「$/」はなんでしょうか。

$/
   入力レコードセパレータを表す文字列です。デフォルト値は "\n" です。

\n は、改行命令です。 


nilを返します。

引数を指定しない場合、nilを返します。

  • helloruby.rb
print()
  • 実行結果
C:\enjoy_ruby>ruby helloruby.rb
nil

仕様通り、エラーではなく、nilが帰ってきましたね。



実行する環境

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

※書籍はRuby1.8.4をベースに作ってありますが、私はインストールしてある1.8.6で行います。