「ファーストクラス」オブジェクトとは何ですか?


191

特定のプログラミング言語でオブジェクトまたは何か他のものが「ファーストクラス」であると言われるのはいつですか?なぜですか?彼らはそうでない言語と何が違うのですか?

編集。「すべてがオブジェクトである」(Pythonのように)と言うとき、彼は実際に「すべてがファーストクラス」であることを意味しますか?


1
この質問をprogrammers.SEに移行することは可能でしょうか?それとも不適合でしょうか?この質問はいいと思います。どのフォーラムが最も適しているかは言えません。
Shashank Sawant 2014年

16
再オープンするように投票しました...残念ながら、これは実際にはプログラムを実行していない人々によってクローズされたようです。明らかにトピックにあります:/
djechlin

回答:


176

つまり、オブジェクトの使用に制限がないということです。他のオブジェクトと同じです。

ファーストクラスオブジェクトは、動的に作成、破棄、関数に渡して値として返すことができるエンティティであり、プログラミング言語の他の変数と同じようにすべての権限を持っています。

言語によっては、これは次のことを意味します。

  • 匿名のリテラル値として表現可能
  • 変数に格納可能
  • データ構造に格納可能
  • 固有のアイデンティティー(特定の名前とは無関係)
  • 他のエンティティとの同等性が同等であること
  • プロシージャ/関数にパラメータとして渡すことができる
  • プロシージャ/関数の結果として返される
  • 実行時に構築可能
  • 印刷可能
  • 読める
  • 分散プロセス間で伝達可能であること
  • 実行中のプロセスの外部に保存できる

ソース

ただし、C ++関数自体はファーストクラスオブジェクトではありません。

  • '()'演算子をオーバーライドして、最初のクラスであるオブジェクト関数を持つことができます。
  • 関数ポインタはファーストクラスです。
  • boost bind、lambda、functionはファーストクラスの機能を提供します

C ++では、クラスはファーストクラスオブジェクトではなく、それらのクラスのインスタンスです。Pythonでは、クラスオブジェクトの両方がファーストクラスオブジェクトです。(オブジェクトとしてのクラスの詳細については、この回答を参照してください)。

JavaScriptファーストクラス関数の例は次のとおりです。

// f: function that takes a number and returns a number
// deltaX: small positive number
// returns a function that is an approximate derivative of f
function makeDerivative( f, deltaX )
{
    var deriv = function(x)
    { 
       return ( f(x + deltaX) - f(x) )/ deltaX;
    }
    return deriv;
}
var cos = makeDerivative( Math.sin, 0.000001);
// cos(0)     ~> 1
// cos(pi/2)  ~> 0

ソース

ファーストクラスのオブジェクトではないエンティティは、セカンドクラスのオブジェクトと呼ばれます。C ++の関数は動的に作成できないため、2番目のクラスです。

編集について:

編集。「すべてがオブジェクトである」(Pythonのように)と言うとき、彼は実際に「すべてがファーストクラス」であることを意味しますか?

オブジェクトという用語は大まかに使用でき、ファーストクラスであることを意味するものではありません。また、コンセプト全体を「ファーストクラスエンティティ」と呼ぶ方がおそらく意味があります。しかし、Pythonではすべてをファーストクラスにすることを目指しています。あなたの発言をした人の意図はファーストクラスを意味すると信じています。


2
「ファーストクラス」ではないオブジェクトの例をいくつか挙げていただけますか?
Sudip Bhandari 2017

1
@SudipBhandari同じことを思いましたが、ついにこのトピックに関する役立つWikipediaの記事に出くわしました。ファーストクラスのcitizen / objectです。Robin Popplestoneの定義は特に役に立ちました。(ところで、WP記事を投稿することは非常に明白に思えるかもしれませんが、これが基本的なプログラミング言語の概念であることを理解していませんでした)
mblakesley

19

「すべてがオブジェクトである」(Pythonのように)と言うとき、彼は本当に「すべてがファーストクラスである」という意味ですか?」

はい。

Pythonのすべてが適切なオブジェクトです。他の言語では「プリミティブ型」であるものでさえ。

のようなオブジェクト2には、実際にはかなりリッチで洗練されたインターフェースがあることがわかります。

>>> dir(2)
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__str__', '__sub__', '__truediv__', '__xor__']

すべてがPythonの第一級オブジェクトであるため、あいまいな特殊なケースは比較的少数です。

たとえばJavaでは、適切なオブジェクトではないプリミティブ型(int、bool、double、char)があります。そのため、JavaはInteger、Boolean、Double、Characterをファーストクラスの型として導入する必要があります。これを初心者に教えるのは難しい場合があります。プリミティブ型とクラスの両方が並んで存在する必要がある理由は明らかではありません。

また、オブジェクトのクラスがそれ自体がオブジェクトであることも意味します。これはC ++とは異なります。C++では、実行時にクラスが常に明確に存在するとは限りません。

のタイプ2は、type 'int'メソッド、属性、およびタイプを持つオブジェクトです。

>>> type(2)
<class 'int'>

組み込み型のような型inttype 'type'オブジェクトです。これにはメソッドと属性もあります。

>>> type(type(2))
<class 'type'>

1
これは、最新のPythonにも当てはまります。古いPython(バージョン1?それは私の時代の前でした)では、から継承できませんでしたint。したがって、「古い」クラスと「新しいスタイルのクラス」(そして3つには、古いスタイルのクラスはもうありません)です。
キースピンソン2013年

17

「ファーストクラス」とは、通常の方法で操作できることを意味します。ほとんどの場合、これは、これらのファーストクラスのシチズンを関数の引数として渡すか、関数から返すことができることを意味します。

これはオブジェクトにとって自明ですが、関数やクラスについては必ずしもそうではありません。

void f(int n) { return n * 2; }

void g(Action<int> a, int n) { return a(n); }

// Now call g and pass f:

g(f, 10); // = 20

これはC#の例であり、関数は実際にはファーストクラスのオブジェクトではありません。したがって、上記のコードは、小さな回避策(つまり、と呼ばれる汎用デリゲートAction<>)を使用して、関数を引数として渡します。Rubyなどの他の言語では、クラスやコードブロックも通常の変数(またはRubyの場合は定数)として扱うことができます。



1

IMOこれは、自然言語で物事を説明するために使用されるメタファーの1つです。この用語は基本的に、ファーストクラスのオブジェクトとして機能を説明するコンテキストで使用されます。

オブジェクト指向言語を検討する場合、たとえば継承、クラス定義、コードの他のセクションに渡す機能(メソッド引数)、データ構造に格納する機能など、さまざまな機能をオブジェクトに与えることができます。 Javaスクリプトの場合の関数のように、通常はオブジェクトと見なされないエンティティと同様に、そのようなエンティティはファーストクラスオブジェクトと見なされます。

ここでいうファーストクラスとは、本質的に、セカンドクラスとして扱われないことを意味します(動作が低下します)。基本的に、あざけることは完璧または区別がつかない。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.