1

「関数オブジェクト」とは、ある意味で呼び出し可能であり、言語で関数として扱うことができるクラスのオブジェクトを意味します。たとえば、Python では次のようになります。

class FunctionFactory:
    def __init__ (self, function_state):
        self.function_state = function_state
    def __call__ (self):
        self.function_state += 1
        return self.function_state

>>>> function = FunctionFactory (5)
>>>> function ()
6
>>>> function ()
7

私の質問は、この FunctionFactory と関数の使用は閉鎖と見なされるでしょうか?

4

3 に答える 3

4

クロージャーは、それが定義された環境を記憶し、周囲のスコープから変数にアクセスできる関数です。関数オブジェクトは、関数のように呼び出すことができるオブジェクトですが、実際には関数ではない場合があります。関数オブジェクトはクロージャではありません:

class FunctionObject(object):
    def __call__(self):
        return foo

def f():
    foo = 3
    FunctionObject()() # raises UnboundLocalError

FunctionObject は、それが作成されたスコープにアクセスできません。ただし、関数オブジェクトの__call__メソッドはクロージャーである場合があります。

def f():
    foo = 3
    class FunctionObject(object):
        def __call__(self):
            return foo
    return FunctionObject()
print f()() # prints 3, since __call__ has access to the scope where it was defined,
            # though it doesn't have access to the scope where the FunctionObject
            # was created
于 2013-07-11T03:26:27.493 に答える
1

... FunctionFactory と関数のこの使用はクロージャーと見なされますか?

スコープを含まないため、それ自体はそうではありません。クロージャーができることを模倣していますが。

def ClosureFactory(val):
  value = val
  def closure():
    nonlocal value # 3.x only; use a mutable object in 2.x instead
    value += 1
    return value
  return closure

3>> closure = ClosureFactory(5)
3>> closure()
6
3>> closure()
7
于 2013-07-11T03:24:11.250 に答える
0

クロージャは、それが定義されている環境を閉じて、その変数をキャプチャするコードの一部です。現代のほとんどの言語では、関数はクロージャーですが、必ずしもそうであるとは限りません。また、関数オブジェクトではないクロージャー (たとえば、まったくオブジェクトではない Ruby ブロックなど) を想像することもできます。

これはクロージャーの必須テストです。

def bar():
    x = 1
    def foo():
        print x
    return foo

x = 2
bar()()

1 が出力された場合fooは、クロージャです。2 が出力された場合は、そうではありません。

于 2013-07-11T03:23:54.667 に答える