回答:
定義
次の場合、オブジェクトはファーストクラスです。
- 変数とデータ構造に保存できます
- サブルーチンにパラメーターとして渡すことができます
- サブルーチンの結果として返すことができます
- 実行時に構築できます
- 固有のIDを持っている(名前に依存しない)
「オブジェクト」という用語はここでは大まかに使用され、必ずしもオブジェクト指向プログラミングのオブジェクトを指すわけではありません。整数や浮動小数点数などの最も単純なスカラーデータ型は、ほとんど常にファーストクラスです。
プログラミング言語の「ファーストクラスの市民」または「ファーストクラスの要素」という概念は、1960年代にイギリスのコンピューター科学者Christopher Stracheyによってファーストクラスの機能のコンテキストで導入されました。この原理の最も有名な定式化は、おそらくジェラルド・ジェイ・サスマンとハリー・アベルソンによるコンピュータープログラムの構造と解釈にあります。
- 変数によって名前を付けることができます。
- これらは、プロシージャへの引数として渡すことができます。
- 手順の結果として返される場合があります。
- それらはデータ構造に含まれる場合があります。
基本的に、このプログラミング言語要素を使用して、プログラミング言語の他のすべての要素で実行できるすべての操作を実行できることを意味します。
それはすべて「平等な権利」に関するものです。たとえば、整数を使用して上記のすべてを行うことができます。
上記の定義は、プログラムのオブジェクトであることに関連するファーストクラスの側面についてのみ実際に言及しているという意味で、少し制限されています。もっと一般的な定義は、もしあなたがそれですべてをすることができれば、あなたは同様の種類の他のものでもできるということはファーストクラスであるということです。
たとえば、Java演算子とJavaメソッドは似たようなものです。新しいメソッドを定義したり、独自のメソッドの名前を(ある程度)自由に選択したり、メソッドをオーバーライドしたり、メソッドをオーバーロードしたりできます。ジェームズゴスリングもオペレーターですべてを実行できますが、あなたと私はできません。私は、人気の信念に反し意味、Javaはありませんサポート演算子のオーバーロードを:たとえば、+
オペレータがオーバーロードされbyte
、short
、int
、long
、float
、double
そしてString
またのために、とIIRCは、Java 7にBigInteger
し、BigDecimal
(そしておそらく、私は忘れてしまったカップルが)、それがあることだけだおそれに影響を与えないでください。これは明らかに、この2番目の定義に従って演算子を2番目にクラスにします。ただし、最初の定義によると、メソッドは依然としてファーストクラスのオブジェクトではないことに注意してください。(それはオペレーターをサードクラスにしますか?)
通常、これはパラメーターとして渡すことができる構造体を指し、関数からの戻り値の型として定義するか、値を割り当てることができます。通常、実行時にそれらを構築できる必要があります。たとえば、クラスのインスタンスはc ++またはjavaのファーストクラスの市民ですが、Cの関数はそうではありません。
言語のみで実装されている機能は、ファーストクラスの市民であると言えます。
すなわち、その機能を実装するために複数の言語機能または標準ライブラリを必要としません。
例:
C / C ++では、関数をファーストクラスの市民とは考えていません(他の人はそうかもしれません)。
これは、言語で直接サポートされているが、他の言語機能の使用を必要とする関数を操作する方法があるためです。関数へのパラメーターのバインドは直接サポートされていないため、この機能を実装するにはファンクターを作成する必要があります。