特定のプログラミング言語でオブジェクトまたは何か他のものが「ファーストクラス」であると言われるのはいつですか?なぜですか?彼らはそうでない言語と何が違うのですか?
編集。「すべてがオブジェクトである」(Pythonのように)と言うとき、彼は実際に「すべてがファーストクラス」であることを意味しますか?
特定のプログラミング言語でオブジェクトまたは何か他のものが「ファーストクラス」であると言われるのはいつですか?なぜですか?彼らはそうでない言語と何が違うのですか?
編集。「すべてがオブジェクトである」(Pythonのように)と言うとき、彼は実際に「すべてがファーストクラス」であることを意味しますか?
回答:
つまり、オブジェクトの使用に制限がないということです。他のオブジェクトと同じです。
ファーストクラスオブジェクトは、動的に作成、破棄、関数に渡して値として返すことができるエンティティであり、プログラミング言語の他の変数と同じようにすべての権限を持っています。
言語によっては、これは次のことを意味します。
- 匿名のリテラル値として表現可能
- 変数に格納可能
- データ構造に格納可能
- 固有のアイデンティティー(特定の名前とは無関係)
- 他のエンティティとの同等性が同等であること
- プロシージャ/関数にパラメータとして渡すことができる
- プロシージャ/関数の結果として返される
- 実行時に構築可能
- 印刷可能
- 読める
- 分散プロセス間で伝達可能であること
- 実行中のプロセスの外部に保存できる
ソース。
ただし、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ではすべてをファーストクラスにすることを目指しています。あなたの発言をした人の意図はファーストクラスを意味すると信じています。
「すべてがオブジェクトである」(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'>
組み込み型のような型int
がtype 'type'
オブジェクトです。これにはメソッドと属性もあります。
>>> type(type(2))
<class 'type'>
int
。したがって、「古い」クラスと「新しいスタイルのクラス」(そして3つには、古いスタイルのクラスはもうありません)です。
「ファーストクラス」とは、通常の方法で操作できることを意味します。ほとんどの場合、これは、これらのファーストクラスのシチズンを関数の引数として渡すか、関数から返すことができることを意味します。
これはオブジェクトにとって自明ですが、関数やクラスについては必ずしもそうではありません。
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の場合は定数)として扱うことができます。
「コンピュータプログラムの構造と解釈」のスライドから、講義2A(1986)をクリストファートレーシーが引用しています。
一流市民の権利と特権:
IMOこれは、自然言語で物事を説明するために使用されるメタファーの1つです。この用語は基本的に、ファーストクラスのオブジェクトとして機能を説明するコンテキストで使用されます。
オブジェクト指向言語を検討する場合、たとえば継承、クラス定義、コードの他のセクションに渡す機能(メソッド引数)、データ構造に格納する機能など、さまざまな機能をオブジェクトに与えることができます。 Javaスクリプトの場合の関数のように、通常はオブジェクトと見なされないエンティティと同様に、そのようなエンティティはファーストクラスオブジェクトと見なされます。
ここでいうファーストクラスとは、本質的に、セカンドクラスとして扱われないことを意味します(動作が低下します)。基本的に、あざけることは完璧または区別がつかない。