※素人が分かりやすさを優先して書いているため、
定義や用語としては不正確な表現があるかもしれません。ご了承下さい。
第2回です。
今回からは具体的にスクリプトの中身を見ていきましょう。
まず、繰り返しますがコードは基本的には1行で1つの処理です。
文字が書いてあったり、数式が書いてあったり様々ですが、ある程度パターンがあります。
今回は「=」に注目して下さい。
◯◯ = △△
と書いてあるものがあります。これが「変数への代入」です。
(=の使い方が、数学の式とは全くの別物なので、注意して下さい)
1. 「オブジェクト」と「変数」について変数とは箱のイメージで例えられます。ツクールの場合は数値が入っていましたが
RGSS3での「変数」はより広い範囲で、何かしらの「オブジェクト」が入ります。
◯◯ = △△
先程のパターンは
〇〇(左辺)の変数に、△△(右辺)のオブジェクトを代入するという処理になります。
ではオブジェクトとは何か。
ここでオブジェクトの定義や説明から入ると良く分からないと思いますので
先に分かりやすい、基本的なオブジェクトの具体例を見ていきましょう。
まずは「数値」です。リテラル(書き方)はシンプルで、そのまま数値を書きます。
後述しますが、計算の方もシンプルに書けるため、四則計算ができれば概ね扱えます。
次に「文字列」です。こちらのリテラルは""(ダブルクオーテーション)で囲みます。
例えば 10 なら数値、 "10" なら文字列として扱われます。
最後に「真偽値」です。リテラルはtrue / false / nilとそれぞれ書きます。
これはツクールでいうスイッチのことです。
条件分岐とセットで扱う概念なので、その時に詳しく説明します。
どうでしょう。箱の中に何が入っているのか、イメージが掴めましたか。
a = 10 変数aの中に10という数値を代入
b = "10" 変数bの中に10という文字列を代入
2. 計算式についてさて、コードの中には
◯◯ = □□ + □□
というようなパターンもあるかと思います。
結論から言うと、これは先程の「変数への代入」処理
◯◯ = △△
の△△(右辺)が計算式になっているよ、という扱いです。
コード上での計算式は、その場で計算されて結果の「オブジェクト」を返します。
例えば
a = 3 + 7
というのは、3 + 7 がその場で計算されて 10 となり
a = 10
として処理される。つまり変数aに数値の10が代入されます。
先述したように= の扱いが異なることと、一部書き方に違いはありますが
計算式の使い方や計算順序は、一般的な四則計算と概ね一緒です。
+ 加算
- 減算
* 乗算
/ 除算
% 余り
() 括弧内を優先して計算
3. 変数の操作ここまでは変数の代入、つまり箱の中に何を入れるかという操作でした。
一方で、変数の中身に対して、足したり引いたりという操作もできます。
◯◯ += △△
◯◯ -= △△
◯◯ *= △△
◯◯ /= △△
4. 変数の参照右辺・計算式の中には、変数を使うことも出来ます。
代入以外で変数が記述されている場合は、その変数の中身が使われます。
a = 7
b = 3
c = a + b
この場合、最後の行は
c = 7 + 3 → c = 10
となり、変数cには数値の10が代入されます。
因みに、先程の
◯◯ -= △△
というのは
◯◯ = ◯◯ + △△
というのものの省略形という扱いです。
この様に代入内容に自身を含むものを、自己代入と言います。
実際のところ、数値そのものより変数を参照する方が多いです。
多数の変数が代入と参照を繰り返して、プログラムは成り立っています。
5. クラス・メソッドとの関わり例えば、ダメージを与える処理はこういうイメージです。
atk = ◯◯(攻撃力の入った変数)
def = △△(防御力の入った変数)
hp = □□(HPの入った変数)
damage = atk * 4 - def * 2 #攻撃力から防御力を引いてダメージを計算
hp -= damege
この例だと◯◯、△△、□□は、それぞれ別のところから持ってきた変数です。
このような「ダメージを与える処理(計算)」だけをひとかたまりにして
前回説明した「メソッド」にしておくわけですね。
他にも攻撃力や防御力を決めるメソッドがあり
変数を介して、メソッド間で結果をバトンパスしながら処理を進めます。
まとめ一旦まとめます。
・変数にはオブジェクトが入る
・オブジェクトは本当に色々あるが、まずは数値で考えると楽
・変数は参照されて、中のオブジェクトを返す
・計算式も計算されて、オブジェクトを返す
第1回と第2回は、それぞれ前提となるルールの説明が中心となりましたが
第3回ではそれらを踏まえて、いよいよその2つが具体的にどう繋がっているのか
より具体的な内容にフォーカスする予定です。
最後に、余談的な内容で終わります。
ex1. 参照と別名箱と並んで使われる例えに、名札というイメージもあります。
a = 10
b = a
c = a * 2 または c = b * 2
とした場合、aとbの中身は同じ10ですので、3行目はabどちらを使っても同じわけですね。
基本的には意味のないコードはダメなので、この例だとbは不要ですが
atk = player_original_attack_value
damage = atk * 2
このように、元のままだと長くて何度も書くのが邪魔という場合や
atk = status[1]
damege = atk * 2
このように、元のままだと中身が分かりにくい変数に対して
「代入を用いて別名を付ける」という方法を取ることがあります。
また、そうでなくとも
・計算式に固定値を書き込む代わりに、一旦変数で別名を付けてそちらを書く
・別のところで作った変数を直接書かずに、一旦変数で別名を付けてそちらを書く
このようにしておくと、後で固定値を変えたくなったときや参照元の変数名が変わってしまったときに、処理部分を丸ごと書き直すのではなく、別名を付けたところだけ直せば良くなります。
処理をメソッド単位で分割しているのも同じ理由ですが
後の自分や他人の為に、なるべく分かりやすく、なるべく修正が楽になるように書くのが
プログラム全般のお作法になります。
ex2. 波及するの、しないの?a = 10
b = a
b += 10
こういう場合に、aの中身は何になっているでしょう?
答えはa→10、b→20です。数値はbを変えてもaに影響を与えません。
数値以外でも影響がないことが多いです。でも偶にあります。
・破壊的メソッド~と明示されている処理をわざわざ使う
・アクターを丸ごと代入してつかう、というような大技
遭遇するとしたらこういうケースなので、とりあえずは考えなくて良いでしょう。
なお後者について、当時の私に辛抱強く教えて下さった方々には今でも感謝しています。余談の余談ですが、この件はググると沼が深かったです。
プログラミング言語において、これがどちらかを決定するのは
「値渡し」をしているか「参照渡し」をしているか、という仕様になります。
言語によって、記述で使い分けたり、この場合はこちらと決まっていたりします。
「値渡し」では箱の中身をコピーして、別の箱に入れています。
よって別の箱の中身がどうなろうと、元の箱の中身に違いはありません。
一方の「参照渡し」では、名札を追加しただけで箱は元の1つです。
よってどれかの名前で箱の中身が変わると、他の名前でも中身は変わっています。
まだ分かりやすいですね。
でもね、Rubyは
・全部が「参照の値渡し」とかいうトゲナシトゲトゲみたいな状態で
・その所為で「原理は値渡しだ」「実態は参照渡しだ」と
無駄に論争してて
・変数の代入としては「参照を値渡ししている(=オブジェクト)」なので、実態としては参照渡しとして振る舞い得るんだけど、大半のメソッドが別のオブジェクトを生成する処理で実装しているため値渡しのように振る舞う(はず、合ってるか?)
ダン・ブラウンの小説か!?
因みにシリーズはどれも勢いだけで読むと凄く面白いのでぜひ。基本的にRubyは、余り考えなくても使えるようになっているのが強みです。(暴言)
[3回]
PR
-->