「ファーストクラスオブジェクト」とはどういう意味ですか?


146

、最近の質問、私はとりわけ、上の話をする提案を受け、機能は「最初のクラスのオブジェクトではJavaScriptの様相。他のオブジェクトとは対照的に、このコンテキストでの「ファーストクラス」とはどういう意味ですか?

編集(JörgW Mittag):完全な重複:「ファーストクラスのプログラミング構成とは何ですか?」


回答:


179

ウィキペディアを引用するには:

コンピュータサイエンスでは、プログラミング言語は、関数をファーストクラスのオブジェクトとして扱う場合、ファーストクラスの関数(または関数リテラル)をサポートすると言われています。具体的には、プログラムの実行中に新しい関数を作成し、データ構造に保存し、引数として他の関数に渡し、他の関数の値として返すことを言語がサポートしていることを意味します。

このページはまたそれを美しく示しています:

本当に、他の変数と同じように

  • 関数はオブジェクト型のインスタンスです
  • 関数はプロパティを持つことができ、コンストラクタメソッドへのリンクを持ちます
  • 関数を変数に保存できます
  • 関数をパラメーターとして別の関数に渡すことができます
  • 関数から関数を返すことができます

TrayManのコメントも読んでください。興味深い...


11
ウィキペディアを引用するのは素晴らしくて率直ですが、説明は科学者向けであり、オタク向けではありません。とにかくそれはすべて何を意味するのですか?その引用の最後の文はvaguです。
スポーク、2009

1
@ Spoike、true ... javascriptリソースが提供されました。
Sander Versluys、2009

16
便利なことに、ファーストクラスの関数を除外する1次関数に限定されるのではなく、ファーストクラスの関数を持つ言語には高次の関数もあります。(ただし、高次ではなく、ファーストクラスは可能です。)
TrayMan、2009

5
ウィキペディアの引用には不明確な点はありませんでしたが、追加のリンクはすばらしいです。
ProfK 2009

4
リンクはもう機能していません(約8年後)。
doubleOrt 2017

47

プログラミング言語における「ファーストクラス関数」の概念は、1960年代にイギリスのコンピューター科学者クリストファー・ストレーキーによって導入されました。この原理の最も有名な定式化は、おそらく、ジェラルド・ジェイ・サスマンとハリー・アベルソンによるコンピュータプログラムの構造と解釈にあります

  • それらは変数によって命名されるかもしれません。
  • それらは手続きへの引数として渡されるかもしれません。
  • 手続きの結果として返却される場合があります。
  • それらはデータ構造に含まれる場合があります。

基本的に、それはプログラミング言語の他のすべての要素で実行できるすべてのことを関数で実行できることを意味します。つまり、JavaScriptの場合は、整数、文字列、配列、その他の種類のオブジェクトで実行できるすべてのこと、つまり関数で実行できるということです。


14

Strachey-Sussman-Abelsonの公式のより完全な承認。あなたの言語がそのような構成をサポートしているなら、あなたは持っていますはファーストクラス言語としての関数ます :)

var men = function (objectOfAdmiration) {
  return objectOfAdmiration();
};
men.isSweetHeart = true;

var women = function (objectOfAdmiration) {
  return objectOfAdmiration();
};
women.isSweetHeart = true;

var aliens = function (objectOfAdmiration) {
  return objectOfAdmiration();
};

function like(obj){
  if (obj.isSweetHeart) {
      return function (){ return "Holy TRUE!"}; 
  }
  else {
      return function (){ return "Holy CRAP!"};
  }
}

alert("Men like women is " + men(like(women))); // -> "Holly TRUE!"
alert("Women like men is " + women(like(men))); // -> "Holly TRUE!"

alert("Men like aliens is " + men(like(aliens))); // -> "Holly CRAP!"
alert("Aliens like women is " + aliens(like(women))); // -> "Holly TRUE!" :)

//women(like(aliens)); //  Who knows? Life is sometimes so unpredictable... :)

要するに、それが言語でオブジェクトの一種の状態操作またはオブジェクトのタイプとして言語で機能する場合、何もがファーストクラスのオブジェクトです。単に操作してステートメントを渡し、同時に式で評価できるもの。またはさらに短く:関数を追加で呼び出すことができるオブジェクトと考えることができる場合。


9

JavaScript関数はファーストクラスの関数であり、関数とオブジェクトは同じものとして扱われます。関数は、オブジェクトまたは配列内の変数として格納できます。また、引数として渡したり、別の関数から返すこともできます。それは関数を「JavaScriptのファーストクラスの市民」にします

JavaScriptはリテラル表記構文を使用しているため、JavaScriptの関数がオブジェクトであるという事実を完全に理解することは困難です。

例えば..

var youObj1 = new Object();
// or
var youObj1 = {};

両方のdeclerationは同等です。を使用しnewて、オブジェクトのコンストラクター関数を呼び出しています。また、{}(リテラルと呼ばれるJavaScriptショートカット)を使用して、オブジェクトの構築関数を呼び出しています。{}コンストラクタをインスタンス化するための短い表現です。

ほとんどの言語では、newキーワードを使用してオブジェクトを作成するため、JavaScriptオブジェクトを作成します。

var myFunction = new Function("a",  "b", 'return a_b');

ご覧のとおり、オブジェクト名関数を作成しました

JavaScript関数式を使用して同じオブジェクト名関数を作成しています。

var myFunction = function myFunction(a,b) {
    return a+b;
}

ここでは、オブジェクト名関数を作成しました。


9

JavaScript関数では、オブジェクトが実行できることよりも多くの機能を実行できるため、ファーストクラスのオブジェクトです。

  • 関数はオブジェクト型のインスタンスです。

Function instanceof Object //returns true

オブジェクトのように、関数はプロパティを持つことができ、そのコンストラクター関数へのリンクを持つことができます。

 var o = {}; // empty object 'o'
    o.a = 1 ; 
    o.b = 2 ; 

    console.log(o.a); // 1
    console.log(o.b); // 2 


    function foo(){};
    foo.a = 3 ; 
    foo.b = 4 ; 

    console.log(foo.a);  // logs 3
    console.log(foo.b);  // logs 4 

  • 関数は値として変数に格納できます。

  var foo = function(){}; 
    console.log(foo); // function(){}

  • 関数は引数として他の関数に渡すことができます

function callback (foo){
      foo();
}

callback(function(){console.log('Successfuly invoked as an argument inside function callback')})

  • 関数から関数を返すことができます

 function foo(){
	    return function(){console.log('working!')};
    }

    var bar = foo();
    bar(); // working!

  • 参照として変数に格納できます。

    var sum = function (a,b){return a+b}  
    sum(4,4);


オブジェクトもそれをすべて実行できます。
doubleOrt 2017

5

簡単なテスト。あなたの言語でこれを行うことができる場合(例としてPython):

def double(x):
    return x*x

f = double

print f(5) #prints 25

あなたの言語は関数をファーストクラスのオブジェクトとして扱っています。


3
しかし、私はこれをC ++で行うことができます。intTwice(int x){return x << 1; } int(* f)(int)= 2回; std :: cout <<(* f)(5)<< std :: endl; それは、C ++が関数をファーストクラスのオブジェクトとして(おかしな構文で)扱うことを意味しますか?
Thomas L Holaday、

1
関数内に関数を作成できるまで、私はノーと言いたいです。
cHao

1
C関数ポインターはファーストクラス関数(の非常に限定された定義)をサポートしますが、関数はオブジェクトではありません。Cの関数ポインタには、状態や動作は含まれていません。
スティーブンクレイマー

2

つまり、関数はオブジェクトであり、型と動作を備えています。それらは動的に構築し、他のオブジェクトと同様に渡すことができ、それらを呼び出すことができるという事実はそれらのインターフェースの一部です。


2

これは、関数が実際にオブジェクトを継承することを意味します。それを他のオブジェクトと同じように渡し、操作できるようにします。

ただし、c#では、関数を操作するためにデリゲートまたはリフレクションを控える必要があります。(これは最近ラムダ式ではるかに良くなりました)


2

Mozillaサイトの定義は簡潔で明確です。彼らによると、

JavaScriptでは、関数は他のオブジェクトと同じようにプロパティとメソッドを持つことができるため、ファーストクラスのオブジェクトです。それらを他のオブジェクトと区別するのは、関数を呼び出すことができることです。簡単に言うと、これらはFunctionオブジェクトです。

そして

関数は、関数の外部コード(再帰の場合は内部コード)から呼び出すことができる「サブプログラム」です。プログラム自体と同様に、関数は関数本体と呼ばれる一連のステートメントで構成されます。値は関数に渡すことができ、関数は値を返します。


0

何かが言語の最初のクラスであるとき、それはそれがライブラリや構文糖というよりもその構文によってサポートされていることを意味すると思います。たとえば、Cのクラスはファーストクラスではありません


0

JavaScriptでは単純です。関数はファーストクラスのオブジェクトです。つまり、関数のタイプはObjectであり、実際にはオブジェクトであるため、他のオブジェクト(String、Array、Numberなど)と同じようにファーストクラスの方法で使用できます。自分自身。それらは「変数に格納され、関数に引数として渡され、関数内で作成され、関数から返されます。

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