我正在尝试理解Ruby中的eval和绑定(bind)上下文。在irb中考虑以下内容irb(main):001:0>eval"a=42"=>42irb(main):002:0>aNameError:undefinedlocalvariableormethod`a'formain:Objectfrom(irb):2from/Users/niels/.rbenv/versions/2.1.3/bin/irb:11:in`'irb(main):003:0>为什么a没有定义?如果我在评估之前声明a,则值42会分配给a。在我看来,某种block作用域适用于局部变量在eval上下文中可用的情况,但声
我对使用class_eval的Ruby变量范围的最佳实践有疑问。在这段代码中,在class_evalblock中,局部变量first和second是未定义的。defparent_method(opts={})first=opts[:percent]second=(10*first).to_iSecondClass.class_evaldodefsecond_method;return{:a=>first,:b=>second};end;endend这似乎是一个范围界定问题,因为我发现让它起作用的唯一方法是创建第一类和第二类级别的变量:defparent_method(opts={})@
为什么Binding#eval会调用block,而Kernel#eval不会?defbar;binding;endbi=bar{|x|p(x+1)}bi.eval"yield2"#==>3eval"yield2",binding#==>LocalJumpError 最佳答案 我认为,在第五行,第二个参数必须是'bi':$ruby-vruby2.0.0p0(2013-02-24revision39474)[x86_64-linux]1defbar;binding;end2bi=bar{|x|p(x+1)}34bi.eval"yield
我对Rubyblock和过程的理解是它们都是闭包。既然我已经看到它与instance_eval一起使用,我有点困惑。与使用instance_eval相比,在查看裸机时改变block作用域在最常见用途下的行为方式的魔术酱是什么?这是一个示例,您可以在IRB中转储以了解我的意思。我已经包含了一个proc.call和blockyield版本示例。令人高兴的是,它们的行为方式相同。#Testingblock/procandevalclassExampledefinitialize(value)#valuedefinedintheinstance@value=valueenddefcall_a_
在进行RubyMonk中的练习时(付费专区后面的链接,因此未提供),为了衡量使用eval定义方法的性能与define_method相比,以下内容提供代码:require'benchmark'classMonkeval"defzen;end"define_method(:zen_block){}endmonk=Monk.newBenchmark.bmbmdo|x|x.report("evalzen:"){1_000_000.times{monk.zen}}x.report("define_methodzen:"){1_000_000.times{monk.zen_block}}end作为
我正在准备一个将被eval处理的字符串。该字符串将包含一个从现有Array构建的子句。我有以下内容:defstringify(arg)return"['"+arg.join("','")+"']"ifarg.class==Array"'#{arg}'"enda=['a','b','c']eval_str='p'+stringify(a)eval(eval_str)打印字符串["a","b","c"]。有没有更惯用的方法来做到这一点?Array#to_s没有削减它。有没有办法将p方法的输出分配给变量?谢谢! 最佳答案 inspect应
使用eval分配实例变量工作正常,而另一个则不然。试图了解这里发生的事情。感谢您的帮助。>>var="avalue"=>"avalue">>@v=>nil>>eval"@v=var"=>"avalue">>@v=>"avalue">>eval"var_new=var"=>"avalue">>var_newNameError:undefinedlocalvariableormethod`var_new'formain:Objectfrom(irb):7fromC:/Ruby193/bin/irb:12:in`' 最佳答案 eval有它
我编写了以下递归函数来解析一些设置并正确填充我拥有的一些日志文件对象。当我针对CodeClimate运行此代码时,它告诉我(当然)不鼓励使用eval。有没有办法重写这个方法,这样我就不需要eval也不需要case语句了?什么都没想到。defparse(settings,logfile=nil)settings.eachdo|key,value|ifvalue.is_a?(Hash)logfile=Logmsg::LogFile.newparse(value,logfile)elseeval("logfile.#{key}=value")endendend有什么想法吗?我正在尝试inst
我们正在尝试做的是存储一大块erbstring中的代码然后在运行时执行代码。这是我们所做的测试:从工作erb文件中取出一大块代码,用eval重写erb文件。这是取出来的erb代码块:#t()是国际化的翻译方法。重写后的erb文件如下:在重写之前,代码块在之间。.现在变量code返回string代码块和eval执行代码块。但这是错误:(eval):1:syntaxerror,unexpected'^Extractedsource(aroundline#6):4:5:6:7:8:9:上面的代码有什么问题? 最佳答案 eval通过评估ru
这个问题在这里已经有了答案:Rubyblockandunparenthesizedarguments(1个回答)RubyBlockSyntaxError[duplicate](1个回答)关闭8年前。如果我有一个类:classKlassWithSecretdefinitialize@secret=99endend然后运行:putsKlassWithSecret.new.instance_eval{@secret}它打印99,但如果我运行:putsKlassWithSecret.new.instance_evaldo@secretend它返回一个错误:`instance_eval':参数数