質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

3回答

3616閲覧

第一級オブジェクトの意味

aaaaaaaa

総合スコア501

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

2グッド

1クリップ

投稿2016/09/28 11:14

javascriptの関数は、静的なスコープを持ち第一級オブジェクトであるとjavascript theGoodPartsに書いてありました。
第一級関数なら、関数を普通の値の如く変数に値を代入したり、関数の返り値として扱えたりすることを意味しますが、第一級オブジェクトが何なのか良くわかりません。
wikipediaで調べてみたのですが、生成や代入、演算、受け渡しを制限無しに行える他、以下のような特徴があるうえ、第一級オブジェクトのオブジェクトは、
いわゆる、{a:1,b:"第一級オブジェクト"}のようなオブジェクトではなく広く対象物、客体を指すそうです。

無名のリテラルとして表現可能である。
変数に格納可能である。
データ構造に格納可能である。
それ自体が独自に存在できる(名前とは独立している)。
他のものとの等値性の比較が可能である。
プロシージャや関数のパラメータとして渡すことができる。
プロシージャや関数の戻り値として返すことができる。
実行時に構築可能である。
表示可能である。
読み込むことができる。
分散したプロセス間で転送することができる。
実行中のプロセスの外に保存することができる。

二番目の変数に格納できるというのは、第一級関数と同じなので理解できますが、それ以外は、さっぱりわかりません。
第一級オブジェクトとは、いったい何なのでしょうか。噛み砕いて説明していただけるとさいわいです。

miyabi-sun, mit0223👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mit0223

2016/09/28 14:07

Wikipedia の第一級関数の定義は「計算機科学において、第一級関数(だいいっきゅうかんすう、英: first-class function、ファーストクラスファンクション)[1]とは、関数を第一級オブジェクトとして扱うことのできるプログラミング言語の性質、またはそのような関数のことである。」なので、この質問としては区別する必要はないのではないでしょうか。
guest

回答3

0

第一級オブジェクトとは
噛み砕いて説明

制限が少なくて自由な身分だという意味です。
(「一級市民」「ファーストクラス」のイメージ)

関数をデータと同等に扱えることで、
処理の自由度が高まります。
結果、簡潔に書けます。

ちなみに、関数の扱いを第一級にするのは、
Lispがすでに大昔からやっていて、
JavaScriptは、それを元ネタにしました。

投稿2016/09/28 11:59

LLman

総合スコア5592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aaaaaaaa

2016/09/29 08:27

ご回答有難うございました。ちんぷんかんぷんでしたが何かつかめそうな気がします。
guest

0

ほぼすべての言語において、整数や浮動小数点数などの最も単純なデータ型は第一級オブジェクトである。古い言語においては配列は第一級オブジェクトではなかった。それらはオブジェクトとして代入することはできず、その要素のみを直接処理することしかできなかった。

単純にこんな感じなのではないでしょうか?

  • 数値や文字列は引数や変数、戻り値等で設定可能(=第一級オブジェクト)
  • JSの関数は第一級関数だから(数値や文字列)と同じように扱う
  • 関数が数値や文字列と同じように扱う≒関数は第一級オブジェクト

「言語によって異なるが、第一級オブジェクトは概ね次のような性質をもつ。」とあるように、
JavaScriptの関数が「プロセス外に保存出来ない」からといって第一級オブジェクト失格という話ではなさそうです。

投稿2016/09/29 03:08

編集2016/09/29 05:46
miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aaaaaaaa

2016/10/21 10:21

ご回答有難うございます。 古臭い言語は、配列について"オブジェクトとして代入できなかった"とありますが、どういうことなのでしょうか。
guest

0

まずは、実際にコードを書いてみます。

javascript

1// 無名の関数リテラルを作成して、 2// それを変数に代入する 3var f = function(){ ... }; 4 5// Objectに関数を入れる 6var obj = { foo: function(){ ... } }; 7 8// 関数を返す関数 9function bar(){ 10 return function(){ ... }; 11}

このように、JavaScriptの関数は、値を必要とするところにはどこでも書くことができます。こういう特徴を持つものが「第一級オブジェクト」です。

なお、他の言語と比較してみるとよりわかりやすいかと思います。たとえば、C言語では配列や関数はそのまま引数として渡したり代入したりということができないオブジェクトです。

投稿2016/09/28 12:05

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mit0223

2016/09/28 14:04

便乗質問してもよいでしょうか? Wikipedia によると、第一級オブジェクトの性質として、「分散したプロセス間で転送することができる。」とありますが、自由変数を含むクロージャもこの性質を満たすのでしょうか?自由変数が複数のクロージャから共有されている場合でも、うまく転送できるのでしょうか?
KSwordOfHaste

2016/09/28 15:13 編集

「できない」と思いますがそれは通常の文脈で第一級オブジェクトであると一般に考えられている多くのものにあてはまると思いますのでクロージャーがどうかを論ずる前に「第一級であるかどうか」についてどういう前提で何の目的で議論するか明確したほうがいいと思います。例えば「複数プロセスにわたる同一性とは」という別次元の議論になるのではあればこの質問とは分けた方がよいと感じます。
mit0223

2016/09/29 00:11

それにしても、 Wikipedia の > 言語によって異なるが、第一級オブジェクトは概ね次のような性質をもつ。 > 表示可能である。 > 読み込むことができる。 > 分散したプロセス間で転送することができる。 > 実行中のプロセスの外に保存することができる。 は乱暴すぎるように思われます。こんな言語あるのでしょうか?このままの意味ですと、自由変数やオブジェクトの循環参照まで含めてシリアライズ・デシリアライズできる必要があります。 何の目的でというと、Wikipediaのこの定義は一般的でしょうか?ということを知りたいです。質問をわけてみましょうか。
KSwordOfHaste

2016/09/29 06:42 編集

miyabi-sunさんの回答が自分には納得できました。「どうやってもできない場合に第一級オブジェクトといえない」という点がポイントであり、「(そのオブジェクトにより実装可能な典型的な機能が)プロセス間で転送できるならば第一級と称して差し支えないでしょう」という程度のニュアンスだと思います。(失礼しました!敬称をつけ忘れてましたm(_ _)m)
mit0223

2016/09/29 12:38

maisumakunさんの『値を必要とするところにはどこでも書くことができます。こういう特徴を持つものが「第一級オブジェクト」です。』がわかりやすいと思いました。Wikipedia については、できる・できないの定義も気になりますが、一般論として、シリアライズ・デシリアライズ可能というのは第一級オブジェクトの要件なのでしょうか? ここまでの回答では、誰もそこに触れてませんよね。Wikipedia に -1 したいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問