はじめに

編集

高階関数は、関数を引数として受け取るか、関数を戻り値として返す関数のことです。高階関数を活用することで、コードの再利用性が向上し、より柔軟で強力なプログラムを書くことができます。この章では、JavaScriptとRubyにおける高階関数の概念と具体的な使い方を学びます。

高階関数とは

編集

高階関数は、以下のいずれかの特徴を持ちます。

  1. 関数を引数として受け取る
  2. 関数を戻り値として返す

高階関数を使うことで、共通の処理を抽象化し、異なる振る舞いを関数として注入することができます。

関数を引数として受け取る高階関数

編集

関数を引数として受け取る高階関数の代表例として、配列の反復処理を行うメソッド(mapfilterreduceなど)があります。

mapメソッド

編集

mapメソッドは、配列の各要素に対して関数を適用し、新しい配列を生成します。

JavaScriptの例

編集
const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map(function(num) {
    return num * 2;
});
console.log(doubled); // [2, 4, 6, 8, 10]

Rubyの例

編集
numbers = [1, 2, 3, 4, 5]
doubled = numbers.map { |num| num * 2 }
puts doubled.inspect # [2, 4, 6, 8, 10]

filterメソッド

編集

filterメソッドは、条件に合致する要素だけを抽出して新しい配列を生成します。

JavaScriptの例

編集
const numbers = [1, 2, 3, 4, 5];
const evens = numbers.filter(function(num) {
    return num % 2 === 0;
});
console.log(evens); // [2, 4]

Rubyの例

編集
numbers = [1, 2, 3, 4, 5]
evens = numbers.select { |num| num % 2 == 0 }
puts evens.inspect # [2, 4]

reduceメソッド

編集

reduceメソッドは、配列の各要素を累積して単一の値に集約します。

JavaScriptの例

編集
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce(function(accumulator, current) {
    return accumulator + current;
}, 0);
console.log(sum); // 15

Rubyの例

編集
numbers = [1, 2, 3, 4, 5]
sum = numbers.reduce(0) { |accumulator, current| accumulator + current }
puts sum # 15

関数を戻り値として返す高階関数

編集

関数を戻り値として返す高階関数は、特定の振る舞いを持つ関数を動的に生成するために使用されます。

カウンター関数

編集

カウンター関数は、呼び出されるたびにカウントを増やす関数を返します。

JavaScriptの例

編集
function createCounter() {
    let count = 0;
    return function() {
        count++;
        return count;
    };
}

const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2

Rubyの例

編集
def create_counter
    count = 0
    -> { count += 1 }
end

counter = create_counter
puts counter.call # 1
puts counter.call # 2

乗算関数を生成する高階関数

編集

特定の数値を乗算する関数を生成する高階関数です。

JavaScriptの例

編集
function createMultiplier(multiplier) {
    return function(num) {
        return num * multiplier;
    };
}

const double = createMultiplier(2);
console.log(double(5)); // 10

Rubyの例

編集
def create_multiplier(multiplier)
    ->(num) { num * multiplier }
end

double = create_multiplier(2)
puts double.call(5) # 10

高階関数の応用例

編集

高階関数は、以下のような場面で特に有用です。

イベントハンドラ

編集

イベントハンドラとして関数を渡すことで、動的な振る舞いを実現できます。

JavaScriptの例

編集
document.getElementById("myButton").addEventListener("click", function() {
    alert("Button clicked!");
});

コールバック関数

編集

非同期処理において、処理が完了した後に実行されるコールバック関数として高階関数を使用します。

JavaScriptの例

編集
function fetchData(callback) {
    setTimeout(function() {
        callback("Data received!");
    }, 1000);
}

fetchData(function(data) {
    console.log(data); // "Data received!" (1秒後に表示)
});

Rubyの例

編集
def fetch_data(callback)
    sleep(1)
    callback.call("Data received!")
end

fetch_data(->(data) { puts data }) # "Data received!" (1秒後に表示)

練習問題

編集
  1. mapメソッド: 配列[1, 2, 3, 4, 5]の各要素を3倍にした新しい配列を作成するプログラムをJavaScriptとRubyで作成してください。
  2. filterメソッド: 配列[10, 15, 20, 25, 30]から15より大きい要素だけを抽出するプログラムをJavaScriptとRubyで作成してください。
  3. reduceメソッド: 配列[1, 2, 3, 4, 5]の各要素を掛け合わせた結果を計算するプログラムをJavaScriptとRubyで作成してください。
  4. 高階関数の作成: 引数として受け取った数値を2乗する関数を返す高階関数を作成し、それを利用して5の2乗を計算するプログラムをJavaScriptとRubyで作成してください。

まとめ

編集

高階関数は、関数を引数として受け取ったり、関数を戻り値として返したりすることで、コードの柔軟性と再利用性を大幅に向上させます。JavaScriptとRubyでは、mapfilterreduceなどのメソッドや、関数を動的に生成する高階関数を活用することで、効率的で読みやすいコードを書くことができます。