mam ten kod:Zmień wiązanie Proc w Ruby
l = lambda { a }
def some_function
a = 1
end
po prostu chcę, aby uzyskać dostęp a
przez lambda i specjalny zakres która zdefiniowała a
już gdzieś jak wewnątrz some_function
w przykładzie, lub wkrótce później właśnie w takim samym zakresie jak:
l = lambda { a }
a = 1
l.call
Potem znalazłem podczas wywoływania l
, wciąż jest za pomocą własnego wiązania, ale nie nowy, gdzie go nazywano.
A potem próbowałem go używać jako:
l.instance_eval do
a = 1
call
end
Ale to również nie jest to dziwne, że nie potrafi wyjaśnić dlaczego.
Wiem, że jednym z rozwiązań jest użycie eval
, w którym mogłem specjalne wiązanie i wykonywanie niektórych kodu w tekście, ale naprawdę nie chcę używać jako tak.
I wiem, że jest w stanie użyć zmiennej globalnej lub zmiennej instancji. Jednak faktycznie mój kod znajduje się w głębszym środowisku osadzonym, więc nie chcę łamać ukończonych części, jeśli nie jest to konieczne.
W dokumentacji podałem nazwę klasy Proc
i znalazłem nazwę funkcji binding
, która odnosiła się do kontekstu Proc
. Chociaż funkcja zapewniała tylko sposób uzyskania dostępu do wiązania, ale nie może go zmienić, z wyjątkiem korzystania z Binding#eval
. Ocenia również tekst, który jest dokładnie tym, czego nie lubię robić.
Teraz pytanie brzmi, czy mam lepszy (lub bardziej elegancki) sposób realizacji tego? Lub używając eval
jest już regularny regularny?
Edit aby odpowiedzieć @Andrew:
Ok, jest to problem, którego poznałem podczas Piszę leksykalny parser, w którym zdefiniowano tablicę ze stałej liczby elementów, nie w tym co najmniej Proc
i wyrażenie regularne. Moim celem jest dopasowanie wyrażeń regularnych i wykonanie Proc do mojego specjalnego zakresu, w którym Proce będzie zawierał pewne zmienne lokalne, które powinny być zdefiniowane później. I wtedy spotkałem się z powyższym problemem.
Tak naprawdę to nie jest całkowicie takie same dla that question, jak moje jest przekazywanie w wiążące do Proc, a nie jak przekazać go się.
@Niklas: Dostałem odpowiedź, myślę, że właśnie tego chcę. Naprawdę rozwiązał mój problem.
Być dobrym pytaniem jest dlaczego * * chcesz tego, czy raczej, co starasz się ostatecznie osiągnąć? –
@Andrew: Nie wiem. Byłbym zainteresowany odpowiedzią na to dokładne pytanie, a nie na rozwiązanie podstawowego problemu :) –
@NiklasB. Zgadzam się, ale znajomość celu końcowego może pomóc lepiej zrozumieć problem. I jestem pewien, że odpowiedziałem na podobne pytanie, ale próbuję je znaleźć, ale nie mogę ": ( –