2011年09月04日

Mac OS X の bash でも連想配列を使ってオブジェクト指向するには

Mac OS X は、BSD UNIX をベースにした UNIX でもあります。 v10.5 Leopard から、UNIX としての認証も受けています。 たとえば、UNIX の rsync コマンドを使えば、高速にフォルダーの差分コピーをすることができますし、samba を使って LAN 経由で Windows とフォルダーを共有することもできます。

しかし、ライセンスの問題のためか、最新の Linux 環境に追いついていない部分も少しずつあるようです。 つい2ヶ月前に発売された Mac OS X 10.7 Lion でも bash シェルのバージョンは 3.2.48 らしいです。 これは、10.6 Snow Leopard と同じです。

bash のバージョン4から、連想配列が使えるようになりました。 これを駆使すれば、オブジェクト指向プログラミングもできます。 しかし、バージョン3には、連想配列が使えません。更なる駆使をしなければオブジェクト指向プログラミングはできません。

そこで、擬似連想配列を開発しました。 なお、連想配列の要素は、グローバル変数になります。 連想配列の参照を行う Attr_func 関数の実装は、下記のようになります。

function Attr_func()
{
local self="$1"
local AttrName="$2"
local value

eval value='$'"${self}__${AttrName}"
echo "$value"
}

ただ、bash ver 4 でも、連想配列を別の変数から参照することはできません。 そのため、bash ver 4 用の Attr_func 関数も作成しました。

function Attr_func()
{
local self="$1"
local AttrName="$2"
local tmp
CheckArgCount_func 2 "$@"

eval tmp="\${${self}[\$AttrName]}"
echo "$tmp"
}

どちらの bash でも、下記のコードで、連想配列を別の変数から設定や参照をすることができます。 下記の SetAttr_func 関数や、連想配列の中に連想配列を擬似的に格納するなどの関数は、今月公開予定の bashlib1 に入っています。

$declare_associative_array object_a
local obj

obj="object_a"
SetAttr_func object_a Attr1 "Value1"
echo "`Attr_func $obj Attr1`" #// echo "Value1"

上記のコードを C言語に訳すと次のようになります。

ClassA object_a;
ClassA* obj;

obj=&object_a;
strcpy_s( object_a.Attr1, sizeof(object_a.Attr1), "Value1" );
printf( "%s\n", obj->Attr1 ); // printf( "Value1\n" );

sage_p at 22:35│Comments(0)TrackBack(0)プログラミング 

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔