web-dev-qa-db-ja.com

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

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

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

170

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

ファーストクラスオブジェクトは、動的に作成、破棄、関数に渡され、値として返され、プログラミング言語の他の変数が持つすべての権限を持つエンティティです。

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

  • 匿名のリテラル値として表現できる
  • 変数に保存可能
  • データ構造に保存可能
  • 固有のアイデンティティー(特定の名前に依存しない)
  • 他のエンティティとの平等性の比較
  • プロシージャ/ファンクションへのパラメータとして渡すことができる
  • プロシージャ/ファンクションの結果として返却可能
  • 実行時に構築可能
  • 印刷可能
  • 読みやすい
  • 分散プロセス間で伝達可能
  • 実行中のプロセスの外部に保存可能

ソース

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

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

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では、彼らはすべてをファーストクラスにすることを目指しています。あなたの発言をした人の意図はファーストクラスを意味したと思います。

155
Brian R. Bondy

「「すべてがオブジェクトである」と言うとき(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整数、ブール、ダブル、キャラクターをファーストクラスの型として導入しなければなりません。これは初心者に教えるのは難しいかもしれません-プリミティブ型とクラスは並んで存在する必要があります。

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

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

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

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

>>> type(type(2))
<type 'type'>
17
S.Lott

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

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

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#の例で、実際には関数are n'tファーストクラスオブジェクトです。したがって、上記のコードでは小さな回避策(つまり、Action<>)関数を引数として渡す。 Rubyなどの他の言語では、クラスやコードブロックでさえ通常の変数(またはRubyの場合は定数)として扱うことができます。

17
Konrad Rudolph

コンピュータープログラムの構造と解釈 、講義2A(1986)のスライドから、順番に引用 Christopher Stracey

一流市民の権利と特権:

  • 変数によって命名される。
  • プロシージャへの引数として渡されます。
  • プロシージャの値として返されます。
  • データ構造に組み込まれる
16

IMOこれは、自然言語で物事を記述するために使用される比thoseの1つです。この用語は、基本的に関数をファーストクラスオブジェクトとして説明する文脈で使用されます。

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

ここでの最初のクラスとは、本質的に、2番目のクラスとして処理されないことを意味します(動作が低下します)。本質的に、モックは完璧または見分けがつかない。

1
questzen