Techioz Blog

インスタンスメソッドを定義するためのショートカット?

概要

Rubyにはクラスメソッドを定義するためのショートカットがあります

def String.some
  true
end

p String.some

インスタンスメソッドを定義するための同様のショートカットはありますか?

def <???>.some
  true
end

p "".some

追伸また、そのショートカット構文に関するドキュメントへのリンクについても言及していただけますか。

解決策

それはクラスメソッドではありません。 Rubyにはクラスメソッドがありません。これは、定義されているオブジェクトがたまたま Class クラスのインスタンスであることを除けば、単なる通常のシングルトン メソッドです。 「クラス クラスのインスタンスであるオブジェクトのシングルトン メソッド」を指すために単に「クラス メソッド」という用語を使用します。その方が短いためです。しかし、Ruby プログラミング言語には、そのようなものはありません。クラスメソッド。

また、オブジェクトが Class クラスのインスタンスでなければならない理由はありません。(フリーズまたは即時でない限り) (ほぼ) あらゆるオブジェクトにすることができます。

some_obj = Object.new

def some_obj.foo = :bar

some_obj.foo
#=> :bar

ただし…上で嘘をつきました。 Rubyにはシングルトンメソッドもありません。これは、some_obj のシングルトン クラスのインスタンス メソッドにすぎません。 「シングルトン クラスのインスタンス メソッド」を指すために単に「シングルトン メソッド」という用語を使用します。これは、その方が短いためです。しかし、Ruby プログラミング言語には、シングルトン メソッドのようなものはありません。 (コア ライブラリにはシングルトン メソッドについて説明するメソッドがいくつかありますが、それらはすべてシングルトン クラスのインスタンス メソッドで動作するだけです。繰り返しますが、それらについて説明するのは便利ですが、基本的には存在しません。)

同様に、「クラス クラスのインスタンスであるオブジェクトのシングルトン クラスのインスタンス メソッド」と言ったほうが簡単なので、「クラス メソッド」について説明しますが、基本的にクラス メソッドは存在しません。

上で書いたものはインスタンス メソッドを定義しています。 some は String のシングルトン クラスのインスタンス メソッドです。

String.singleton_class.instance_methods(false)
#=> [:try_convert, :some]