Lua#8 Luaで配列の各要素に対するループ処理を行う

Last modified: 2021-07-22

Luaで数値を用いたfor文でループ処理を行う” では数値を用いたfor文を扱ったが、ここでは汎用のfor文を用いて配列(としてのテーブル)の各要素に対するループ処理を行う。

解説

配列としてのテーブルの各要素に対するループの形

for [番号の変数], [要素の変数] in ipairs([配列としてのテーブル]) do
  -- 処理...
end

forの後ろには2つの変数名をコンマ区切りで記述し

  • 1つ目の名前の変数は要素の番号(1から始まり1ずつ増える)
  • 2つ目の名前の変数は要素の内容

としてdoendの間で参照できる。下は簡単な例。

$ lua -e "mon = {'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'}; for i, m in ipairs(mon) do print(('%s は %2d月'):format(m, i)) end"
Jan は  1月
Feb は  2月
Mar は  3月
Apr は  4月
May は  5月
Jun は  6月
Jul は  7月
Aug は  8月
Sep は  9月
Oct は 10月
Nov は 11月
Dec は 12月

コード例

下の例は英語の “million”, “billion”, “trillion” のような大きな数に付く名前(short scale1による)とその指数表記,生の値の “0” と “,” を用いた表記を並べて表示する。

[任意]ファイル名:008_ipairs.lua エンコーディング:UTF-8
#! /usr/bin/lua
-- -*- coding: utf-8 -*-

--[[--  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --
動作確認バージョン: 5.4, JIT2.1
--  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --]]

-----
----- 配列としてのテーブルとipairs()を汎用for文で用いたループ処理
-----

do
    -- millionやbillionのような名前を順番に13個用意
    local shortscale = {
        'million', 'billion', 'trillion',            --  1,  2,  3
        'quadrillion', 'quintillion', 'sextillion',  --  4,  5,  6
        'septillion', 'octillion', 'nonillion',      --  7,  8,  9
        'decillion', 'undecillion', 'duodecillion',  -- 10, 11, 12
        'tredecillion',                              -- 13
    }

    -- 配列の各要素ごとにループ処理
    -- 同時に、ループごとに1ずつ増える数字が使用できる
    -- ループ内(doとendの間)で番号iと配列の要素sとして用いる
    for i, s in ipairs(shortscale) do
        -- 末尾に付く "000" の数は名前の順番の数字(million:1, billion:2)より1多い
        -- 1 billionは(2+1=)3個, 1 trillionは(3+1=)4個
        -- 指数表記では "i + 1" を3倍し
        -- 生の表記では "000" を "i + 1" 回繰り返したものをコンマ区切りで得て
        -- "('000'):rep(i + 1, ',')"とする
        print(
            ('%2d: 1 %s (1.0e+%d) は 1,%s です'):format(
                i, s, 3 * (i + 1), ('000'):rep(i + 1, ',')))
    end
end

-- 終了

下は実行結果。

 1: 1 million (1.0e+6) は 1,000,000 です
 2: 1 billion (1.0e+9) は 1,000,000,000 です
 3: 1 trillion (1.0e+12) は 1,000,000,000,000 です
 4: 1 quadrillion (1.0e+15) は 1,000,000,000,000,000 です
 5: 1 quintillion (1.0e+18) は 1,000,000,000,000,000,000 です
 6: 1 sextillion (1.0e+21) は 1,000,000,000,000,000,000,000 です
 7: 1 septillion (1.0e+24) は 1,000,000,000,000,000,000,000,000 です
 8: 1 octillion (1.0e+27) は 1,000,000,000,000,000,000,000,000,000 です
 9: 1 nonillion (1.0e+30) は 1,000,000,000,000,000,000,000,000,000,000 です
10: 1 decillion (1.0e+33) は 1,000,000,000,000,000,000,000,000,000,000,000 です
11: 1 undecillion (1.0e+36) は 1,000,000,000,000,000,000,000,000,000,000,000,000 です
12: 1 duodecillion (1.0e+39) は 1,000,000,000,000,000,000,000,000,000,000,000,000,000 です
13: 1 tredecillion (1.0e+42) は 1,000,000,000,000,000,000,000,000,000,000,000,000,000,000 です
  • 使用したバージョン
    • Lua 5.4.2
    • LuaJIT 2.1.0 Beta 3

  1. 1,000倍ごとに次の名前に進む形 ↩︎