経緯
Rubyを学習していて、関数定義の部分でこんな記述に出会いました。
def hello
'Hello'
end
こんなふうに書かれると、「これって関数自体が'Hello'って値を持ってるのか?だったらreturn
とかつけずに、関数内でやることやってbreak
して関数を引数にしちゃってもいいんじゃないか?」と思ったわけです。
どう違うのか
天下のChatGPT様に聞いてみたところ、このような返答が来ました。
関数自体が値を持っているというよりは、関数が呼び出された時に'Hello'という文字列を返すように定義されています。つまり、greeting関数が呼び出された結果として、'Hello'が返されるということです。
なので関数というのは、渡す値でも、返される値でもなく、その二つをつなぐ「橋」の部分なんですね。
大学で数学概論を受講したとき、集合の分野で 「写像」 という概念がありました。たしか写像の別名は 「関数」 じゃなかったか...
写像というのは、ある集合A, Bがあったときに、Aの要素にBの要素が対応するような関係のことをいいます。下図でいう矢印の部分に相当します。
先ほどのコードに戻りましょう。
def hello
'Hello'
end
この関数には、一見なんの引数も戻り値も無いように見えます。それは逆に言えば、「どんな値を渡されてもたった一つの値を返す」ということになります。全射っすね。
なのでこの関数は、写像的に言うと 「どんな値であっても"Hello"に対応させるような対応関係」 といえるわけです。
あっそうだ。Rubyの関数においては、return
がなくても、自動的に戻り値が返されるようになっているようです。Rubyくんさぁ...
まとめ
関数というのは、一見値を持つように見えても、それ自体は値を持ちません(持ってるものもあるかもしれないけど...)。
ある値を渡されて、それを別の値に対応づける(戻り値を返す)のが関数です。