試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

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

本日の猫


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

  1. 配列としてのテーブルの各要素に対するループの形
  2. コード例

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

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

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

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

として「do」と「end」の間で参照できる。下は簡単な例。

$ 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 scale*1による)とその指数表記,生の値の「0」と「,」を用いた表記を並べて表示する。
[任意]ファイル名: 008_ipairs.lua エンコーディング: UTF-8

#! /usr/bin/lua
-- -*- coding: utf-8 -*-

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

-----
----- 配列としてのテーブルと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 (('%02d: 1 %s (1.0e+%d) は 1,%s です'):format (i,
                                                         s,
                                                         3 * (i + 1),
                                                         ('000'):rep (i + 1, ',')))
  end
end

-- 終了

下は実行結果。

01: 1 million (1.0e+6) は 1,000,000 です
02: 1 billion (1.0e+9) は 1,000,000,000 です
03: 1 trillion (1.0e+12) は 1,000,000,000,000 です
04: 1 quadrillion (1.0e+15) は 1,000,000,000,000,000 です
05: 1 quintillion (1.0e+18) は 1,000,000,000,000,000,000 です
06: 1 sextillion (1.0e+21) は 1,000,000,000,000,000,000,000 です
07: 1 septillion (1.0e+24) は 1,000,000,000,000,000,000,000,000 です
08: 1 octillion (1.0e+27) は 1,000,000,000,000,000,000,000,000,000 です
09: 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.2.3
  • LuaJIT 2.0.3

本日の猫:

*1:1,000倍ごとに次の名前に進む形