データの型

データ型の種類

TJS2にはいくつかのデータの種類があります。

数値(整数型・実数型)

-1, 0, 1, 2, 3...といった整数。

3.1, 3.14, 3.141, 3.1415...といったような実数(小数)。

数値として以上の整数型と実数型があり、基本的には同じもののように混ぜて使うことができます。数値ですから、当然のように加算や乗算などの演算を行うことができます。

スクリプトファイルに記述する際には、数字及び小数点記号など一部の文字の組み合わせを直接記述します。

123 + 3.14 + -99 - -0.01;

演算のためのプラス記号や-99のような数値の前について負をあらわすマイナス記号などは演算子といいます。

文字列型

"", "a", "str123", "-3.14", "true", "りんご"...といったように英数字や日本語などの文字の集合です。

文字の集合ですので、一見数値のようにみえるものでも加算などの演算は行えません。一方で、複数の文字列をつないだり、"3.1415"の中に"1"はあるかどうか調べたりといったことが行えます。

スクリプトファイル中で文字列データを記述するときには、二重引用符もしくは一重引用符で囲む必要があります。TJS2では引用符の種類によって内容に変化はないので、どちらを用いても構いません。

"some string";
'another ' + "string";
'\'quoted string\'';
"'quoted string'";

あくまで引用符はデータが文字列であることを示す記号なので、実際には「some string」というデータとなります。

プラス記号は数値の場合は加算演算子として機能しますが、文字列の場合は連結させるための記号となります。

また、改行を意味するコードなど直接文字として表現できないものなどは、バックスラッシュ記号(円記号)を用いて2文字以上で1文字を表現します。たとえば、文字列であることを示すための二重引用符記号自体を表すには、「\"」とします。これで1字の「"」という文字を意味します。

ただし、二重引用符で囲んだときには内部の一重引用符は「'」でも「\'」でもよく、一重引用符を用いたときは、「"」と「\"」のどちらを用いても構いません。

オブジェクト型

その他すべてです。

配列やクラスなど複数のデータをまとめて扱うことができるのですがそのパッケージなど、単純なデータでは扱えない形式のものをすべて、TJS2ではオブジェクト型として扱っています。

詳しくは変数と配列と辞書配列オブジェクトなどで説明します。

ここでは、大きく分けて「数値と文字列とその他」がある、といったくらいに認識しておいてください。

数値から文字列への変換

TJS2はスクリプト言語ということもあって、数値としての123と文字列としての"123"はまったく別物として扱われます。

データの変換はいくつか方法がありますが、主なのを紹介します。

// 数値から文字列へ
"" + 123;
// => "123"
string 123;
// => "123"

まずは数値から文字列への変換ですが、一番簡単な方法は(空)文字列と連結させることです。

文字列は数値とみなせるものもありますが、みなせないものもたくさんあります。つまり、数値と文字列では文字列の方が表現できる幅が広いと言えます。そのため、数値と文字列においてプラス演算子を用いると、文字列にあわせられ、連結演算子としてはたらきます。

2番目の方法は右側にあるものを文字列に変換させるstring演算子を用いた例です。一番まっとうな方法かもしれませんが、通常は1番目の方法などを用いることが多いような気がします。

文字列から数値への変換

// 文字列から数値へ
+"123";
// => 123
+"123string";
// => 123
+"string";
// => 0
int "12.3string";
// => 12
real "12.3string";
// => 12.3
+"true";
// => 1
+"trueXXX";
// => 0

文字列から数値へは、単項プラス演算子がよく用いられます。加算や連結のプラス演算子は二項、つまり足すデータと足されるデータの2つ指定しますが、これらの単項演算子は右もしくは左にあるデータに対して演算を行います。

単項プラス演算子は右側にある文字列の前から順にできる限り数値に変換しようと試みます。途中に変換できない文字が現れると、そこで変換は終了となります。まったく数値とみなせない文字列だと、結果は0となります。

次に、string演算子のような変換させるための演算子には、整数に変換するint演算子、実数に変換するreal演算子がそれぞれあります。これも同様に変換できるところまで変換するのみで、数字以外の文字が現れてもエラーにはなりません。

ただし、"true"という文字列のみtrueに変換するようになっています。trueはTJS2に最初から登録されているキーワードで通常は1を意味します。

void

特別なデータとしてvoidというものがあります。voidは空っぽということを表すデータで、初期化せずに宣言した変数や、値を代入していない配列の要素などにはvoidが格納されています。

そのため、要素が存在しているかどうかなどを調べたりするときにでてきます。

voidの型は数値型でも文字列型でもない、専用のvoid型です。

voidは数値の0や文字列の""と、意味合いがまったく異なりますが、加算や連結の演算の際には自動的に0や""に変換されます。

ここではあまり意識しなくても構いませんが、ちょこちょことでてくるものなので扱いました。

データの型~蛇足

おおまかなことは以上で説明しました。

やや細かなことや、つまづきかねない点などを説明していきます。時間があるときなど眺めてみてください。

2進法ほか

私たちが普段使っている数値は10進法といって10になるとき位が1つ進む体系です。言い換えれば0から9までの10個の数字を使って表現する方法ともいえます。

一方でコンピュータはオンオフ2種類の状態を表すスイッチを大量に扱って計算とかを行っています。そのため、その状態を表現するのに適した2進数がしばしばプログラム中で使われます。ただし2進数は0と1しか使えないので非常に桁数が多くなります。そのため2進数3桁を1桁で表せる8進数や、2進数4桁を1桁で表せる16進数がよく使われます。

30 + 0b11110 + 036 + 0x1e; // 30 + 30 + 30 + 30
// => 120
"" + 0123;
// => "83"
+"0123string";
// => 83

TJS2では、数値の最初に0bをつけると2進数として、0をつけると8進数として、0xをつけると16進数として扱われます。なお16進数で用いる16個の記号は0~9とa~fです(大文字小文字関係なし)。

たまに、他の数値と桁をそろえるために、0123といったように数値を記述する方がいますが、8進数としての0123となるので気をつけてください。実際の数値と異なることはもちろん、8や9といった文字を数字として扱えません。

数値と文字列の違い

たとえば10進数の123は、2進数になおすと0b01111011となります。16進数では0x7bです。吉里吉里2/TJS2の整数は64bit(2進数64桁)の精度がありますから、正確にいえば0x000000000000007bといったようなデータをもっています。(多分ね

一方、文字列の"123"は末端を意味するコードも含め{'1', '2', '3', '\0'}という文字の並びです。文字符号化形式は環境によって異なるため一例となりますが、UTF-16LEという形式の場合、0x3100, 0x3200, 0x3300, 0x0000というデータになるはずです。

だからなんやねん、といった感じですが、似ているようでデータ的には全然違うものですよ。というニュアンスが伝わってくれれば幸いです。

sprintf

"format".sprintf(data)を用いると、数値(や文字列)から特定の書式にしたがった文字列を生成することができます。これをうまく使うと、ゼロ詰めの文字列も得ることができます。

仮にゼロ詰めの数字がほしい場合などは、ゼロをつけない10進数で数値を管理して、必要になったらsprintfで目的の書式を得ると、8進数関係のトラブルが一番少ないかと思います。

"%d".sprintf(123);
// => "123"
"%04d".sprintf(123);
// => "0123"
"% 4d/%02d/%02d".sprintf(2008, 7, 4);
// => "2008/07/04"

@付き文字列即値

数値から文字列に変換する方法に、@付きの文字列即値というものがあります。

本当に蛇足で、知らなくてもまったく影響ないのですが、場合によってはいくぶん楽に記述できるので紹介しておきます。

@"&123;";
// => "123"
@"${123}";
// => "123"
@"${123+234}";
// => "357"

これは、&~;および${~}があると、その中身を演算して結果を埋め込む機能のある文字列です。演算結果が数値ならば文字列への変換が試みられます。

"[image layer=\"" + 0 + "\" storage=\"cg_" + "%03d".sprintf(2) + "\"]";
// => [image layer="0" storage="cg_002"]
@"[image layer=\"${0}\" storage=\"cg_${'%03d'.sprintf(2)}\"]";
// => [image layer="0" storage="cg_002"]

このように、文字列連結作業が多くなったときに地味に便利になることがあります。

 
kag2tjs/datatype.txt · 最終更新: 2008/12/22 06:59 by tohka