Ruby 코드에 람다/Proc을 작성하고 직렬화하여 디스크에 기록한 다음 나중에 람다를 실행할 수 있기를 원합니다. 어떻게 루비 코드를 문자열 화/직렬화합니까?
x = 40
f = lambda { |y| x + y }
save_for_later(f)
나중에, 루비 인터프리터의 별도의 실행에, 내가 말할 수 있도록하려면 같은 종류의 ... ... Marshal.dump은 프로세서 수에 대해 작동하지 않습니다
f = load_from_before
z = f.call(2)
z.should == 42
. Perl은 Data::Dump::Streamer이고, Lisp에서는 이것이 사소하다는 것을 알고 있습니다. 하지만 루비에서 할 수있는 방법이 있습니까? 즉, _
에 대한 save
일까요?_
의 구현은 나중에
편집 : My answer below 좋은이지만, 그것은 자유 변수 (같은이 x
)를 통해 닫고 람다와 함께 그들을 직렬화하지 않습니다.
x = 40
s = save_for_later { |y| x + y }
# => "lambda { |y|\n (x + y)\n}"
... 내 예제에서 그래서 ... 문자열 출력은 x
에 대한 정의가 포함되어 있지 않습니다. 심볼 테이블을 직렬화하여이를 고려한 솔루션이 있습니까? 루비에서 액세스 할 수 있습니까?
편집 2 : 로컬 변수 직렬화를 통합하여 답변을 업데이트했습니다. 이것은 받아 들일 만하다.
내 Ruby2Ruby 버전 (1.2.4)에 번역 방법이없는 것 같습니다. 최신 버전에서 다른 API가 있습니까? –
나는 그것을 이해하지 못한다. 그러나 [this thread] (http://stackoverflow.com/questions/1144906/error-running-check-currentcode-undefined-method-translate-for-ruby2ruby)는 Ruby2Ruby 1.2로 다운 그레이드 할 것을 권장한다. .2. 나는 또한 [이 원숭이 패치] (http://gist.github.com/321038)가 최신 버전으로 다시 추가한다고 주장했다. 비록 그것을 시도하지 않았습니다. –
Ruby 1.9에서는 작동하지 않습니다. – Kludge