現代の言語で多くは関数を第一級オブジェクトとして扱えます、第一級オブジェクトとは言語の持つ基本的な操作を制限なしに実行できることというのがWikipediaでの解説(以下引用)
“第一級オブジェクト(ファーストクラスオブジェクト、first-class object)は、あるプログラミング言語において、たとえば生成、代入、演算、(引数・戻り値としての)受け渡しといったその言語における基本的な操作を制限なしに使用できる対象のことである。”
で、第一級オブジェクトとして関数が扱えれば、それは第一級関数となります。より具体的には以下の使用例を。以下やってることは冗長なだけですが、関数を変数に代入できることは『その言語における基本的な操作を制限なしに使用できる』の一つに該当します。
実際にやっていることは関数の型とポインタを渡しているだけだろうと思いますが。
package main
import (
"fmt"
"math"
)
type calif interface{
calc(i float64) float64
}
type calst struct{
c calif
}
func (c calst)calc(i float64) float64 {
return math.Sqrt(i)
}
func main() {
ci := calst{}
cal := ci.calc(1)
ary := []float64{25, 36, 100, 121, 144}
for _, ft := range ary {
cal = ci.calc(ft) // set func(calc) to variable(cal)
fmt.Println(cal)
}
}
現代の多くの言語では、関数は第一級オブジェクトですが、Rustではそうなっていないようです。意図した理由はあるはずですが、
https://zenn.dev/hinastory/articles/7857427ea390c5
admin