草庐IT

OpenStruct

全部标签

Ruby 错误 - 未初始化的常量 OpenStruct (NameError)

我正在尝试使用ruby​​的optionparse来解析我的ruby​​脚本的参数。问题是当我像这样运行脚本时bundlerexecruby​​generation.rb--帮助我收到错误“未初始化的常量OpenStruct(NameError)”我相信,因为我正在使用bundleexec运行脚本,所以我不应该收到此错误。我做错了什么。require'optparse'defparse(args)options=OpenStruct.newoptions.dir='../somerepo'opts=OptionParser.newdo|opts|opts.banner="Usage:g

ruby - 将 OpenStruct 深度转换为 JSON

我有一个OpenStruct,它嵌套在许多其他OpenStructs中。将它们全部深度转换为JSON的最佳方法是什么?理想情况下:x=OpenStruct.newx.y=OpenStruct.newx.y.z=OpenStruct.newz='hello'x.to_json//{y:z:'hello'}现实{} 最佳答案 没有默认方法来完成这样的任务,因为内置的#to_hash返回哈希表示,但它不会深度转换值。如果值是OpenStruct,它会原样返回,不会转换成Hash。然而,这并不难解决。您可以创建一个遍历OpenStruct实

ruby - 访问 OpenStruct 中不存在的属性时引发异常

我正在尝试弄清楚如何使OpenStruct的子类(或与此相关的任何类)或散列在我尝试访问尚未设置的属性时引发自定义异常.我无法让define_method和method_missing执行此操作,所以我不知道应该如何在Ruby中完成。这是一个例子:classRequest我可以想象它必须是这样的:classHash#iftryingtoaccesskey:#1)keyexists,returnkey#2)keydoesn'texist,raiseexceptionend编辑:存在的属性不应引发异常。我正在寻找的功能是让我可以自由访问属性,如果它不存在,我的自定义异常将被引发。

ruby - 递归地将 Hash 转换为 OpenStruct

鉴于我有这个散列:h={a:'a',b:'b',c:{d:'d',e:'e'}}然后我转换为OpenStruct:o=OpenStruct.new(h)=>#"d",:e=>"e"}>o.a=>"a"o.b=>"b"o.c=>{:d=>"d",:e=>"e"}2.1.2:006>o.c.dNoMethodError:undefinedmethod`d'for{:d=>"d",:e=>"e"}:Hash我希望所有嵌套的键也都是方法。所以我可以这样访问d:o.c.d=>"d"我怎样才能做到这一点? 最佳答案 你可以猴子修补Hash类cl

ruby-on-rails - 将散列收集到 OpenStruct 中创建 "table"条目

为什么这样(在Rails控制台中评估)[{:a=>:b}].collect{|x|OpenStruct.new(x)}.to_json在那里添加一个“表”记录?"[{\"table\":{\"a\":\"b\"}}]我只想要这个:"[{\"a\":\"b\"}]这是否意味着Rails的to_json方法以不同的方式处理OpenStruct?当我在irb中尝试时,它不存在:require'ostruct'[{:a=>:b}].collect{|x|OpenStruct.new(x)}.inspect 最佳答案 因为@tableisai

ruby - 将 OpenStruct 与 ERB 结合使用时出现问题

编辑:忘记包含我的环境信息...Win7x64,RubyInstallerRubyv1.9.1-p378编辑2:刚刚更新到v1.9.1,补丁429,但仍然遇到同样的错误。编辑3:在Rubyv1.8.7补丁249中运行相同的代码,效果很好。所以显然是v1.9.1破坏了它。我是ERB的新手,我能找到的示例是……嗯……没什么用……在使用ERB大约一个小时后,我得到了一些基本示例(终于),但我不知道为什么这不起作用......require'ostruct'require'erb'data={:bar=>"bar"}vars=OpenStruct.new(data)template="foo"

ruby-on-rails - 如何在 Openstruct 对象上使用 "each"?

我有一个像这样的OpenStruct散列:#"2","param2"=>"1"},object2={"param1"=>"2","param2"=>"1"},object3={"param1"=>"2","param2"=>"1"}...如何在上面使用each? 最佳答案 OpenStruct有一个名为marshal_dump的方法返回底层哈希结构:your_open_struct.marshal_dump.each{|k,v|puts"#{k}=>#{v}"}如果您使用的是Ruby2.0,您还可以使用to_h像这样:your_op

ruby - 我什么时候应该使用 OpenStruct 而不是 Hash?

我喜欢“任意属性的定义”,我认为ruby​​中的OpenStruct有时感觉比使用哈希更干净,但我很好奇是否还有其他特定优势或用例使OpenStruct成为更好的选择而不是简单地使用哈希。 最佳答案 OpenStruct对象在您需要适合特定方法调用接口(interface)的东西时很有用(即发送响应#name和#的鸭子类型对象value),或者当你想封装实现细节,但又想避免过度设计解决方案时。它们还制作了一个很棒的stub对象,当我不需要stub/模拟的开销时,我经常使用它们代替框架stub。

ruby - 什么时候应该使用 Struct 与 OpenStruct?

一般来说,与Struct相比,使用OpenStruct有哪些优点和缺点?哪种类型的一般用例适合其中的每一个? 最佳答案 使用OpenStruct,您可以任意创建属性。另一方面,Struct必须在您创建它时定义其属性。选择哪一个应该主要取决于您以后是否需要能够添加属性。考虑它们的方式是将它们作为一方面的哈希和另一方面的类之间的光谱的中间地带。它们暗示了数据之间比Hash更具体的关系,但它们没有类那样的实例方法。例如,一个函数的一堆选项在哈希中是有意义的;他们只是松散地相关。函数所需的姓名、电子邮件和电话号码可以一起打包在Struct或

ruby - 从 OpenStruct Ruby 对象中提取值

我得到以下返回的Ruby对象(来自使用garbgem对GoogleAnalyticsAPI的查询,来自README.md中显示的示例调用,Exits.results(profile,:filters=>{:page_path.eql=>'/'}))>data.results=>[#]我想提取综合浏览量值(10440),但不知道该怎么做。我看到我的对象data.results是长度为1的array类,但data.first是OpenStruct类>具有看起来几乎相同的返回值:irb(main):140:0>data.results.class=>Arrayirb(main):141:0>