红宝石有延续物吗?它是否有dynamic-wind
结构,如Scheme?红宝石方案的动态风的等效物
2
A
回答
5
[这个答案是写在Scheme程序员的脑海里(OP已经询问过其他Scheme的问题,所以这是一个安全的选择)。如果您因为您是没有Scheme背景的Ruby程序员而来到这里,请阅读脚注以了解某些上下文。 :-)]
MRI没有(见下文);如果MRI没有,那就意味着即使另一个实现提供了这种功能,也没有可移植的方法来使用这些功能。
我确实检查了MRI 1.9.1源代码。无论如何,下面是一些代码,用于证明即使是正常的放松保护(ensure
)也不能在MRI上进行延续(使用1.8.7和1.9.1进行测试)。 (它使用JRuby正常工作(我用1.5测试),所以它正好说明它的具体实现的事情。但需要注意的是JRuby的只提供逃跑的延续,而不是通用的。)
callcc do |cc|
begin
puts 'Body'
cc.call
ensure
puts 'Ensure'
end
end
(与MRI 1.9+测试,你需要或者与-rcontinuation
选项运行,或将require 'continuation'
在文件的顶部。)
对于读者谁不知道dynamic-wind
是什么,这是一个办法在退出代码时指定要运行的代码(很像ensure
),以及代码在重新输入代码时运行。 (这可能发生在使用call/cc
涵盖代码中,并调用continuation对象的覆盖的代码已经退出后)。
完全人为的例子:
def dynamic_wind pre, post, &block
raise 'Replace this with a real implementation, kthx'
end
def redirect_stdout port, &block
saved = $stdout
set_port = lambda {$stdout = port}
reset_port = lambda {$stdout = saved}
dynamic_wind set_port, reset_port, &block
end
cc = nil
# cheap way to nuke all the output ;-)
File.open '/dev/null' do |null|
redirect_stdout null do
callcc {|cc|}
puts 'This should not be shown'
end
puts 'This should be shown'
cc.call
end
所以,正确运作dynamic_wind
实施将确保在调用延续时$stdout
将被设置回/dev/null
流,以便在运行puts 'This should not be shown'
的所有实例中确实不显示该文本。
相关问题
- 1. 的setInterval()等效红宝石
- 2. 红宝石openssl中的AES等价物?
- 3. Python的等效的Perl /红宝石||的=
- 4. Clojure的等效红宝石的GSUB
- 5. 红宝石中“pass”的等效代码
- 6. C#BitConverter.ToSingle的红宝石等效
- 7. rmul是否有红宝石等价物?
- 8. 什么是'等'红宝石的宝石?
- 9. 红宝石动态链接方法
- 10. 等效红宝石obj.send在python
- 11. 红宝石等效PHP函数openssl_pkey_get_public
- 12. get_eval中的硒红宝石webdriver的等效方法
- 13. 红宝石混入物业
- 14. 红宝石动物园看守人
- 15. 红宝石块的动态嵌套
- 16. 平等红宝石vs rspec
- 17. 不等于不红宝石
- 18. 红宝石等同于JS
- 19. 红宝石,等待回调
- 20. 红宝石阵列平等
- 21. Twitter的红宝石宝石
- 22. 取代红宝石风格的块
- 23. 红宝石``**方法
- 24. 红宝石:方法
- 25. 替代正常宝石红宝石方法的动作缓存?
- 26. 串连红宝石中的物体
- 27. 什么是蟒蛇BeautifulSoup库的红宝石等价物?
- 28. 红宝石等价物的c缓冲区
- 29. 红宝石。每个效率
- 30. 红宝石+的Eclipse + “动态语言工具包红宝石” 插件