Załóżmy, że posiada klasy, takie jak to:Możliwe do instance_eval curried proc?
class Test
def test_func
140
end
end
I Proc, który odwołuje się do funkcji użytkownika z Test
:
p = ->(x, y) { x + y + test_func } # => #<Proc:[email protected](pry):6 (lambda)>
aby wywołać p
, powiązać go z wystąpieniem Test
:
test = Test.new # => #<Test:0x007fb3143c5a68>
test.instance_exec(1, 2, &p) # => 143
załóżmy teraz chcę przekazać tylko y
do p
i zawsze przechodzą x = 1
:
curried = p.curry[1] # => #<Proc:0x007fb3142be070 (lambda)>
Idealnie powinienem być w stanie po prostu instance_exec
jak poprzednio, ale zamiast:
test.instance_exec(2, &curried)
=> NameError: undefined local variable or method `test_func' for main:Object
PROC biegnie w to, co wydaje się być niepoprawny wiążące. Co daje?
Cóż, wygląda na to, że podczas zamykania funkcji wiąże zmienne 'test_func', niezależnie od lokalnego' test_func'. Próbuję wymyślić, dlaczego tak powinno być i nie mogę wymyślić niczego, także grając w kółko, nie mogę znaleźć żadnego sposobu uzyskania oczekiwanego wyniku (poprawnie powiązanego 'test_func' na zwiniętym procesie). Fajne pytanie. –
Tak, to jest interesujące. Wygląda to tak, jak po przekierowaniu proca wiąże on zakres do głównego i pomimo jego oceny w ramach testu utrzymuje zakres do głównego. – jvans
Zgłosiłem to jako błąd [tutaj] (https: //bugs.ruby-lang.org/issues/10006), Zobaczymy, czy rzeczywiście tak jest lub czy ktoś może to wyjaśnić. –