ソラマメブログ

2007年05月25日

変数(lsl基礎知識 第二回)

今回は「変数」についてのお話です。
しばしばプログラミング解説書では「データを入れておく箱のようなもの」と説明される例のアレですw
変数については初級スクリプトの第五回でいきなり出てきて、ちょろっとだけ説明して終わりにしてあるので、ここではまとめて解説したいと思います。
で、変数って何なのさ

プログラミングに特有の概念ですので、今までプログラムなんて見たことも聞いたことも食べたこともない人にとっては意味不明な存在でしょう。
例によって子供の喩えで、軽く変数について説明してみたいと思います。

「肉屋さんへ行って、このメモに書いてあるものを買ってきて」

こんな指示を出したとしましょう。
この「メモ」というのが変数に当たります。

メモには、「ひき肉」と書いてあるかもしれないし、「レバ刺し」と書いてあるかもしれません。
意表をついて「カボチャ」とか書いてある可能性だってあります・・・。
同じメモでも、書いてある内容によっていろいろと意味が変わってくるように、変数というのは中にいろいろなデータを書き込んでおくことができます。
中身が変わるから「変」数と言うのでしょう。

変数が何故使われるかというと、極論するなら「処理を統一するため」です。
もしも変数が無いとしたら・・・。

「肉屋さんへ行って、ひき肉を買ってきて」
「肉屋さんへ行って、レバ刺しを買ってきて」

この二つは別々に指示しなければいけません。
「何を」買ってくるのかを一々明示してやらなきゃいけないということになります。

ですが、いろいろなものを書ける「変数」=メモがあるなら、

「肉屋さんへ行って、このメモに書いてあるものを買ってきて」

指示はこの一つだけで良いのです。
あとは買ってきて欲しいものに応じてメモの中身を書き換えてやるだけです。
ひき肉だろうとレバ刺しだろうと、カボチャだろうと牛乳だろうと、あくまでも指示は、

「肉屋さんへ行って、このメモに書いてあるものを買ってきて」

この一つだけで済みます。
これが変数を使うメリットです。

変数の種類

さて、メモであればそこに何を書いてもかまわないのですが、スクリプトにおける変数の場合はそこまで便利ではありません。
変数の場合は中に書けるデータの種類が決まっています。

どういうことかと言うと、

「肉屋さんへ行って、このメモに書いてあるものを買ってきて」

この指示の場合、実際にはメモに書くのは「肉屋に売っているもの」でなければ任務遂行が出来ません。
指示を受けるのが人間であれば、メモを開いて、
「ニンジン」
とか書いてあったら、肉屋ではなく八百屋に行くくらいの機転が利きますが、コンピューターの場合はそうはいきません。
あくまでも肉屋に出かけていき、
「ニンジン下さい・・・」
肉屋の親父に哀れみの目で見つめられながらも、そう繰り返す他ありません。
コンピューターをそんな可哀想な状況に追いやらないために、変数には種類があるのです。

もちろん、「種類」と言っても、「肉」とか「野菜」とかではありません(^^;

例えば、「種類」の一つには「整数」があります。
0とか1とか15321とか-798とか、小数部の無い数字です。
「整数」用の変数には、整数しか入れることができません。

また、「文字」を扱う変数もあります。
このタイプの変数には「文字」しか入れられません。

このように種類によって中身のタイプが決まっているので、コンピューターは正しく指示を実行できるのです。
どういうことかと言うと、例えば、lslにはllGiveMoneyという命令があります。
この命令は「お金を支払う」という処理なのですが、この処理を実行するときには「整数」タイプのデータを指示してやらなければいけません。
つまり、

「このメモに書いてある金額を支払いなさい」

という指示だということです。
そしてメモに書けるのは「整数」に限定されているのです。
もしもこの「メモ」に、整数以外のものが書けたとしたら・・・。

「"豚肉"を支払いなさい」

とか

「150.57L$を支払いなさい」

などの無茶な指示が出せてしまいます。
そういうわけで、「変数」には中に入れられるデータのタイプが決まっています。

今覚えなくてもいいですが、参考までにデータのタイプを示しておきます。
このタイプのことを、変数の「型」と言います(直訳ですがw)。

型名説明具体例
integer整数1,5,8,0,-13など
string文字列"hoge","huge","hage"など
float小数1.23, 0.02, -5.24など
vectorベクタ
X,Y,Zの3つの小数のセット
位置座標などに使用する
<1.0, 2.4, -3.5>など
rotationローテーション
X,Y,Z,Sの4つの小数のセット
回転のデータ
<4.6, -3.2, 4.2, 1.0>など
keyキーまたはUUID
SL内のアバター/オブジェクトの識別番号
"66864f3c-e095-d9c8-058d-d6575e6ed1b8"など
listリスト
複数の変数のセット
[1, "hoge", 3.56]など


変数の用意

変数は自由に用意して使うことができますが、使うときにはやはりルールがあります。
何も言わずにいきなり、

「このメモの・・・」

と言っても、「このメモって・・・どのメモ?」と困惑するのが当然ですので、あらかじめどのようなメモがあるのかをコンピューターに伝えておかなければいけません。
これを変数の「宣言」と言います。
変数を使用する前には、必ず「宣言」が必要になります。

「ここに整数が書いてあるメモがあります」・・・宣言
「メモに書いてある金額を支払いなさい」・・・変数の使用

文章にするとなんだか回りくどいですが、このように書いてやらないと理解できないのがコンピューターです(^^;

「宣言」をするときには、以下のように書きます。

integer money = 100;


先頭に書いてあるのは「型」です。
ここではinteger型、つまり整数型です。
次に半角スペースを開けて、変数の名前を書きます。
ここではmoneyという名前にしてみました。
この名前は英数字で自由につけられますが、何のための変数なのか、わかりやすい名前をつけておくと混乱せずに済みます。
「=」は変数に中身を入れるよ、という意味です。
一般的な「等しい」ではありませんので注意して下さい。
ここでは、100という数値をmoneyという変数に入れているということになります。
最後の「;」は前回お話した「。」ですね。
「;」までで一つの処理として解釈されます。

「=」の後ろは省略することもできます。

integer money;


この場合、moneyの中身にはデフォルト値が入ります。
整数型のデフェルト値は0です。
すなわち、

integer money = 0;


こう書くのとまったく同じです。

このようにして宣言をした後は、「money」と出てくれば、
「あぁ、整数が書いてあるメモのことね」
コンピューターはそう理解してくれます。
そして「money」に書いてある数値を自由に読み取ったり、別の数値を書き込んだりできるようになるのです。

変数の中身

では次に、変数の中身を入れる方法について詳しく見てみましょう。
先ほどすでに、「=」で変数の中身を入れられることは述べました。
この「=」を使って中身を指定することを「代入」と言います。

integer money;
money = 100;
money = -200;
money = 10;
money = 1000;


こんなふうに、変数の中身は好きなだけ書き換えることができます。
あくまでも「書き換え」です。「追加」ではありません。
リスト型以外の変数は、常に一つだけしか値を書いておくことができません。
やたら小さいメモだと思ってください(^^;
新しい値を書こうと思ったら、前の値を消しゴムで消して、新しい値を書かないといけないのです。
上記の例ですと、moneyという変数には最終的に1000という数値が書いてあることになります。

他の型ではどうでしょうか。
例えばfloat型(小数型)の場合ですと、

float speed;
speed = 0.0;
speed = -2.8;
speed = 10.5;


中に入れる数字が小数になるだけで、使い方は一緒です。
では、string型(文字列型)はどうでしょうか。

string name;
name = "taro";
name = "jiro";
name = "saburo";


このようになります。
文字列の場合は、代入するデータを""でくくります。
もしも""を忘れてしまうと、

string name = shiro;


これはnameという変数に、shiroという「変数」の中身を代入する、と解釈されます。
shiroという変数が宣言されていなければ、当然エラーになります。

参考までに他の型についても書き方を列挙しておきます。

vector position = <10.5, 1.0, -5.6>;・・・ベクタ型
rotation kakudo = <1.4, -3.8, 0.2, 1.0>;・・・ローテーション型
key avatar = "66864f3c-e095-d9c8-058d-d6575e6ed1b8";・・・キー/UUID型
list colors = ["red", "blue", "green"];・・・リスト型


ベクタ型とローテーション型は<>で数値をくくります。
ベクタ型は3つ、ローテーション型は4つの小数が<>の中に,で区切られています。
キー/UUID型は文字列を同じように、""でくくります。
リスト型は[]でくくり、中身のデータは,で区切られています。

変数には、型の違うデータを代入することはできませんので、

integer money = "hikiniku"; ・・・整数型に文字列を代入しようとしている
string name = 4.58;・・・文字列型に小数を代入しようとしている
vector positin = <1.4, -3.8, 0.2, 1.0>・・・ベクタ型にローテーション型を代入しようとしている
list items = "book";・・・リスト型に文字列を代入しようとしている


これらは皆エラーになります。
扱っている変数の型が何なのか、きちんと意識してコードを書く必要があります。

変数から変数へ

変数の型が同じであれば、変数から変数への代入が可能です。

string name1;
string name2;
name1 = "taro";
name2 = name1;


文字列型の変数、name1とname2を宣言しました。
name1に"taro"を代入します。
そして最後の行、

name2 = name1;


これは「name2にname1の中身を代入する」ということになります。
name1には"taro"が代入されていますので、name2にも同じく"taro"が代入されます。

他の型でも同様のことができます。

integer money1;
integer money2;
money1 = 100;
money2 = money1;


整数型の変数money1とmoney2があって、money1に100という数値を代入します。
さらにmoney2にmoney1の中身を代入しますので、money2も100になります。

変数の中身をそのまま代入することはあまり無いとは思いますが、よくあるのは変数の値を少し変えて代入する処理です。

integer money1;
integer money2;
money1 = 100;
money2 = money1 + 50;


最後の行で、

money2 = money1 + 50;


money2に代入されるのは「money1の中身 + 50」です。
money1には100が代入されていますので、money2は100+50すなわち150になります。

では、次のような場合にはどうなるのでしょうか。

string name1;
string name2;
name1 = "taro";
name2 = name1 + "imo";


name1には"taro"が代入されていて、name2には"taro" + "imo"が代入されますので、"taroimo"がname2の中身になります。

・・・と、いきなり答えを書いてしまいましたが、「+」についてもきちんと説明をしておきたいと思います。
それはまた長くなりますので、次回ということで・・・。


タグ :変数

同じカテゴリー(基礎知識)の記事
 関数(lsl基礎知識 第五回) (2007-06-06 12:12)
 フロー制御(lsl基礎知識 第四回) (2007-05-31 12:15)
 演算子(lsl基礎知識 第三回) (2007-05-29 12:15)
 スクリプト(lsl基礎知識 第一回) (2007-05-24 12:15)
この記事へのコメント
スクリプトをちゃんと理解したいと思っていましたので、この講座をみつけて、うれしくなりました。よろしくお願いします。
Posted by sheila6225 Allen at 2007年05月25日 22:55
Mizさん、いつも丁寧な説明ご苦労様です。
日常のものに置き換えた例題がすばらしく、とってもわかりやすいです。
そして、floatって小数のことだったんだー!と、発見。
ドアの回転速度を変えたい って思い、float speedを使ってみましたが、floatの意味がやっとわかりました。感激です。(といっても変化しなかったのですが・・・苦笑)
変数についても、そういうことか~って納得!
ほんとにありがたいです。
Posted by 初音 at 2007年05月26日 16:56
はじめましてお世話になってるものですww今日からスクリプト始めたのですがすごくまとめられてて助かります

始めてのコメントであれなんですが、ifについて解説してもらえるとうれしいです
Posted by ププリン at 2007年05月26日 18:34
>sheila6225 Allenさん

こちらの「基礎知識」は主にスクリプトの用語や文法の説明をする予定です。
より実用的なスクリプト解説は、左メニューのカテゴリ「初級スクリプト」を見ていただくといくつか出てくるかと思います。
用途に合わせてご参考になれば幸いです(^^

>初音さん

「初級スクリプト」ではこういう基本的な話をすっ飛ばしてしまってますので・・・やはりニーズがあったようですので、「基礎知識」は今後もいくつか書きますね(^^

>ププリンさん

if文についても説明するつもりでいます。
次回は演算子の話をするつもりなので、その次か、さらに次あたりになるかと思いますが(^^;
Posted by Miz at 2007年05月26日 20:38
いつも貴重な情報をありがとうございます。
Mizさんのブログとご指導のおかげでSLの楽しみが広がりました。
講座の再開をうれしく思います。これからも毎回楽しみにしていますね。
今後ともどうぞよろしくお願い申し上げます。
Posted by ホリ at 2007年05月29日 11:00
>ホリさん

この「基礎知識」カテゴリに書く内容は、あまりにも基本的過ぎるがために誰も書かない部分です。

例えば「変数ってなんのか」なんて、プログラミングの世界ではもはや説明するまでもない事柄であり、知ってる人にとっては「いろは」並みに当たり前だったりします。
ですが、初めてプログラミングの世界に触れる人には、やっぱりいまひとつハッキリしない部分だろうと思うのです。
私自身がプログラミングに触れたときのことはもう遠い昔なのでw忘れてしまいましたが、やっぱり最初は「変数???」な状態だったように思います。

そういう意味では、この「基礎知識」はセカンドライフのスクリプトに留まらず、あらゆるプログラミング言語に共通して応用できる知識になります。
どんなプログラミング言語でもたいてい「変数」は出てきますしね・・・。
なのでひょっとしたら「初級スクリプト」のカテゴリよりも「基礎知識」のほうが有用な情報かもしれませんw
Posted by Miz at 2007年05月29日 12:28
プログラミングにまったく無知な私でもわかりやすい解説、ありがとうぎざいます!プログラムの本買おうかな~と思ってたんですが、必要ないかも^^
勉強して、自分でいろいろなスクリプト作ってみたいと思います!
がんばりま~す
Posted by Peke at 2007年06月26日 17:44
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。