関数定義・メソッド定義

Go言語 (golang)

関数定義の例

func f() string {
  ...
  return ...
}

Java

Javaではクラスに属するメソッドはあるが、クラスの外にあるトップレベルの関数は存在しない。 Java8からはラムダ式)がある。ラムダ式もJVM上ではメソッドである。

メソッドの定義は、クラス定義の中に書く。

public String f(String arg1, int arg2){
  ...;
  return ...;
}

返り値がない場合の例

public void f(String arg1, int arg2){
  ...;
}

Scala

メソッド定義の例

def f(arg1: String, arg2: Int): String = {
  ...;
}

最後の式が自動で返り値になるので、途中で関数から脱出する場合をのぞいてreturnは省略できる。

Scalaのメソッド定義はJavaと違って

def f(引数リスト): 戻り値の型 = 式

である。メソッド本体はJavaのように中括弧で囲むことは不要で、式を書くことになっている。式を複数書く目的の{ ... } (中括弧)自体もScalaでは式であり、中括弧の中の最後の式が中括弧全体の結果になるので、メソッド本体に式を複数書く必要がある場合は中括弧で囲む。メソッドの本体が式1つで済む場合は中括弧を使わないことが多い。

返り値が Unit の場合(Javaでいうとvoidで返り値がない場合)は、以下でも可。

def f(arg1: String, arg2: Int) {
  ...;
}

引数がない場合はカッコを省略できる。

def f: String = {
  ...;
}

返り値の型が明確な場合は型を省略できる。

def f = ...;

メソッド定義の中に入れ子でメソッド定義を書くこともできる。この場合、内側のメソッドは、すぐ外側のメソッドの中からしか参照できない。

Groovy

def f(arg1, arg2) {
  ...
}

最後の式が自動で返り値になるので、途中で関数から脱出する場合をのぞいてreturnは省略できる。

PHP

関数定義の例

function f($arg1, $arg2){
  ...;
  return ...;
}

関数定義・メソッド定義では引数のカッコを省略不可。

関数定義はグローバルにある必要はなく、別の関数の中であったり、 if文などの制御構造の中にあってもよい。ただ、定義された関数自体は常にグローバルになるので、関数の中で定義された別の関数は、定義後はいつでもグローバルから呼び出すことができる。

制御構造や関数の中で定義された関数は、関数定義の部分が実行されないと、その関数を呼び出すことはできない。呼びだそうとしても Call to undefined function と言われる。

トップレベルで定義した場合は、定義よりも上の部分からであってもその関数を呼び出すことができる。

関数名は大文字小文字を区別しないが、普通は定義時と呼び出し時とで大文字小文字を一致させる。

ユーザー定義関数 | PHP Manual
http://www.php.net/manual/ja/functions.user-defined.php

Smarty

関数定義の例

{function f arg1='default value' arg2='default value 2'}
  ...
{/function}

参考: 関数呼び出し

仮引数の名前として name は使えない。

{function f name=false}

と書いたら、関数名が 'false' になってしまい、

unknown tag "f"

というエラーメッセージが表示されてしまう。

function | Smarty Manual
http://www.smarty.net/docs/ja/language.function.function.tpl

Python

Pythonの関数はオブジェクトであり、関数定義できるdef文では、関数オブジェクトを生成してそれを変数に代入する。関数名は他と同じ普通の変数である。関数定義は普通の変数への代入と同じなので、関数定義の中でも、関数定義を置くことができる。

def文の例

def f(arg1, arg2):
    ...
    return ...

関数定義では引数のカッコを省略不可。

関数呼び出しでは引数のカッコを省略不可。

返り値を指定するにはreturn文が必須で、最後の式が自動で返り値になることはない。

関数定義は変数への代入と同じなので以下のようなことも可能。

def f():
    ...
g = f
g()

Ruby / JRuby

クラス定義の中にメソッドを書く。トップレベルにもメソッド定義を書けるがこれは Objectprivateメソッドの扱いになり、どこからでも呼び出せるメソッドになり、他の言語でのグローバルの関数として使える。

メソッド定義の例

def f(arg1, arg2)
  ...
  return ...
end

メソッド定義では仮引数のカッコを省略可。メソッド呼び出しでは引数のカッコを省略可。

メソッドの中の最後でreturnする場合は、returnと書かないのが多い。 最後の式がメソッドの返り値になるため。

特異メソッドを定義する例

def obj.f(arg1, arg2)
  ...
  return ...
end

または

class << obj
  def f(arg1, arg2)
    ...
    return ...
  end
end

グローバル変数$ で始まる名前になっていて、メソッドの中からグローバル変数を参照することはできる。

Perl

サブルーチンの定義の例

sub f {
  my ($arg1, $arg2) = @_;
  ...;
  return ...;
}

インスタンスメソッドの定義の例

sub f {
  my ($this, $arg1, $arg2) = @_;
  ...;
  return ...;
}

クラスメソッドの定義の例

sub f {
  my ($class, $arg1, $arg2) = @_;
  ...;
  return ...;
}

サブルーチン定義の中では引数は、@_, $_[...] などで参照する。

サブルーチンの中でサブルーチンを定義することもできるようだが、中のサブルーチンは外からも呼び出せてしまうようだ。

sub f {
    ...;
    sub g {
        ...;
    }
    ...;
}
f(...);
g(...); # => No problem

sh (シェルスクリプト)

関数の定義。

f()
{
    ...
    return 0
}

スタイルはなんでもよくて、

f() {
    ...
    return 0
}

f() { ...; return 0; }

でもよい。

関数の呼び出し。

f a1 a2

return 0 のように書くと関数の処理から戻り値を指定して脱出できる。return文はなくてもよい。

JavaScript

function f(arg1, arg2){
    ...;
    return ...;
}

CoffeeScript

(arg1, arg2) ->
  ...
  ...

引数がない場合

->
  ...
  ...
このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。
スポンサーリンク