たのしいRuby(第2版) 「はじめてのRuby」〜printメソッドを知る〜に突っ込みをいただきました

こちらを書いたら、つっこみを頂きました(-人-)

(n氏) printって、IOに書き込むから、どうかんがえても文字列になるきがする

どういうことでしょうか。

その前に、そもそもIOとはなんでしょうか。

IO

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

IO クラスは基本的な入出力機能を実装します。

ということで、書いてある通りですね。


IO クラスのページを見ていくと、printメソッドがあります。

みてみると、

print([arg[, ...]])
引数を IO ポートに順に出力します。引数を省略した場合は、 $_ を出力します。引数の扱いは print と同じです(詳細はこちらを参照してください)。
nil を返します。


IRCでこんな会話があった。

08:27 (n氏) C:\RailsS>irb
08:27 (n氏) irb(main):001:0> s = StringIO.new
08:27 (n氏) => #
08:27 (n氏) irb(main):002:0> s.print(1)
08:27 (n氏) => nil
08:27 (n氏) irb(main):003:0> s.rewind
08:27 (n氏) => 0
08:27 (n氏) irb(main):004:0> s.read
08:27 (n氏) => "1"
08:27 (n氏) irb(main):005:0> exit
08:28 (n氏) readは文字列を返す

08:33 (n氏) Kernelをincludeしているから使えるだけだと思います
08:33 (n氏) irb(main):004:0> StringIO.ancestors
08:33 (n氏) => [StringIO, Enumerable, Data, Object, Kernel]

08:34 (n氏) IOに対して使えると思うんだよな〜
08:34 (n氏) IOに文字列を書き込むのがputs, print
08:34 (n氏) writeとかと同じ
08:35 (n氏) で、取り出すのがgets, getc
08:35 (n氏) とか
08:39 (n氏) irb(main):002:0> $stdout.class
08:39 (n氏) => IO
08:39 (n氏) irb(main):003:0> $stdout.tty?
08:39 (n氏) => true


StringIOとはなんでしょうか。

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

IO と同じインタフェースを持った文字列クラスです。

こちらにも、printというメソッドがあります。

print([obj, ...])
IO#print と同様です。


うーん・・・・いまいち、理解しきれませんでした・・・。とりあえず、保留にしておきます。




Kernel モジュールって何?

そもそもprintは「Kernel モジュールで 定義されているメソッド」とはなんでしょうか。
カーネルモジュールについて知る必要がありそうです。


カーネルモジュールとは (Kernel Module): - IT用語辞典バイナリ

カーネルモジュールとは、Linuxカーネルで動的に追加されるプログラム部品(モジュール)のことである。


1.カーネルとカーネルモジュール(第1章カーネル:基本管理コースII)

Linuxにおけるカーネルとは、以下の役割を果たす、まさに「心臓部」ともいえるソフトウェアになります。
* CPU/メモリ/ディスク/ネットワークカードなどのハードウェアの資源管理
* Linux上で動作するアプリケーションのプロセス管理・制御



ドライバなどカーネルに組み込まれる機能をモジュール化したもの
* カーネルがコンパクトになっている
* 動作中のカーネルに組み込むことが可能
* ドライバのアップデートにモジュール単位で対応できる
* ハードウェア構成が変わってもカーネル再構成を必要としない


カーネルモジュールとは、カーネルの機能を拡張するためのバイナリファイルです。

カーネルモジュールの代表的なものとしては、ディスク、ネットワークカード等をLinuxカーネルで使用可能にするためのデバイスドライバがあげられます。このデバイスドライバは、基本的には、各ハードウェアベンダから提供されるもので、これを使用することによって、Linuxカーネルは、多種多様なハードウェアに対応することが可能になっています。

心臓部のソフトウエア・・・なんかwktkしますね。カーネルモジュールについてもっと詳しく見ていきましょう。


カーネルとモジュール

http://markun.cs.shinshu-u.ac.jp/learn/linux/h_05-05.html

本来は Linux とは カーネル と呼ばれる中心となるプログラムのことを意味 します. このカーネルが核となってハードウェアやソフトウェアの管理を行うようになって います. しかし, このカーネルだけでは一般的に利用するための OS としての機能を果たすことができません. 一般的には Linux カーネルを基にして構成されたディストリビューションのことも 一般には Linux と呼んでいます.

  • モジュール

カーネルが中心となってハードウェアなどの管理をしていますが, 利用するコンピュータによって様々な設定が変わります. しかしあらかじめカーネルが全ての利用環境をサポートすることは不可能です. そこで モジュール とよばれるプログラムを利用できるようになっています.これはカーネルが起動した後に必要に応じていつでも追加(ロード)したり削除できます.

RubyとKernel

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

全てのクラスから参照できるメソッドを定義しているモジュール。
Object クラスはこのモジュールをインクルードしています。 組み込み関数の項で解説されているメソッドはこのモジュールで定義されています。

Object クラスのメソッドは実際にはこのモジュールで定義されています。これはトップレベルでのメソッドの再定義に対応するためです。

ふむふむ。「全てのクラスから参照できるメソッドを定義しているモジュール。 」



ですので、さきほど出てきたIRCで、

08:33 (n氏) Kernelをincludeしているから使えるだけだと思います
08:33 (n氏) irb(main):004:0> StringIO.ancestors
08:33 (n氏) => [StringIO, Enumerable, Data, Object, Kernel]

というのがあったのだと思います。

環境

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