Pineスクリプト道場は、Pineスクリプト入門からコード作成までをサポートする初心者の方のための記事です。
Pineスクリプトをある程度使える方は「Pineスクリプトの学校」にて記事を書いておりますのでそちらをどうぞ。
こんにちは!makoto(@Makoto_beginner)です。(2021/4/29更新)「:=」についての解説を追加しました。
前回は、演算子について解説した記事であったがその続きの記事であるためまだ読んでない方はぜひ!
1、「=」と「==」の違いがわからない人
また、最後にPineスクリプトでこれらを扱う際の注意点について解説しているので、もれなく理解してほしい。では早速!
1、「=」の「==」の違い
ズバリ、これらは意味が全く異なっており、それぞれにはこのような意味がある。
(1)「=」は代入を示す。
(2)「==」は等価を示す。
では、それぞれ使用例を見ながら詳しく見ていく。
(1)「=」は代入を示す
代入ってなに?って方は、以下の記事にて詳細に解説をしているので確認いただきたい。
簡単に言えば、変数に値を入れる作業のことである。
例えば以下のようなプログラムがあるとする。
a = 3 //aに3を代入している
b = 2 //bに2を代入している
c = a + b //cにa+bの結果(5)を代入している
この例では、3回の代入作業をしている。
まず、aという変数に3という値を代入しており、次にbという変数に2という値を代入している。
最後に、cにはa+bの結果を代入している。当然、cには5が代入される。
これが代入として使用する「=」の意味である。
(2)「==」は等価を示す
次に「==」について解説する。
「==」は等価を示す。要するに「同じであること」だ。
基本的には論理演算で使用する。論理演算について知らない方は前回の記事を参照して欲しい。
では、以下の例を見て欲しい。この式は正しいだろうか。
2 == 3
この式は「2と3は同じである」と言っているが、答えは誤りである。なぜなら、2と3は全く別の値であるからだ。
では、次の問題。少し意地悪である。
A == 3
これはどうだろうか。おそらく多くの方が「Aという文字と3は違うものなので誤り!」と答えるかもしれない。
実は、この問題の正解は「わからない」が答えとなる。
実はまだ解説していないがパインスクリプト上で文字列を表すには””(ダブルクオーテーション)で括る必要があり、括ったもの以外は数値や変数として扱われる。
つまり、今回の例では”A” == 3ではなく、A==3と書いてあるのでAは文字ではなく変数名だというわけだ。
つまり、変数Aに3という値が代入されていれば正となるし、3以外の数値が入っていれば誤となる。今回の問題ではAにどんな値が入っているかわからないので、この式が正しいか誤りかもわからないというのが正解となる。
2、どんな時に使う?
では、それぞれの使用例を以下に示す。
(1)「=」の使用例
「=」以下のように使用する。
a = 0 //aに0を代入する
a = 3 //aに3を代入する。先ほどまでaの値は0だったが3に上書きされる
a = a + 5 //aにaの値と5を足したものを代入する。aには8が入る
代入は上書きが可能だ。
この例では、初めにaに0を代入しているがその後に3を代入しているため、2行目時点ではaの値は3となる。
問題なのは3行目だ。普通に数学の式として考えると意味不明だ。「aとa+5が等価」であるわけがない。しかし、ここで思い出して欲しいのは「=」は代入を示すということだ。つまり、この式は
「aに、aの現在の値である3に5を足したものを代入する」という意味になるので、aには8が入るというカラクリだ。
この概念はどのプログラミング言語でもほぼ共通なのでしっかりと理解して欲しい。
(2)「==」の使用例
続いて、等価を示す「==」の使用例についてだ。
まだ解説していないが、パインスクリプトではif文という構文が使える。
詳細は別記事にまとめるが簡単に説明すると、これは条件分岐、例えば「変数Aの値が5の時は処理1を、それ以外の時は処理2をしたい」という場合があったとする。
これをif文で記述すると以下のようになる。
if A == 5
処理1
else
処理2
非常に簡単だ。
ここで「==」が出てくる。この式「if A == 5」では「変数Aの値が5なら」ということを示している。
もしここで間違えて「=」を使用してしまうと意味不明となりエラーとなるため注意する。
3、Pineスクリプトでは意味が異なる!?
と、ここまで多くのプログラム言語に共通する「=」「==」の意味について説明してきたが、Pineスクリプトにおいては「=」の意味が異なっている。(そっちを説明せんかい!)
実は、Pineスクリプト上では「=」は代入ではなく変数の宣言を表すため、代入を表すには「:=」を使用する。
例えば、以下のようなプログラムがある場合エラーが発生する。自信がある方はなぜエラーが出るのか考えてみよう。
a = 0 //変数aを宣言しaに0を代入
b = 0 //変数bを宣言しbに0を代入
if a == 0 //aが0の場合に処理を実行
____b = b + 1 //bにbの値(今は0)に1を足したものを代入する。
このプログラムを実行すると「bという変数が宣言されていません」と出てきてしまう。
「いや、b=0という変数は宣言しているじゃん!」と思われるかもしれないが、そうはいかない。なぜだろうか。
それは、ifの中の「=」が変数の宣言だと受け取られているからである。
ifの中はローカルスコープといって、この中で変数を宣言した場合全く別の変数であると認識されるのである。
ローカルスコープとは?
変数は宣言したらどこでも使用できるわけではなく、使用できる範囲がある。
その範囲のことをスコープという。変数には大きく、「グローバル変数」と「ローカル変数」があり、ローカル変数は変数を宣言したローカルスコープ内でしか使用ができない。「グローバル変数」は名の通りグローバルなのでどこでも使用できる変数である。
例えば、if文の外で宣言した変数はifの中で使用することができる。
しかし、if文の中で宣言した変数をifの外で使用することはできない。
これは、if文の外で宣言した変数は「グローバル変数」として扱われ、if文の中で宣言した変数は「ローカル変数」として扱われる為である。そしてグローバルスコープでローカル変数を使用できない為である。
特殊な例としては、グローバル変数とローカル変数は同じ変数名をつけることができる。例えばグローバル変数でaという変数を宣言しても、if文の中(ローカルスコープ)でaという変数を宣言することができる。これはグローバル変数aとローカル変数aは別のものとして認識されるからである。
つまり、人間サイドとしては「あらかじめ変数bを宣言しているから、その変数bに値を代入したい」と考えているがPineスクリプトサイドとしては「=は変数の宣言という意味だから、ifのローカルスコープの中で新しい変数bを宣言したいんだな。あれ?でも変数bの値をb+1としているけど、未だ宣言していない変数bを使われても何の値を入れていいのかわからないよ!?」と認識しているのである。」
そのため、「これは、変数の宣言ではなく先に宣言した変数bに代入してほしいという意味ですよ」ということを表すために以下のようにする。
a = 0 //変数aを宣言しaに0を代入
b = 0 //変数bを宣言しbに0を代入
if a == 0 //aが0の場合に処理を実行
____b := b + 1 //bにbの値(今は0)に1を足したものを代入する。
これであれば、Pineスクリプトも「これは代入を意味してるから、先に宣言された変数bの値に1足したものを変数bに再代入すればいいんだね!」と理解できるわけである。
そのため、Pineスクリプトでは変数の宣言では「=」を使用し、代入を示す時は「:=」を使用するようにしよう。
4、まとめ
(1)「=」は代入を示す。
(2)「==」は等価を示す。
〜Pineスクリプトにおいては〜
(3)「=」は変数の宣言を示す。
(4)「:=」で代入を示す。
わかってはいても「=」「:=」「==」を間違えて使用してプログラムから怒られることがよくあるので注意して使用する。
次回はプログラムにおいて基本的かつ重要な「条件分岐」について解説する。
お楽しみに!
本記事を気に入っていただけたらブックマークお願いします!また、ツイッターもやってるのでフォローよろしくお願いいたします!
Twitter : makoto(@Makoto_beginner)
また、記事中で不明なことや間違い等ありましたら以下のコメント欄からコメントいただけると幸いです。
皆様のコメントをもとにどこよりもわかりやすいブログを目指していきます。