“eval”是Ruby中绑定对象交互的唯一方法吗?
我对Ruby很新,到目前为止,想知道如何使用
“binding” objects是我最大的痛点之一.如果我正确阅读文档,它们几乎完全不透明.要访问绑定对象中的范围,您必须使用一个Ruby代码字符串和
eval它使用绑定.
也许我只是一个来自不同学校的纯粹主义者,但我一般来说对基于字符串的“eval”结构过敏.给出一个绑定对象,是否有任何方法可以安全地执行以下任何操作:一般情况下: >在绑定表示的上下文中列出范围中的标识符,或检索内容的散列. 基本上,我想知道哪些是可能的,以及如何完成那些.我想像,每个方案的解决方案将是相当密切相关的,这就是为什么我将所有这一切都放在一个单一的问题. 或者,有没有办法在绑定的上下文中已经解析的eval代码,类似于Perl的eval BLOCK语法? 解决方法
在搜索更多时,我找到了至少部分问题的答案:
基于:http://wikis.onestepback.org/index.cgi/Tech/Ruby/RubyBindings.rdoc/style/print 其余的是Jim Shubert有用的指点后的实验. >这可以通过在绑定中评估local_variables,instance_variables和global_variables来实现. 这确实涉及使用字符串eval.然而,没有变量值被扩展到所涉及的字符串,所以如果按照描述使用,它应该是相当安全的,并且应该用于“传入”复杂的变量值. 还要注意的是,可以使用eval var_name,my_binding来获取变量的值.请注意,在所有这些使用中,变量的名称对于eval是安全的,因此它最好不应该来自任何类型的用户输入. 在一个绑定中设置变量赋值var_name,my_binding: # the assignment to nil in the eval coerces the variable into existence at the outer scope setter = eval "#{var_name} = nil; lambda { |v| #{var_name} = v }",my_binding setter.call(new_val) 构建“定制”绑定: my_binding = eval "lambda { binding }",TOPLEVEL_BINDING # build a nearly-empty binding # set_in_binding is based on the above snippet vars_to_include.each { |var_name,new_val| set_in_binding(var_name,my_binding) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |