閉じる

関数は値になる?第一級オブジェクトの意味をやさしく解説

プログラミングで「関数は値になる」と聞くと難しく感じますが、実は道具としての関数をもっと自由に扱えるようになるだけです。

本記事では、第一級オブジェクト(第一級市民)の意味をやさしく解説し、JavaScriptとPythonの具体例で手触りをつかめるように段階的に説明します。

エンジニアの求人
読み込み中…

第一級オブジェクト(第一級市民)の意味

プログラミングでの定義

定義の全体像

第一級オブジェクトとは「その言語で、他の値と同じように扱えるもの」のことです

ここでいう「他の値」とは、数値や文字列のように、変数に入れたり、関数に渡したり、戻り値にしたり、配列や辞書の中に入れたりできる存在を指します。

実務での言い換え

関数を数字や文字列と同じノリで持ち運べる、と考えてみてください。

すると、コードの組み合わせや差し替えが簡単になります。

「関数は値になる」とは

何が「値」なのか

「関数は値になる」とは、関数そのものをデータとして扱えるという意味です。

関数を変数に入れたり、他の関数に渡したり、関数から関数を返したりできます。

これにより、処理の流れを動的に決められるようになります。

日常のたとえ

関数を「レシピ」と考えるとイメージしやすいです。

レシピの紙を封筒に入れて渡したり、箱にしまったり、別の人から受け取ったりできるように、関数という「作業手順」も持ち運びできるのです。

初心者向けの考え方

関数そのものと実行結果の違い

f と f() は違います

前者は「関数そのもの」、後者は「関数を実行した結果」です。

第一級オブジェクトとして扱うときは、よく「f を渡す」か「f() を渡す」かで迷いますが、処理の手順を渡したいなら f、結果を渡したいなら f()と覚えておくと混乱しにくいです。

一歩ずつ覚える

最初は「変数に入れる」「引数に渡す」「戻り値にする」の3つに集中しましょう。

これで第一級オブジェクトの感覚がつかめます。

条件

第一級オブジェクトの主な条件と例

以下のような扱いができれば、その要素は第一級オブジェクトと言えます。

関数がこれらを満たすなら、関数は第一級オブジェクトです。

条件できることの例
変数に代入できる関数を変数や定数に入れて名前を付ける
引数に渡せるsort に比較関数を渡す、map に変換関数を渡す
戻り値にできる条件に応じて別の関数を返す
配列や辞書に格納できる名前と関数の対応表を辞書に入れる
無名で作れるその場で関数を作成して使う

用語メモ

よく出る言葉の簡単な辞書

用語ざっくり意味
第一級オブジェクト値と同様に自由に扱える要素のこと
高階関数関数を引数や戻り値に使う関数
無名関数 ラムダ名前を付けずにその場で作る関数
コールバック後で呼び出すために渡される関数
クロージャ外側の変数を覚えたままの関数

「オブジェクト」は広い意味

言語ごとの言葉の違い

「オブジェクト」という言葉は、必ずしもクラスのインスタンスだけを指すわけではありません。

ここでは「オブジェクト=値」くらいの広い意味で使っています。

関数型言語でも手続き型言語でも、「値として扱えるか」がポイントです。

誤解しやすい点

OOPの「オブジェクト」と完全に同じ意味ではありません

第一級オブジェクトは機能的な性質を示す言葉です。

関数が第一級オブジェクトだと便利な理由

関数を変数にして再利用

同じ処理を何度でも

関数を変数に入れておけば、同じ処理を好きな名前で何度でも使い回せます

設定や環境ごとに違う処理を、変数の差し替えだけで切り替えられるのが大きな利点です。

実務での効果

ログの出力方法、数値のフォーマット、検証ロジックなどを関数として差し替えるだけで、分岐だらけのコードを避けられます。

関数を引数にして処理を差し替え

仕組みは同じ、やることだけ違う

何をするかを「引数の関数」に任せると、処理の枠組みは共通化でき、細かな動作だけ簡単に交換できます。

たとえば並べ替えの基準や、文字列の加工方法を引数で切り替えます。

実務での効果

イベント処理、非同期処理の完了時の動き、エラーハンドリングなど、動的に差し替えたい場面で活躍します。

関数を戻り値にして振る舞いを組み立て

作るのは「関数を作る関数」

関数を返す関数を使うと、状況に応じて最適な関数をその場で作ることができます。

入力の検証器や計算器を、パラメータから組み立てるイメージです。

実務での効果

機能の組み合わせを部品化しやすくなり、重複コードが減ります。

必要な振る舞いだけを返すので、テストもしやすくなります。

短く柔軟なコードになる

表現力の向上

map や filter といった高階関数と無名関数を組み合わせると、意図が短く明確に書けます

分岐や一時変数が減り、読みやすいコードになります。

保守性の向上

関数の差し替えで仕様変更に対応しやすくなり、条件分岐の追加より安全です。

小さな変更が局所化されます。

具体例で理解

JavaScript: 関数を変数に代入

基本の形

JavaScript
const double = x => x * 2;   // 無名関数を定数に代入
const f = double;            // 関数を別名にコピー
console.log(f(3));           // 6

上では、関数を数値と同じように変数に入れています。

代入できること自体が第一級オブジェクトの証拠です。

コレクションに入れる

JavaScript
const add1 = x => x + 1;
const mul2 = x => x * 2;

const ops = [add1, mul2];        // 配列に格納
console.log( ops[1](5) );        // 10

JavaScript: 関数を引数に渡す

処理の差し替え

JavaScript
function applyTwice(fn, x) {
  return fn(fn(x));              // 引数の関数を2回適用
}

const double = x => x * 2;
console.log( applyTwice(double, 3) );  // 12

関数を引数に渡すことで、applyTwice は「何をするか」を知りませんが、枠組みだけを提供できます。

JavaScript: 関数を戻り値にする

関数を作る関数

JavaScript
function makeMultiplier(n) {
  return x => x * n;             // n に応じた関数を返す
}

const triple = makeMultiplier(3);
console.log( triple(4) );        // 12

このように関数を返せると、用途に合わせた処理を組み立てられます。

Python: 関数を変数に代入

基本の形

Python
def double(x):
    return x * 2

f = double            # 関数を変数に入れる
print(f(3))           # 6

辞書に入れて切り替え

Python
def add1(x): return x + 1
def mul2(x): return x * 2

ops = {"add": add1, "mul": mul2}
print(ops["mul"](5))  # 10

Python: 関数を引数に渡す

処理の差し替え

Python
def apply_twice(fn, x):
    return fn(fn(x))

def double(x):
    return x * 2

print(apply_twice(double, 3))  # 12

Python: 関数を戻り値にする

条件に応じた関数を返す

Python
def make_multiplier(n):
    def mul(x):
        return x * n
    return mul

triple = make_multiplier(3)
print(triple(4))  # 12

外側の n を覚えている関数を返しています。

これが「クロージャ」です。

ここでは「必要な数字を覚えた関数が返ってくる」程度の理解で十分です。

第一級オブジェクトかを見分けるチェック

代入できるか

見分け方

関数を変数に入れて使えるかを試します。

エラーにならずに呼び出せれば合格です。

代入は最初の関門です。

引数に渡せるか

見分け方

関数を引数に取る関数を1つ書いて、渡してみます。

言語が対応していれば素直に動きます。

戻り値にできるか

見分け方

関数から関数を返して、それを受け取って実行できるかを確認します。

ここまでできれば、ほぼ第一級と考えてよいです。

配列や辞書に格納できるか

見分け方

関数をリストや辞書に入れて、取り出して呼び出します。

コレクションに入れられるかは実務で特に役立つポイントです。

制限がある言語に注意

注意書き

すべての言語が関数を第一級として扱うわけではありません

古い言語仕様では、関数を直接渡せず、代わりに「関数オブジェクト」や「関数ポインタ」など別の仕組みを使う場合があります。

迷ったら、その言語で「関数を変数に入れられるか」を最初に試してみてください。

小さな指針

迷ったら「代入・引数・戻り値・格納」の4点チェックを行いましょう。

公式ドキュメントの「高階関数」「ラムダ」といったキーワードも手がかりになります。

まとめ

第一級オブジェクトとは、他の値と同じように自由に扱える要素のことです。

関数が第一級オブジェクトである言語では、関数を変数に入れたり、引数に渡したり、戻り値にしたり、配列や辞書に格納したりできます。

結果として、処理の差し替えや組み立てが簡単になり、短く読みやすいコードを書けます。

まずは「f と f() の違い」に注意しながら、代入・引数・戻り値・格納の4点を小さなコードで試してみてください。

シンプルな練習を重ねるほど、第一級オブジェクトの便利さが自然と体に染み込みます。

エンジニアの求人
読み込み中…
プログラミング - 基礎理論と概念

この記事を書いた人
エーテリア編集部
エーテリア編集部

このサイトでは、プログラミングをこれから学びたい初心者の方に向けて記事を書いています。 基本的な用語や環境構築の手順から、実際に手を動かして学べるサンプルコードまで、わかりやすく整理することを心がけています。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!