1

Ruby にはファースト クラスの関数はありません。プロシージャとラムダがありますが、これらはかなりのオーバーヘッドを必要とすることで有名です。(Python には、明らかにオーバーヘッドのないファースト クラスの関数があります。)次のように、匿名クラスを使用することで、ファースト クラスの関数をもう少し作業でシミュレートできることに気付きました。

f = Class.new { def self.f; puts 'hi'; end }

def g(fun); fun; end

g(f.f)
# => "hi"

誰かがより良い方法を知っていますか?

4

2 に答える 2

1

Ruby にはprocs とs (どちらもクラスlambdaのインスタンス) とs があり、これらはすべてファーストクラス関数に近似しています。ラムダは、真のファーストクラス関数に最も近いものです。ラムダは、呼び出されたときに引数の数をチェックし、ラムダから戻るだけの新しい呼び出しコンテキストを作成します。対照的に、proc は具体化されたコードのブロックにすぎません。それらは引数の数をチェックせず、procだけでなく、囲んでいるメソッドを返します。ProcMethodreturnreturn

メソッド オブジェクトを使用すると、呼び出されていないメソッドを変数に格納し、暗黙の呼び出しを行うことができます。匿名メソッドを作成するための構文はありませんが、匿名関数ではなく、ファーストクラスの関数と言いました。invocant を除いて、それらは基本的にラムダであり、その本体は参照されたメソッドの本体です。

上記のソリューションよりも優れた匿名クラスが得られるものはわかりませんが、真のファーストクラス関数からははるかに離れていることは確かです。クロージャーが言語に追加される前に、Java でそれらを近似しなければならなかった方法に似ています。

于 2016-07-14T00:17:53.413 に答える