関数とメソッド
これは何?
C++ でいうところの、static でないメンバ関数、static メンバ関数、あるいは クラスとは関係のない関数、そういったものを、各言語でなんと呼ぶのかをまとめてみた。
調べずに記憶で書いている部分もあるので、間違っていたり、昔はそうだったね、とか言うこともあるかもしれない。
※ 間違っていたら優しく教えて下さい。
以下、関数とか手続きとかメソッドとかそういうものを「やつ」と呼ぶ。
各言語での用語
C++
C++ にはクラスがあり、そこに所属しているやつがいる。そういうやつは「メンバ関数」と呼ばれる。
クラスに所属していないやつもいる。そういうやつらは単に「関数」と呼ぶが、「メンバ関数」ではないことを明示したい場合には「フリー関数」と呼ぶことがある。
メンバ関数のうち、 this
がなくても呼べるやつを「static メンバ 関数」と呼ぶ。「静的メンバ関数」と呼ぶ人もいるかも知れない。
C++ は「メソッド」という語を導入していないと思う。
Ruby
Ruby にはクラスやモジュールがあり、やつらはすべてそれらのどれかに所属している。
いかなるクラス・モジュールにも所属していないやつはいない。やつらのことを「メソッド」と呼ぶ。
いかなるクラス・モジュールにも所属していないように見えるやつも、実はなにかに所属していて、self がある。
self
なしで呼べるメソッドはないけれど、self
がクラスである場合、それを「クラスメソッド」と呼ぶ。
Python
Python にはクラスがあり、そこに所属しているやつがいる。そういうやつは「メソッド」と呼ばれる。
クラスに所属していないやつもいる。そういうやつらは「関数」と呼ばれる。
メソッドのうち self
がクラスである場合、そういう奴らは「クラスメソッド」と呼ばれ、そうでない奴らは「インスタンスメソッド」と呼ばれる。
Java・C#
Java・C# にはクラスがあり(C# には構造体もあり)、やつらはすべてなんらかのクラス(C# の場合、クラスまたは構造体)に所属している。
やつらのことを「メソッド」と呼ぶ。
メソッドのうち、 this がなくても呼べるもののことを「static メソッド」または「クラスメソッド」と呼ぶ。「静的メソッド」と呼ぶ人もいるかも知れない。
あと。
Java のことをよく知らないんだけど、最近の Java には「Function Types」というものがあるっぽい。この型のインスタンスのことを「関数」と呼ぶのかなと想像している。
C# も https://www.ecma-international.org/wp-content/uploads/ECMA-334_1st_edition_december_2001.pdf を見ると
Function members are members that contain executable statements.
という記述があるので、こういうもののことを「関数メンバ」あるいは略して「関数」と呼ぶのかもしれない(知らない)。
Go
Go には型があり、型に所属しているやつがいる。奴らのことを「メソッド」と呼ぶ。
型に所属していないやつのことを「関数」と呼ぶ。
には
A method is a function with a receiver.
とあるし、定義も func
を使うのでメソッドは関数の一種なんだと思う。
JavaScript (ECMAScript)
によると
A function that is associated with an object via a property is called a method.
とのことなので、something.foo()
のように使ったら foo
はメソッドで、メソッドは関数の一種、ということだと思う。
とはいえ、全然自信がない。
Zig
Zig には struct があり、奴らは struct 内にあったりそうでなかったりする。
いずれにせよ、奴らは「関数」と呼ばれる。
struct 内の関数はメソッドと呼ばれることもありそう。
Pascal
やつらのうち、値を返すものは「関数」と呼ばれ、値を返さないものはh「手続き」(procedure)と呼ばれる。
やつらがクラスのようなものに所属することはない。
Delphi
Delphi を使ったことはほぼ無いし、全然知らないんだけど、面白いので記載した。
クラスに所属していないやつらについては、Pascal と同じ。
によると
A method is a procedure or function associated with a class.
とのことなので、手続きまたは関数のうち、クラスに所属しているもののことを メソッドと呼ぶ。というスタイル。
メソッドのうち、 self
が必要なものは「インスタンスメソッド」、self
なしでも呼べるものは「クラスメソッド」と呼ぶ。
クラスメソッドを定義する際には「class procedure
」「class function
」などと記載するので、場合によっては「クラス手続き」「クラス関数」などと呼ばれることもありそう(知らない)。
まとめと感想
自分が文書を書くときには、文脈に応じて適切に書きたいと思う。
ある言語などについて人に教えるという状況の人は、間違えずに使うべきとも思うけれど、それ以外の文脈では適当にやればいいとも思う。
この記事を書くまで、go の func (o * something)foo(){}
のようなものが「メソッド」なのを知らなかった。オブジェクト指向ではないと言われがちなので、メソッドとは呼ばないんだと思っていた。
ただ。C++ のメンバ関数のことを「メソッド」と呼んでいるのを見ると、むむむ、と思ってしまう。
Discussion
C++ の項目について
そう呼ぶことはあるようですが仕様上の用語では非メンバ関数 (non-member function) です。
仕様上の用語としては静的メンバ関数 (static member function) ですね。
非メンバ関数に静的かどうかという区別はないので「メンバ」と付けなくても明らかではありますしカジュアルな場面では静的関数と言う人もいるのかもしれません。
齊藤敦志さま、コメントありがとうございます。
「非メンバ関数」の正式な用語の補足ありがとうございます。
私としては「フリー関数」か、単に「関数」と呼んでいて、正式な用語を把握してませんでした。見たことがあるはずなんですが...。
「静的メンバ関数」などから「メンバ」が抜け落ちているのは、誤記でした。修正しました。ありがとうございます。
メンバであることがあきらかでも私としてはstatic メンバ関数のことを「static 関数」と呼ぶことはない気がします(言い間違えや書き間違いはありそうです...)が、誤解がなくカジュアルな場面なら OK と思います。
※ C / C++ には、ファイルスコープの(つまり、他の翻訳単位からは参照できない)関数のための用語として「static 関数」があります。
Julia の関数(とメソッド)は、これらの言語とはまた全然違う方向性・概念・用語となっているので、この場で紹介させてください(それだけで1つの記事になるようなネタなので記事へのコメントとしてしまうのは少々心苦しくもありますが)
Julia には 関数 があります。
Julia には型(構造体)はありますが、関数は型に属するものという考え方はありません。関数は関数です。(言い換えると構造と振る舞いを分ける設計思想になっている)
Julia の関数は、多重定義(≒オーバーロード)ができます。引数の組合せ(=型シグニチャ)の違いによる別個の実装をそれぞれ メソッド と呼びます。例えば
+
という関数があります(Julia の演算子は関数です)。1 + 2
という式(+(1, 2)
という関数呼び出しと同じ)で使われている+
は整数型を2つ引数に受け取る+
関数のメソッド、1.0 + 2.0
なら浮動小数点数を2つ受け取るメソッドというように、引数の組合せに応じて呼び出されるメソッドが変わります(これを 多重ディスパッチ という)。このような仕組みなので、Julia の(多重定義ができる)関数のことを 総称関数(generic function)とも呼びます。
参考: Methods · The Julia Language、拙著 実践Julia入門 第5章「多重ディスパッチ」等
以上、参考までに。
(21:47 1箇所用語ミスってたのでこっそり修正しました)