プログラミング/高階関数
はじめに
編集高階関数は、関数を引数として受け取るか、関数を戻り値として返す関数のことです。高階関数を活用することで、コードの再利用性が向上し、より柔軟で強力なプログラムを書くことができます。この章では、JavaScriptとRubyにおける高階関数の概念と具体的な使い方を学びます。
高階関数とは
編集高階関数は、以下のいずれかの特徴を持ちます。
- 関数を引数として受け取る
- 関数を戻り値として返す
高階関数を使うことで、共通の処理を抽象化し、異なる振る舞いを関数として注入することができます。
関数を引数として受け取る高階関数
編集関数を引数として受け取る高階関数の代表例として、配列の反復処理を行うメソッド(map
、filter
、reduce
など)があります。
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秒後に表示)
練習問題
編集- mapメソッド: 配列
[1, 2, 3, 4, 5]
の各要素を3倍にした新しい配列を作成するプログラムをJavaScriptとRubyで作成してください。 - filterメソッド: 配列
[10, 15, 20, 25, 30]
から15より大きい要素だけを抽出するプログラムをJavaScriptとRubyで作成してください。 - reduceメソッド: 配列
[1, 2, 3, 4, 5]
の各要素を掛け合わせた結果を計算するプログラムをJavaScriptとRubyで作成してください。 - 高階関数の作成: 引数として受け取った数値を2乗する関数を返す高階関数を作成し、それを利用して
5
の2乗を計算するプログラムをJavaScriptとRubyで作成してください。
まとめ
編集高階関数は、関数を引数として受け取ったり、関数を戻り値として返したりすることで、コードの柔軟性と再利用性を大幅に向上させます。JavaScriptとRubyでは、map
、filter
、reduce
などのメソッドや、関数を動的に生成する高階関数を活用することで、効率的で読みやすいコードを書くことができます。