変数
「変数」とは、しばしばプログラミング解説書では「データを入れておく箱のようなもの」と説明されます。
プログラミングに特有の概念ですので、今までプログラムなんて見たことも聞いたことも食べたこともない人にとっては意味不明な存在でしょう。
まずは喩えを使って簡単に変数について説明してみたいと思います。
プログラミングに特有の概念ですので、今までプログラムなんて見たことも聞いたことも食べたこともない人にとっては意味不明な存在でしょう。
まずは喩えを使って簡単に変数について説明してみたいと思います。
子供にお使いを頼むことを考えてみて下さい。
「肉屋さんへ行って、このメモに書いてあるものを買ってきて」
こんな指示を出したとしましょう。このときの「メモ」というのが変数に当たります。
メモには、「ひき肉」と書いてあるかもしれないし、「レバ刺し」と書いてあるかもしれません。
意表をついて「カボチャ」とか書いてある可能性だってあります・・・。
同じメモでも、書いてある内容によっていろいろと意味が変わってくるように、変数というのは中にいろいろなデータを書き込んでおくことができます。
中身が変わるから「変」数というわけです。
意表をついて「カボチャ」とか書いてある可能性だってあります・・・。
同じメモでも、書いてある内容によっていろいろと意味が変わってくるように、変数というのは中にいろいろなデータを書き込んでおくことができます。
中身が変わるから「変」数というわけです。
もちろん、メモを渡さずに具体的な品物を指示することもできます。
「肉屋さんへ行って、ひき肉を買ってきて」
「肉屋さんへ行って、レバ刺しを買ってきて」
「肉屋さんへ行って、レバ刺しを買ってきて」
この二つの指示でも問題はありませんが、いろいろなものを書ける「変数」=メモがあるなら、
「肉屋さんへ行って、このメモに書いてあるものを買ってきて」
指示はこの一つだけで良いのです。
あとは買ってきて欲しいものに応じてメモの中身を書き換えてやるだけです。
ひき肉だろうとレバ刺しだろうと、カボチャだろうと牛乳だろうと、あくまでも指示は、
あとは買ってきて欲しいものに応じてメモの中身を書き換えてやるだけです。
ひき肉だろうとレバ刺しだろうと、カボチャだろうと牛乳だろうと、あくまでも指示は、
「肉屋さんへ行って、このメモに書いてあるものを買ってきて」
この一つだけで済みます。これが変数を使うメリットです。
変数の種類
さて、メモであればそこに何を書いてもかまわないのですが、LSLにおける変数の場合はそこまで便利ではありません。
変数の場合は中に書けるデータの種類が決まっています。
変数の場合は中に書けるデータの種類が決まっています。
どういうことかと言うと、
「肉屋さんへ行って、このメモに書いてあるものを買ってきて」
この指示の場合、実際にはメモに書くのは「肉屋に売っているもの」でなければ任務を遂行することが出来ません。
指示を受けるのが人間であれば、メモを開いて、
「ニンジン」
とか書いてあったら、肉屋ではなく八百屋に行くくらいの機転が利きますが、コンピュータの場合はそうはいきません。
あくまでも肉屋に出かけていき、
「ニンジン下さい・・・」
肉屋の親父に哀れみの目で見つめられながらも、そう繰り返す他ありません。
コンピュータをそんな可哀想な状況に追いやらないために、変数には種類があるのです。
指示を受けるのが人間であれば、メモを開いて、
「ニンジン」
とか書いてあったら、肉屋ではなく八百屋に行くくらいの機転が利きますが、コンピュータの場合はそうはいきません。
あくまでも肉屋に出かけていき、
「ニンジン下さい・・・」
肉屋の親父に哀れみの目で見つめられながらも、そう繰り返す他ありません。
コンピュータをそんな可哀想な状況に追いやらないために、変数には種類があるのです。
もちろん、「種類」と言っても、「肉」とか「野菜」とかではありません。
例えば、「種類」の一つには「整数」があります。
0とか1とか15321とか-798とか、小数部の無い数字です。
「整数」用の変数には、整数しか入れることができません。
0とか1とか15321とか-798とか、小数部の無い数字です。
「整数」用の変数には、整数しか入れることができません。
また、「文字」を扱う変数もあります。
このタイプの変数には「文字」しか入れられません。
このタイプの変数には「文字」しか入れられません。
種類によって中身のタイプが決まっているので、コンピュータは正しく指示を実行できるのです。
どういうことかと言うと、例えば、LSLには「お金を支払う」という動作があります。
この動作を実行するときには「整数」タイプのデータを指示してやらなければいけません。
つまり、
どういうことかと言うと、例えば、LSLには「お金を支払う」という動作があります。
この動作を実行するときには「整数」タイプのデータを指示してやらなければいけません。
つまり、
「このメモに書いてある金額を支払いなさい」
という指示だということです。
指示できるのは「整数」タイプのデータだけですので、メモに書けるのは「整数」だけということになります。
もしもこの「メモ」に、整数以外のものが書けたとしたら・・・。
指示できるのは「整数」タイプのデータだけですので、メモに書けるのは「整数」だけということになります。
もしもこの「メモ」に、整数以外のものが書けたとしたら・・・。
「"豚肉"を支払いなさい」
とか
「150.57L$を支払いなさい」
などの無茶な指示が出せますので、コンピュータは途方に暮れてしまいます。
そういうことの無いよう、「変数」には中に入れられるデータのタイプが決まっているのです。
そういうことの無いよう、「変数」には中に入れられるデータのタイプが決まっているのです。
今覚えなくてもいいですが、参考までにデータのタイプを示しておきます。
このタイプのことを、変数の「型」と言います(直訳ですが)。
このタイプのことを、変数の「型」と言います(直訳ですが)。
【型の一覧】
型名 | 説明 | 具体例 |
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]など |
これが変数の型の全てです。
変数を使うときには、用途に合わせてどの型を使うか考えなければいけません。
変数を使うときには、用途に合わせてどの型を使うか考えなければいけません。
変数の用意
変数は自由に用意して使うことができますが、使うときにはやはりルールがあります。
何も言わずにいきなり、
何も言わずにいきなり、
「このメモのさぁ・・・」
と言っても、「このメモって・・・どのメモ?」と困惑されてしまいますので、あらかじめどのようなメモがあるのかをコンピュータに伝えておかなければいけません。
これを変数の「宣言」と言います。
変数を使用する前には、必ず「宣言」が必要になります。
これを変数の「宣言」と言います。
変数を使用する前には、必ず「宣言」が必要になります。
つまり、変数を使うときには以下の2段階の手順を踏みます。
「ここに整数が書いてあるメモがあります」・・・宣言
「メモに書いてある金額を支払いなさい」・・・変数の使用
「メモに書いてある金額を支払いなさい」・・・変数の使用
文章にするとなんだか回りくどいですが、このように書いてやらないと理解できないのがコンピュータです。
「宣言」をするときには、以下のように書きます。
integer money = 100;
先頭に書いてあるのは「型」です。
ここではinteger型、つまり整数型です。
ここではinteger型、つまり整数型です。
次に半角スペースを開けて、変数の名前を書きます。
ここではmoneyという名前にしてみました。
この名前は英数字で自由につけられますが、何のための変数なのか、わかりやすい名前をつけておくと混乱せずに済みます。
ここではmoneyという名前にしてみました。
この名前は英数字で自由につけられますが、何のための変数なのか、わかりやすい名前をつけておくと混乱せずに済みます。
「=」は変数に中身を入れるよ、という意味です。一般的な「等しい」ではありませんので注意して下さい。
ここでは、100という数値をmoneyという変数に入れているということになります。
ここでは、100という数値をmoneyという変数に入れているということになります。
最後の「;」は処理の区切りを意味します。
日本語でいうところの「。」みたいなものです。
「;」が無いと、コンピュータは次の行も一続きだと解釈してしまいます。
文章の区切りを明確にするためのものだと思ってください。
日本語でいうところの「。」みたいなものです。
「;」が無いと、コンピュータは次の行も一続きだと解釈してしまいます。
文章の区切りを明確にするためのものだと思ってください。
「=」の後ろは省略することもできます。
integer money;
この場合、moneyの中身にはデフォルト値が入ります。
整数型のデフェルト値は0です。
すなわち、
整数型のデフェルト値は0です。
すなわち、
integer money = 0;
こう書くのとまったく同じです。
このようにして宣言をした後は、「money」と出てくれば、
「あぁ、整数が書いてあるメモのことね」
コンピューターはそう理解してくれます。
そして「money」に書いてある数値を自由に読み取ったり、別の数値を書き込んだりできるようになるのです。
「あぁ、整数が書いてあるメモのことね」
コンピューターはそう理解してくれます。
そして「money」に書いてある数値を自由に読み取ったり、別の数値を書き込んだりできるようになるのです。
変数の中身
では次に、変数の中身を入れる方法について詳しく見てみましょう。
先ほどすでに、「=」で変数の中身を入れられることは述べました。
この「=」を使って中身を指定することを「代入」と言います。
先ほどすでに、「=」で変数の中身を入れられることは述べました。
この「=」を使って中身を指定することを「代入」と言います。
integer money; money = 100; money = -200; money = 10; money = 1000;
こんなふうに、変数の中身は好きなだけ書き換えることができます。
あくまでも「書き換え」です。「追加」ではありません。
リスト型以外の変数は、常に一つだけしか値を書いておくことができません。
やたら小さいメモだと思ってください(^^;
新しい値を書こうと思ったら、前の値を消しゴムで消して、新しい値を書かないといけないのです。
上記の例ですと、moneyという変数には最終的に1000という数値が書いてあることになります。
あくまでも「書き換え」です。「追加」ではありません。
リスト型以外の変数は、常に一つだけしか値を書いておくことができません。
やたら小さいメモだと思ってください(^^;
新しい値を書こうと思ったら、前の値を消しゴムで消して、新しい値を書かないといけないのです。
上記の例ですと、moneyという変数には最終的に1000という数値が書いてあることになります。
他の型ではどうでしょうか。
例えばfloat型(小数型)の場合ですと、
例えばfloat型(小数型)の場合ですと、
float speed; speed = 0.0; speed = -2.8; speed = 10.5;
中に入れる数字が小数になるだけで、使い方は一緒です。
では、string型(文字列型)はどうでしょうか。
では、string型(文字列型)はどうでしょうか。
string name; name = "taro"; name = "jiro"; name = "saburo";
このようになります。
文字列の場合は、代入するデータを""でくくります。
もしも""を忘れてしまうと、
文字列の場合は、代入するデータを""でくくります。
もしも""を忘れてしまうと、
string name = shiro;
これはnameという変数に、shiroという「変数」の中身を代入する、と解釈されます。
shiroという変数が宣言されていなければ、当然エラーになります。
shiroという変数が宣言されていなければ、当然エラーになります。
他の型についても書き方を列挙しておきます。
- ベクタ型:
vector position = <10.5, 1.0, -5.6>;
ベクタ型は3つの小数値を< >でくくります。小数値は「,」で区切られています。
- ローテーション型:
rotation kakudo = <1.4, -3.8, 0.2, 1.0>;
ローテーション型は4つの小数値を< >でくくります。小数値は「,」で区切られています。
ベクタ型とは小数値の数が違うだけです。
ベクタ型とは小数値の数が違うだけです。
- キー/UUID型:
key avatar = "66864f3c-e095-d9c8-058d-d6575e6ed1b8";
キー/UUID型は文字列を同じように、""でくくります。
何やら意味不明の英数字が並んでいますが、これはセカンドライフ内のアバターやオブジェクトを識別するための番号です。
何やら意味不明の英数字が並んでいますが、これはセカンドライフ内のアバターやオブジェクトを識別するための番号です。
- リスト型:
list colors = ["red", "blue", "green"];
リスト型は[ ]でくくり、中身のデータは「,」で区切られています。
このように、型によって値の指定の仕方が違います。
間違った書き方をすると正しく値を代入することができません。
間違った書き方をすると正しく値を代入することができません。
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"を代入します。
そして最後の行、
name1に"taro"を代入します。
そして最後の行、
name2 = name1;
これは「name2にname1の中身を代入する」ということになります。
name1には"taro"が代入されていますので、name2にも同じく"taro"が代入されます。
name1には"taro"が代入されていますので、name2にも同じく"taro"が代入されます。
他の型でも同様のことができます。
integer money1; integer money2; money1 = 100; money2 = money1;
整数型の変数money1とmoney2があって、money1に100という数値を代入します。
さらにmoney2にmoney1の中身を代入しますので、money2も100になります。
さらにmoney2にmoney1の中身を代入しますので、money2も100になります。
まとめ
LSLの「処理」の中で、「何を」「誰に」「どのくらい」「どのように」を扱うときに「変数」を使うと言いました。
そして「変数」には「型」があり、扱える値が決まっているという説明もしました。
そして「変数」には「型」があり、扱える値が決まっているという説明もしました。
例えばLSLの中で「誰に」を扱うときにはどんな変数を使えば良いでしょうか。
普段はあまり意識することがありませんが、セカンドライフのアバターには、固有の識別番号が付けられています。
これをUUID(Universal Unique Identifier)と言います。
UUIDを使えば特定のアバターを指定することができますので、「誰に」を扱うときには、UUID用の変数=key型変数を使うのが正解です。
普段はあまり意識することがありませんが、セカンドライフのアバターには、固有の識別番号が付けられています。
これをUUID(Universal Unique Identifier)と言います。
UUIDを使えば特定のアバターを指定することができますので、「誰に」を扱うときには、UUID用の変数=key型変数を使うのが正解です。
では、「どのくらい」はどうでしょうか。
例えばお金を払う処理を行うときには、「どのくらい」払うのかを指定できます。
金額というのは整数ですので、これには整数型の変数、つまりinteger型を使うことになります。
例えばお金を払う処理を行うときには、「どのくらい」払うのかを指定できます。
金額というのは整数ですので、これには整数型の変数、つまりinteger型を使うことになります。
このように、LSLで「何を」「誰に」「どのくらい」「どのように」を指定するには、指定したいものに適した変数を使うのです。
あくまでも大雑把にですが、以下にまとめてみました。
【型の用途】
変数の型 | 扱える値 | 用途 |
integer型 | 金額、番号などの整数 | 「どのくらい」「何番目」など |
String型 | 名前やメッセージなどの文字 | 「何を」(表示する内容など) |
float型 | 小数、速度、割合 | 「どのくらい」(0.0~1.0の範囲で「割合」を示す場合もある) |
vector型 | 位置座標、サイズ、力加減、方向、色データ | 「どこへ」「どのくらい」など。色の場合は<赤,緑,青>の割合を指定する |
rotation型 | 回転値 | 「どのくらい」(回転させる角度) |
key型 | アバターやオブジェクト等のUUID | 「誰に」「何を」など |
list型 | 値のセット | 「何と何と何と何」のように値を並べて扱いたいときに使う |
もちろん、ここに挙げた用途が全てではありません。
どの型をどんな用途に使うのか、あくまでも参考です。
どの型をどんな用途に使うのか、あくまでも参考です。