9
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

あれもこれも、Rubyではメソッド。

Last updated at Posted at 2017-08-31

Rubyの世界では、普通の言語なら文法として実装してしまうものでも、メソッドになっていることがあります。

初級編

newメソッド

多くの言語でnewは演算子ですが、RubyではClassクラスのメソッドとなっています。Object.newのように書くので、これはメソッドだとわかりやすいと思います。

だからといって、自分でnewを再実装することはないと思いますが、private_class_method :newとすれば、newメソッドをprivateにして、外部からかんたんにnewできないようにできます。

中級編

attr_xxxメソッド

Rubyの場合、インスタンス変数を直接publicにすることはできないので、読み書きするだけのメソッドが必要になることがあります。それをかんたんに実装できるのがattr_readerattr_accessorなどのメソッド群です。Rubyではクラス定義内もコード実行が行われるので、「メソッド定義をするメソッド」をこの場で使えるのです(これはその気になれば自分で実装できます)。

public/private/protected

他の言語と動作が違うことで有名なRubyのアクセス制御ですが、実はこれらもメソッドです。とは言え、メソッドして意識しておくような場面も、private(*methods)のように引数をsplatするときぐらいだとは思います。

上級編

Kernelのメソッド群

Kernelというモジュールがあって、これはObjectincludeされています。ということで、ここに定義されたメソッドはレシーバー無しで使えます。ただ、リストを見てみれば「これもメソッドだったの?」と言うものが目白押しです。

  • block_given?…メソッドにブロックが与えられたか判定する
  • exit…Rubyを終了する
  • p/putc/puts…標準出力する
  • procProcを作成する
  • raise…例外を投げる
  • require…ライブラリを読み込む

「メソッドである」ことで注意しないといけないシチュエーションが2つあって、「同名のメソッドを定義したクラスの中」や、「Objectの上位にあるBasicObjectから継承したクラスの中」では、これらが(普通に呼ぶだけでは)使えません。例外を投げるのにも::Kernel.raiseとする必要があります。

9
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?