Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
4
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

@jkr_2255

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

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とする必要があります。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
4
Help us understand the problem. What are the problem?