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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Lua

Luaは、汎用のスクリプト言語の一つで、 移植性が高く、高速な実行速度などの特徴を持ち 手続き型・オブジェクト指向言語としても利用可能で 関数型言語、データ駆動型の要素も併せ持っている言語です。

Q&A

解決済

1回答

3277閲覧

Luaの引数(関数を引数に取れる)のは有効?

oyabun

総合スコア32

Lua

Luaは、汎用のスクリプト言語の一つで、 移植性が高く、高速な実行速度などの特徴を持ち 手続き型・オブジェクト指向言語としても利用可能で 関数型言語、データ駆動型の要素も併せ持っている言語です。

0グッド

0クリップ

投稿2014/09/04 03:06

Lua言語を始めてまだ3日です。

Lua言語は関数を引数にとれるようですね。どうしてこのような機能があるか良く分かりません。

便利な使い方を教えてください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

関数の引数に関数を渡すのは高階関数といって、最近のプログラミング言語では結構一般的です。

利用例としてはソート時に独自の比較関数を用意してソートしたりする場合に使えます。

lang

1vals = {"a", "b", "B", "c"} 2 3-- 通常のソート 4table.sort(vals) 5print(table.concat(vals,", ")) -- B, a, b, c 6 7-- 大文字小文字を区別しないソート 8table.sort(vals, 9 function(a,b) 10 return (string.lower(a) < string.lower(b)) 11 end) 12print(table.concat(vals,", ")) -- a, b, B, c

また、自作のユーザー型などの場合は比較関数を渡さないと比較できません。

その他にもテーブルなどのデータの処理に使われます。

次の例ではテーブルに関数を適用して新しいテーブルを作る(マッピング, 写像)処理の関数を作って、それを使っています。

lang

1-- マッピング 2function map(func, array) 3 local new_array = {} 4 for i,v in ipairs(array) do 5 new_array[i] = func(v) 6 end 7 return new_array 8end 9 10-- 値を 2 倍する関数を {1,2,3} に適用 11dest = map(function(x) return 2 * x end, {1,2,3}) 12print(table.concat(dest,", ")) -- 2, 4, 6

高階関数を使ったコレクション(lua ではテーブル)などのデータ処理は関数型言語ではポピュラーな手法です。
これは便利なので C#(LINQ), Java, C++(C++14) など関数型以外の多くの言語で取り入れられていっています。

Lua ではデフォルトでそういった関数は用意されていませんが、高階関数が使えるので一応できるようになっています。

投稿2014/09/04 17:10

yohshiy

総合スコア863

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

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

oyabun

2014/09/05 00:54

回答ありがとうございました!参考にさせていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問