「この機能を言語/プラットフォームの第一級市民にしてください」のような発言を何度も目にしました。たとえば、C#/。netの列挙型について言われています。では、プログラミング言語/プラットフォームで機能が「第一級市民」と見なされるのはいつですか?
コメント
- BTW:用語"第一級市民"は推奨されません。社会的に課金される用語としての包括的言語のグーグルスタイルガイドによる: developers.google.com/style/inclusive-documentation
回答
定義
オブジェクトは、次の場合にファーストクラスになります。
- 変数とデータ構造に格納できます
- サブルーチンにパラメータとして渡すことができます
- サブルーチンの結果として返すことができます
- 実行時に構築できます
- (任意の名前に関係なく)固有のIDがあります
ここでは、「オブジェクト」という用語は大まかに使用されます。オブジェクト指向プログラミングで必ずしもオブジェクトを参照する必要はありません。整数や浮動小数点数などの最も単純なスカラーデータ型は、ほとんどの場合ファーストクラスです。
http://en.wikipedia.org/wiki/First_class_object
コメント
- つまり、列挙型を2番目のクラスのオブジェクトにする理由.net / C#?
- @ Gulshan-本質的なアイデンティティの欠如を主張することができます-C#列挙型は基本的に単なる構文糖衣です(つまり、"与えられた名前<整数値の場合はdivid = "d6c985c9ee">
)。列挙型がそれ自体でオブジェクトであるJavaと比較してください。
回答
"第一級市民"または"第一級要素
- 変数によって名前を付けることができます。
- プロシージャへの引数として渡すことができます。
- 結果として返される場合があります。手順。
- データ構造に含まれている場合があります。
基本的に、これで実行できることを意味します。プログラミング言語要素プログラミング言語の他のすべての要素で実行できるすべてのこと。
すべては"同等の権利:たとえば、整数を使用して上記のすべてを実行できるのに、なぜ他の何かが異なる必要があるのですか?
上記の定義は、実際にのみという意味で少し制限があります。プログラムのオブジェクトであることに関連するファーストクラスの側面について話します。より一般的な定義はあるものがすべてできるのであれば、それは一流であり、同様の種類の他のものでも行うことができます。
たとえば、Java演算子とJavaメソッドは同じ種類です。新しいメソッドを定義したり、(ある程度)独自のメソッドの名前を自由に選択したり、メソッドをオーバーライドしたり、メソッドをオーバーロードしたりできます。 James Goslingも演算子を使ってこれらすべてを行うことができますが、あなたと私はできません。つまり、一般的な信念に反して、Javaは演算子のオーバーロードをサポートします。 、+
演算子がbyte
、short
、、long
、float
、double
、String
、およびJava7のIIRCもBigInteger
およびBigDecimal
(およびおそらく私が忘れたカップル)に対して、 あなたがそれに影響を与えないというだけです。これは明らかに、この2番目の定義に従って演算子を2番目のクラスにします。ただし、メソッドはまだ最初の定義によるとファーストクラスのオブジェクトではないことに注意してください。(これにより、演算子はサードクラスになりますか?)
コメント
- すばらしい答えです。たとえば、 pipenv docs は" Windowsは第一級市民です。 "これは、Windowsでは
pipenv
を使用して、Linuxでも実行できることをすべて実行できることを意味しますか? - いいえ、'用語"第一級市民"はこの用語の正式なプログラミング言語理論の定義と関係があります。pipenvは通常の標準的な英語の意味でこの用語を使用しているだけだと思います。
- "のように公平に扱われましたか?"ご協力いただきありがとうございます。
回答
通常、この参照パラメータとして渡すことができる構造へのrsは、関数からの戻り値の型として定義するか、値を割り当てることができます。通常、実行時にそれらを構築できる必要があります。たとえば、クラスのインスタンスはc ++またはjavaの第一級市民ですが、Cの関数はそうではありません。
コメント
- クラスをC ++の第一級市民にする理由
- @bjarkef:すでに回答済みのようですね前の文で提供された説明と一致することによって。
- @Jonathan:はい、申し訳ありませんが、"実行時にそれらを作成します"。はい、実行時にクラスのインスタンス(オブジェクト)を作成できますが、クラス自体を作成することはできません。それが私を混乱させたものです。
- パラメータを渡すだけではまだ十分ではありません。 C / C ++でも、私は関数を二級市民と見なします。それらはパラメータとして渡され、他のオブジェクト内に配置された結果として返されます。ただし、他の構造を使用せずに操作することはできません(たとえば、パラメーターを関数にバインドするにはstd :: bindが必要です)。
- @Martin関数がC / C ++の第一級市民であるとは決して言いませんでした。 。
回答
機能が言語のみで実装されている場合、その機能は第一級市民であると言えます。 。
つまり、その機能を実装するために複数の言語機能や標準ライブラリは必要ありません。
例:
C / C ++では、関数を最初のものとは見なしていません。第一級市民(他の人もそうかもしれません)。
これは、言語によって直接サポートされているが、他の言語機能の使用を必要とする関数を操作する方法があるためです。関数へのパラメーターのバインドは直接サポートされていないため、この機能を実装するにはファンクターを作成する必要があります。
コメント
- Wouldn 'バインドされた関数(または"クロージャ")をファーストクラスにしないのに、関数自体はファーストクラスですか? 0x 'のクロージャーのサポートは、分析にどのように影響しますか?
- @Fred Nurk:すべて言語によって異なります。一部の言語では、クロージャはファーストクラスのシステムです。他ではそうではありません。私はまだC ++ 0xに精通していないため、明示的なコメントをすることはできません。
- 'は、言語がCまたはC ++のいずれかであると言います(ただし、0xではありません) )、あなたが答えるように。 ' "ファーストクラス"の定義では、バインドされた関数(または"クロージャ")関数自体はファーストクラスではありませんか?
- @Fred Nurk:制限する場合関数でできることは、それらをクロージャにすることだけです。しかし、私にとっては、'は、プラットフォームがライブラリをインポートすることによってのみ整数の加算をサポートするかどうかを言うようなものです。その場合、整数は第一級市民ですが、整数の加算は考慮されません。私の見解では、クロージャは、新しい関数を効果的に返す関数で実行できる操作です(ただし、定義方法によって異なります)。しかし、クロージャとバインディングは、議論から除外している他の操作の2つにすぎません(それが質問であったかどうかはわかりません)。
- @Martin:自分自身を明確に説明してはいけません。 "機能が、言語"によってのみ実装されている場合、その機能は第一級市民であるとすると、CとC ++の両方の関数が実装されます。言語によってのみ、したがって一流になります。バインドされた関数("クロージャ"とも呼ばれます)は、' reバインディングパラメータなどについて話しますが、それは'別の機能です。
回答
すでに提供されている回答に例を追加するには:
WCFの場合 / C#現在、クラスオブジェクトをサービスとして動作させるには、サービスコントラクト属性でクラスオブジェクトをマークする必要があります。 次のようなものはありません。
public **service** MyService (in relation public **class** MyClass).
クラスはc#の第一級市民であり、サービスはありません。
希望 これは役立ちます