Article View: fj.lang.ruby
Article #6Ruby FAQ
From: Shugo Maeda
Date: Fri, 20 Feb 1998 00:00
Date: Fri, 20 Feb 1998 00:00
350 lines
12580 bytes
12580 bytes
前田です。
# fj.lang.rubyがまだできていないサイトもあるそうなのでfj.lang.misc
# にもクロスポストしておきます。
この記事はオブジェクト指向スクリプト言語Rubyに関してよくされる
質問に対する回答をまとめたものです。
このFAQは以下の章により構成されています。
1. 一般的な情報
2. Rubyプログラミング
章の頭を探すには"^1. "などの正規表現を使って検索してください。
各章には以下の質問が収められています。
1. 一般的な情報
1.1. Q. Rubyとは何ですか?
1.2. Q. なぜRubyという名前なのですか?
1.3. Q. Rubyのソースコードはどこで手に入りますか?
1.4. Q. Rubyのバイナリパッケージはどこで手に入りますか?
1.5. Q. Rubyのドキュメントはどこで手に入りますか?
1.6. Q. Rubyパッケージが手に入るミラーサイトはありますか?
1.7. Q. Rubyのメーリングリストやニュースグループはありますか?
1.8. Q. Rubyのホームページはありますか?
1.9. Q. WWWでRubyのドキュメントを参照できますか?
1.10. Q. Rubyを解説した書籍は出版されていますか?
2. Rubyプログラミング
2.1. Q. selfとは何ですか?
2.2. Q. プライベートメソッドとは何ですか?
2.3. Q. インスタンス変数とは何ですか?
2.4. Q. インスタンス変数を参照するにはどうすればよいですか?
2.5. Q. モジュールとは何ですか?
2.6. Q. モジュール関数とは何ですか?
2.7. Q. subとsub!はどう違うのですか?
2.8. Q. 多重代入とは何ですか?
2.9. Q. 引数への代入をするとどうなりますか?
2.10. Q. 引数にメッセージを送るとどうなりますか?
2.11. Q. 引数のデフォルト値を指定できますか?
2.12. Q. 可変長引数はありますか?
2.13. Q. ローカル変数は初期化しないといけないのですか?
2.14. Q. イテレータとは何ですか?
2.15. Q. 関数ポインタはありますか?
2.16. Q. i++はありますか?
2.17. Q. オブジェクトのクラスを知るにはどうすればよいですか?
2.18. Q. 特異メソッドとは何ですか?
2.19. Q. クラスメソッドはありますか?
2.20. Q. クラス変数はありますか?
2.21. Q. print (1+2)*3 がエラーになるのはなぜですか?
2.22. Q. loadとrequireはどう違うのですか?
2.23. Q. デバッガはありますか?
各質問を探すには"^1.1. "などの正規表現を使って検索してください。
1. 一般的な情報
===============
1.1. Q. Rubyとは何ですか?
A. Rubyはまつもとゆきひろ氏によって設計されたシンプルかつ強力なオブ
ジェクト指向スクリプト言語です。多くの他のスクリプト言語と違ってRuby
は最初からオブジェクト指向言語として設計されています。Rubyは動的型付
け、例外処理、イテレータ、クロージャ、特異メソッド、ガーベージコレク
ション、強力なテキスト処理機能などの特長を備えており、手軽にオブジェ
クト指向プログラミングをすることができます。
1.2. Q. なぜRubyという名前なのですか?
A. Rubyという名前はPerlに由来しています。perlという語から連想される
単語にpearl(真珠)があります。pearlは6月の誕生石です。一方、rubyは7月
の誕生石です。つまりRubyという名前には「Perlの次の言語」という意味が
込められているのです。また、初期からRubyの開発に関わってきた某氏(Ruby
という名前の提案者)の誕生日が7月だったからだとする説もあります。
1.3. Q. Rubyのソースコードはどこで手に入りますか?
A. ftp://ftp.netlab.co.jp/pub/lang/ruby/でRubyの最新のソースコードが
手に入ります。また、ftp://ftp.netlab.co.jp/pub/lang/ruby/beta/でベー
タバージョンが手に入ります。
1.4. Q. Rubyのバイナリパッケージはどこで手に入りますか?
A. djgpp版とcygnus版のバイナリパッケージがftp://ftp.netlab.co.jp/pub/
lang/ruby/pc/で手に入ります。またRedHat/Linux用のパッケージがftp://
ftp.netlab.co.jp/pub/lang/ruby/contribで手に入ります。Debian/Linux用
のパッケージはDebianのサイトで手に入ります。
1.5. Q. Rubyのドキュメントはどこで手に入りますか?
A. ftp://ftp.netlab.co.jp/pub/lang/ruby/doc/で手に入ります。
1.6. Q. Rubyパッケージが手に入るミラーサイトはありますか?
以下のミラーサイトがあります。
1.7. Q. Rubyのメーリングリストやニュースグループはありますか?
A. Rubyのメーリングリストはruby-list@netlab.co.jpです。参加する人は
ruby-list@netlab.co.jpにメールを送ると自動登録されます。また、Ruby
の開発に関するメーリングリストもあり、そちらはruby-dev@netlab.co.jp
です。参加方法は同じです。メーリングリストを脱会したい場合は*本文の*
先頭に#byeと書いたメールをメーリングリストに送ってください。
ネットニュースではfj.lang.rubyでRubyに関する議論が行われています。
1.8. Q. Rubyのホームページはありますか?
A. Rubyの公式ホームページはhttp://www.netlab.co.jp/ruby/です。日本
語のページはhttp://www.netlab.co.jp/ruby/jpになっています。
1.9. Q. WWWでRubyのドキュメントを参照できますか?
A. 上記の公式ホームページでドキュメントを参照できます。
1.10. Q. Rubyを解説した書籍は出版されていますか?
A. 残念ながら今のところRubyを解説した書籍は出版されていません。現在、
まつもとゆきひろ氏と石塚圭樹氏によりRubyの解説書が執筆されており、
1998年夏頃出版される予定です。
2. Rubyプログラミング
=====================
2.1. Q. selfとは何ですか?
A. selfはメソッドの実行主体を表します。オブジェクトが自分自身にメッ
セージを送信する場合に用いられます。メソッド呼び出しでレシーバが省略
された場合はselfのメソッドが呼び出されます。
2.2. Q. プライベートメソッドとは何ですか?
A. レシーバを省略した形でしか呼び出せないメソッドをプライベートメソ
ッドと呼びます。
print("foo\n") #=> foo
self.print("foo\n") #=> NameError: private method `print' called for main
2.3. Q. インスタンス変数とは何ですか?
A. インスタンス変数とはインスタンス毎に別々の値が保持される変数です。
インスタンス変数には@を付けます。
2.4. Q. インスタンス変数を参照するにはどうすればよいですか?
A. インスタンス変数はそのクラスのメソッドの中でしか参照できません。
外からインスタンス変数を参照するにはアクセスメソッドを用意します。
attrを使うことで簡単にアクセスメソッドを定義することができます。
class Person
attr :name
def initialize(name)
@name = name
end
end
tom = Person.new("Tom")
print tom.name, "\n" #=> Tom
2.5. Q. モジュールとは何ですか?
A. Rubyは単一継承ですが、モジュールを導入することで多重継承と同等の
機能を実現しています。モジュールは他のクラスに機能を提供するだけで、
自分自身はインスタンスを生成しない特殊なクラスです。クラスはモジュー
ルをインクルードすることでそのモジュールの機能を継承することができま
す。
module Runnable
def run
print "running...\n"
end
end
class Runner < Person
include Runnable
end
2.6. Q. モジュール関数とは何ですか?
A. モジュール関数はモジュールのメソッドとしても特異メソッドとしても
定義されているメソッドのことです。モジュール関数は、
Math.sqrt(2)
という形式と
include Math
sqrt(2)
という形式の両方を用いることができます。
2.7. Q. subとsub!はどう違うのですか?
A. subは変更されたオブジェクトを返すだけでレシーバ自身には変化がない
のに対して、sub!はレシーバ自身を変更します。sub!のようにレシーバの状
態を変化させるメソッドは破壊的なメソッドと呼ばれます。破壊的なメソッ
ドには!が付けられることが多いですが、!が付いていない破壊的メソッドも
あります。破壊的なメソッドを不用意に使うと思わぬ副作用が起こる場合が
あるので注意が必要です。
2.8. Q. 多重代入とは何ですか?
A. 多重代入は複数の式または配列から同時に代入を行います。
a, b = 1, 2 # あるいは a, b = [1, 2]
p a #=> 1
p b #=> 2
2.9. Q. 引数への代入をするとどうなりますか?
A. 引数への代入を行ってもメソッドの呼び出し側には影響はありません。
def swap(a, b)
a, b = b, a
end
a = 1; b = 2
swap(a, b)
p a #=> 1
p b #=> 2
2.10. Q. 引数にメッセージを送るとどうなりますか?
A. 引数が参照するオブジェクトは呼び出し側のオブジェクトと同じオブジ
ェクトなので、メッセージを送ることでオブジェクトの状態が変更される
場合は呼び出し側にも影響があります。
def strupcase(str)
str.upcase!
end
s = "foo"
strupcase(s)
p s #=> "FOO"
2.11. Q. 引数のデフォルト値を指定できますか?
A. はい。引数のデフォルト値には任意の式を指定できます。評価はメソッ
ドのスコープで呼び出し時に行われます。
def hello(msg = "Hello World!")
print msg, "\n"
end
hello #=> Hello World!
hello("Hello World from Ruby!") #=> Hello World from Ruby!
2.12. Q. 可変長引数はありますか?
A. はい。可変長引数は*を引数に付けて配列で受け取ることができます。逆
にメソッド呼び出しの時に引数に*を付けると配列を展開してメソッドに渡
します。
def printf(fmt, *args)
print format(fmt, *args)
end
2.13. Q. ローカル変数は初期化しないといけないのですか?
A. はい。初期化されていないローカル変数を参照するとエラーになります。
2.14. Q. イテレータとは何ですか?
A. イテレータとは呼び出し時にイテレータブロックというコードブロック
を渡されるメソッドのことです。イテレータブロックはイテレータ内で、
yieldの呼び出し時に実行されます。イテレータブロックは匿名のコールバ
ック関数のような働きをします。
ary = ["foo", "bar", "baz"]
ary.each do |i|
print i, "\n"
end
2.15. Q. 関数ポインタはありますか?
A. 関数ポインタはありません。代りにイテレータを利用してください。
Procオブジェクトを使えばイテレータブロックをオブジェクト化すること
ができます。
p = proc {|msg| print msg, "\n" }
p.call("foo") #=> foo
2.16. Q. i++はありますか?
A. ありません。i+=1を利用してください。
2.17. Q. オブジェクトのクラスを知るにはどうすればよいですか?
A. typeメソッドでそのオブジェクトのクラスを得ることができます。
p "foo".type #=> String
2.18. Q. 特異メソッドとは何ですか?
A. 特異メソッドとはクラスではなく特定のインスタンスにのみ定義された
メソッドです。特異メソッドを用いることで、サブクラス化をしなくてもオ
ブジェクトにメソッドを追加したり、再定義することができます。
msg = "Hello"
def msg.print
$>.print self, "\n"
end
msg.print #=> Hello
2.19. Q. クラスメソッドはありますか?
A. クラスメソッドと呼ばれるメソッドには二種類あります。一つはClass
というクラスで定義されたメソッドです。すべてのクラスオブジェクトは
ClassのインスタンスなのでClassで定義されたメソッドを呼び出すことが
できます。もう一つはクラスオブジェクトに対して定義された特異メソッ
ドです。クラスの特異メソッドはクラス定義の中で定義しても外で定義し
ても同じ意味になります。
2.20. Q. クラス変数はありますか?
A. ありません。代りにクラス定数と配列を使います。
class Foo
COUNT = [0]
def initialize
COUNT[0] += 1
end
def Foo.count
return COUNT[0]
end
end
2.21. Q. print (1+2)*3 がエラーになるのはなぜですか?
A. (print(1+2)) * 3 と解釈されるからです。このような場合はprint((1+2)*3)
のようにしてください。
2.22. Q. loadとrequireはどう違うのですか?
A. loadはRubyスクリプトのみロードしますが、requireはCで記述された拡
張モジュールもロードします。既にロードされているライブラリをrequire
した場合はロードせずにfalseを返します。
2.23. Q. デバッガはありますか?
A. あります。
ruby -r debug foo.rb
とすることでgdb風のデバッガを利用できます。sampleディレクトリには
Emacs用のインターフェイスを提供する rubydb.elも用意されています。
Technical Details
Message-ID:
<8690r64lb4.fsf@soleil.localnet.or.jp>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailShow Full Headers
Complete Article Headers
X-Google-Language: Japanese,JIS X-Google-Thread: 13488f,5edb5958eb1987df,start X-Google-Attributes: gid13488f,public X-Google-Thread: 10b195,5edb5958eb1987df,start X-Google-Attributes: gid10b195,public From: shugo@po.aianet.ne.jp (Shugo Maeda) Subject: Ruby FAQ Date: 1998/02/20 Message-ID: <8690r64lb4.fsf@soleil.localnet.or.jp> X-Deja-AN: 326897698 Followup-To: fj.lang.ruby X-Emacs: Emacs 20.2, MULE 3.0 (MOMIJINOGA) Mime-Version: 1.0 (generated by SEMI MIME-Edit 0.100 - "Otomaru") Content-Type: text/plain; charset=ISO-2022-JP Organization: AIANet Internet Service Newsgroups: fj.lang.ruby,fj.lang.misc