俺に解るように説明する "Godot Engine 3.x" 入門+

ゲームエンジン Godot Engine に関すること。入門とか使い方とかチュートリアルとか、あれとかこれとか。日本語解説。

"Godot Engine" GDScript 8 「関数とメソッドと print() と change_scene()」

関数とメソッドの違いが分かったような気がするので、記念に。

Q.違いはあるのか?

A.あるっぽい。

「function method difference」 でググるとスタック・オーバーフローという、質問すると答えてくれるサイトが出てくる。

https://stackoverflow.com/questions/155609/difference-between-a-method-and-a-function

真実は多数決で決まるというものではないと思うが、圧倒的に違いを説明しようとしている回答に支持が集まっているようなので、まずは、「ある」と捉えるのが人情か。

Q.言語的な方言では?

A.そうとも言える。

3パターンあるっぽい。

  1. c言語には “function” しかない。関数と呼ぶものしか存在しない言語。
  2. c++ 揺れあり。どっちもありの言語かな?。
  3. c#Java には “method” しかない。メソッドと呼ぶものしか存在しない言語。

c を学習した人が、Java を学習しだすと、「これ function のように思うんだけど、なんで method って言ってんだろ。」と感じるわけだ。やっていることは似ているのに、呼び方を変えてるわけだからな。

だが、Java には “Method” という用語しかないので、違いがどうとかではなく、ただそう呼ばない(呼べない)だけということなのだ。「吾輩の辞書に “function” という文字はナイ」、だからな。

違いはあっても、言い方が「ある、ない」の違い。

Q.なぜ呼び方を変えた?

A.やっぱり、機能的な違いを感じたから。

歴史的に、c > c++ > c# と移って来て、”function” ってずっと言ってればいいのに、マイクロソフトさんは “method” という単語を使いたくなったようだ。これは差を感じたからに他ならない。

その差とは、

  1. クラスの “function” を method" と呼び、
  2. それ以外を “function”

こんな感じらしい。(クラスとオブジェクトがちょっと分からないけど、こんな感じ)

ちなみに、c と c# の間の c++ では “method” にあたるものを、"member function" と呼ぶらしい。

c: “function” > c++: “member function” > c#: “method” とオブジェクト指向っていう考えが発展する中で変わってきた様子。(オブジェクト指向って何かよく分かってないけど。)

オブジェクト指向にヒントあり

“member function” って GDScript の API に書いてあるやつやん、と、ここでちょっと気が付く。GDScript は c++ 風なのか? いや、確か、 python に似ていると公式ドキュメントにあったような気がした。

python オブジェクト指向」でググる。一番上に出てくる Qiita というサイト、

http://qiita.com/raccy/items/5eb98b1058e50f07339b

Pythonには関数がある。便利でよく使う関数(標準出力に文字を出力するprint()関数や、配列などの長さを求めるlen()関数など)は組み込みではじめから用意されている。

という1文の、「関数」「print()」「組み込み」「はじめから用意」という語で気付いた気がした。なぜ、GDScript で print() 関数が黄色いのか。

キーワードと組み込み関数の共通点

print() 関数が API のどこにあるのか謎だったが、「Godot print」でググると意外とあっさり出てきた。なんと、@マークで始まる変な単語の中にあった。説明の所(Brief Description)には、"Built-in" つまり組み込みとある。print() は組み込み関数だったのだ。

f:id:ore2wakaru:20170821211243p:plain

キーワードは Godot が使い方をはじめから用意している語で、print() も同様、はじめから用意しているもの。ここが共通点で、キーワードも組み込み関数も共に黄色くマークされるのでは・・・と。なるほど。思わぬところで謎が解けたような気がする。



関数、メソッド。GDScript 的には、

  1. “built-in” な “function” は関数print() 関数)
  2. “class” な “function” はメソッドchange_scene() メソッド)

ということではないかと思う。違うかもだし、ま、ゲームを作って行く上で用語を変えないと支障があるって言うなら、別だけど、これどうでもいいことかもなー。

print() メソッド」とか「change_scene() 関数」って聞いて気持ち悪いという人はいるんだろか? 「あー、ハイハイ。」って所だと思うんだけどな。

関数とメソッドの違いより、なんで print() が黄色いのか分かった方がうれしいぞ。