Supponiamo che ho una classe come questa:Possibile per esempio_eval un proc al curry?
class Test
def test_func
140
end
end
E un proc, che fa riferimento a una funzione membro da Test
:
p = ->(x, y) { x + y + test_func } # => #<Proc:[email protected](pry):6 (lambda)>
Per chiamare p
, mi legano a un'istanza di Test
:
test = Test.new # => #<Test:0x007fb3143c5a68>
test.instance_exec(1, 2, &p) # => 143
Ora supponiamo che io voglio passare solo y
-p
, e sempre passare x = 1
:
curried = p.curry[1] # => #<Proc:0x007fb3142be070 (lambda)>
Idealmente mi dovrebbe essere in grado di appena instance_exec
come prima, ma invece:
test.instance_exec(2, &curried)
=> NameError: undefined local variable or method `test_func' for main:Object
Il proc viene eseguito in quello che sembra essere il legame corretto. Cosa dà?
beh, sembra che nel far funzionare la funzione esso leghi le variabili 'test_func' in qualsiasi cosa sia il' test_func' locale. Sto cercando di pensare perché questo dovrebbe essere e non riesco a inventare nulla, anche giocando non riesco a trovare alcun modo di ottenere il risultato atteso (un 'test_func' legato correttamente su un proc elaborato). Bella domanda –
Sì, questo è interessante. Sembra che dopo aver eseguito il proc si leghi lo scope al main e nonostante lo abbia valutato all'interno del test, mantiene l'ambito al main. – jvans
Ho segnalato questo come un bug [qui] (https: //bugs.ruby-lang.org/issues/10006), vedremo se è effettivamente o se qualcuno può spiegare. –