見出し画像

【学習メモ/関数・変数の違い】やってしまった。関数を変数みたいに使っちゃうミス!

学習ページ:http://manabibeya.com/getstarted/gs22/
参考ページ:関数について:https://wa3.i-3-i.info/word1905.html
      変数について:https://wa3.i-3-i.info/word1603.html
      引数と戻り値(関数に関する):https://wa3.i-3-i.info/word1441.html

今回のは上記の学習ページの「前回の振り返り問題」をやっているときにやってしまったミス。

「注意しろよー」って言われていたのに、ミスをしてしまった。悔しい( ;∀;)

▼ミスしたBP(①)

コメント 2020-04-09 140723

▼正しいBP(②)

コメント 2020-04-09 140745

今回の問題では、「7が出たときに当たり!」と表示する処理なのだが、実行すると....

▼①

コメント 2020-04-09 140903

▼②

コメント 2020-04-09 140937

なぜか①の方は、7以外の数字でも当たりが出てしまっている....なぜだ?

学習ページに方にも解説は乗っていたけど、関数と変数の説明について省いてわかりにくかったので、調べてみた。(前の方の講義で2つについては説明しているから省いたんだろう....私は馬鹿だからすっぽり頭から抜けていた!)

まず関数と変数の話に行く前に、①の処理に関して私の頭の中で行われてた予想について解説。②の方は正しいのでその処理について説明。
そのあと関数と変数について解説し、実際に行われている処理について解説します。

▼①の解説(私の頭の中での予想)

コメント 2020-04-09 140723

Gを押すと、Forloopで10回ループ処理を行う。
branchで正否判定をする。
Random Intengerで0~9の値がランダムで吐き出される。
Random Intengerから吐きだされた値を、branchが参照。(正確にはbranchが関数Random Intengerから値を戻り値として引っ張ってきている)
branchは正否基準に基づいて判定を行う。
Trueの判定基準は、Random Intengerから吐きだされた値が=7かどうか。
Trueだった場合は、「当たり」を表示する。Falseだったら、「はずれ」を表示する。
そして、True/Falseどちらの場合も、Rnadom Intengerから吐き出された数値(branchで利用した数値)をprint stringが取得し、表示する。
最後に10回ループ処理が終わったら、「くじ引き終了」を表示する。

▼②の解説

コメント 2020-04-09 140745

Yを押すと、Forloopで10回ループ処理を行う。
Random Intengerから吐きだされた値を、Set kujiで変数Kujiに格納される。(正確にはSet kujiが関数Random Intengerから値を戻り値として引っ張ってきて、変数Kujiに入れている)
print stringでKujiの値が表示される。
BranchにKujiの値が入り、正否判定を行う。判定基準は、Kujiが=7かどうか。ノード(== intenger)にKujiの値が入り、判定が行われる。
最後に、判定に対応するprint stringが表示される。

【関数と変数の解説】

私が犯したミス。それは、「関数」を「変数」のように扱ったため。

まず関数ですが、これは「何か入力されると、何かを出力するためのシステム」です。

逆に変数は、「何かを格納しておく箱のようなシステム」です。

つまり存在意義が全く違う。それを同じように扱ってしまったのです。

変数は例えばリンゴAを入れておけば、リンゴAをいつでも提供してくれます。
その点関数は、リンゴA~Gまであって、声をかけるたびに、リンゴAやリンゴCなどその都度状況に応じて、臨機応変に様々なリンゴを提供してくれます。あと、リンゴAとリンゴBを入れたら、マンゴーAが返ってくるみたいな?とにかくいろいろな機能がありますが、「何かアクションをすれば、その都度適切なものを返してくれる」ってことです。たぶん。

まるで豚骨ラーメン一筋で勝負する名店と、様々なメニューを用意し人々を満足させるレストランのよう(違うか...('_'))

※ちなみに関数に入れる値を「引数」といい、関数から帰ってきた値を「戻り値」といいます。さっきの例でいうなら、「カレー頂戴」(引数)って注文したら、カレーとスープとサラダ(戻り値)が返ってくるみたいな。

【先のBPでの間違いとは?】

では、関数と変数の違いが分かったところで、先のBPでのミスを追求していきます。

問題となる箇所は、ココ!

コメント 2020-04-09 144154

Random Intengerは関数です。
※今まで「ノードの色なんてどーでもいいやん!」って思いながら学習してきたんですが、ここで大切さがわかってきます。UE4では、関数は緑色、変数はピンク色で表されます。色でどういう処理を行うノードなのかが、なんとなしに判別できます。

関数は先ほどの解説通り、「何かアクションをすれば、その都度適切なものを返してくれる」のでした。ここでは、アクションを起こす場面が2つ存在します。つまり、branchとprint stringです。

先ほどお店の注文の例でいうと、branchとprint stringがそれぞれ別々の注文を入れ、店主:関数さんは、別々の品を用意する、ということです。

図説すると、こういうこと。

2ペイント1

つまり関数を変数として扱ってしまったら、「画面に表示される数値と、内部で正否判定を行っている数値とが異なってしまう」ということです。

逆に②の方は、Random Intenger関数から出た数値を一度、Kujiという変数に格納しているため、Kuji変数に入った数値は、だれから呼び出せれても、決まった変数を出してくれるのです。

図説すると、こう!

無題

だから表示される数値と正否判定で使う数値に剥離がなかったんだなー。

変数と関数って共存関係だなー。って思ったりした。

最後に今回の学びとして、「関数から出される数値を、呼び出したとき以外でも使いたい場合は、変数に入れて管理しておけば、良い感じになる!(はず)」ってことで。


この記事が気に入ったらサポートをしてみませんか?