スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--.--.-- | スポンサー広告

[Lua] 暗黙の変数定義の闇

Luaでは、他のスクリプト言語でもよくあることですが、

 a=10 

というような代入によって暗黙にグローバル変数aが定義されます。これは「ちょっと動作を試す」ような場合には便利ですが、大きなプログラムの場合には問題を引き起こすことがあります。このことについて解決策などの考察とメモ。


Luaでローカル変数を作りたい場合は、関数(ブロック)内などに
  local a=10 

とすれば、aはその行の後、ブロック内でのみ有効です。(ただしaがさらに外部から参照される場合は参照が残る限りガベコレされません。でもその話はここでは置いときます)

さて、そこで問題になるのが、グローバル変数の安全性についてです。
多少大きいプログラムになればよく起こりうるのが、以下のようなことです。

(A) グローバル変数の命名の衝突
(B) 名前の打ち間違いによる暗黙の新変数定義
(C) local宣言の付け忘れによって意図せずにグローバル変数が生成される

一番問題なのは、上記のことが起こった時に、警告されないということです。
警告されない問題ほど厄介なものはありません。デバッグが大変です。

解決手法について

  • 暗黙の変数定義ではローカル変数にして、global キーワードでグローバル変数を宣言することにする
     →Lua言語の仕様を変える話になってしまいます。Luaでは関数もグローバル変数であることなどから問題があり、あまり有効とは見られていないようです。

  • グローバル変数は、事前に定義したものしか使えないようにする
     →こちらを実現したいところです。VBでは Option Explicit でできますね。


具体的な解決策
というわけで、「グローバル変数は事前に定義したもの以外代入も使うこともできないようにする」という方式が良いのではないかと思います。言語的に用意されていてもよさそうなものですが、そこは「最小志向」のLuaです。あまりズバリの機能はありません。


  • Lua5.1(開発版)では、実行時コマンドラインの-wオプションで未定義のグローバル変数へのアクセスを捕捉できるようです。未定義のグローバル変数値を使おうとするとエラーになります。

     →Luaの仕様上、nil値を持つ変数と未定義変数が区別できないので、グローバル変数でのnil値の使用は諦めることになる。この場合false値などで代用可能。
      暗黙の変数定義を妨げるものではないと思われます。つまり、スペルミスやタイプミスなどをした場合・・・
      congratulations = 1
      conglatularions = 2

      これらは別の変数として正常に定義されてしまうでしょう。

  • グローバル変数を管理するテーブルのメタテーブルあたりをごそごそするとできそうですが、調査中。MLのどこかにあったような・・・

というわけで調査継続中。追記予定。
スポンサーサイト

2005.08.25 | Comments(0) | Trackback(0) | Lua

コメント

コメントの投稿


秘密にする

新しい記事へ <<  | HOME |  >> 古い記事へ

広告:

カテゴリ展開メニュー

  • 未分類(13)
  • Lua(38)
  • プログラミング(11)
  • 食べ物(3)
  • SPAM(2)
  • ゲーム開発(4)
  • GIS/GPS/GoogleMaps(2)
  • スポーツ(1)
  • Skype API(1)
  • AR(1)

はてブ ランキング

ブログ全体: このWikiのはてなブックマーク数

プロフィール

はむ!

Author:はむ!
よく使う言語・環境:
C++,C,Lua,java,VBA,DB
たまにPHPとかjavascript
血液型:O型

メール: lua%ham.nifty.jp
(%を@に変えてください)
ついったー: @hammmm

Lua関連アンテナ

ブロとも申請フォーム

この人とブロともになる

全記事表示リンク

全ての記事を表示する

ブログ内検索


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。