Ruby 数据结构@?

soa*_*ish 0 ruby data-structures

如何@hostname从这些数据中提取价值?例如做我期待的事puts output[:hostname]

{:status=>"passed",
 :code_desc=>"Host example.com port 80 proto tcp is expected to be reachable",
 :run_time=>0.207583,
 :start_time=>"2020-08-27T21:02:07+01:00",
 :resource_title=>
  #<#<Class:0x00007f87f71ebeb0>:0x00007f87f71eaf38
   @__backend_runner__=
    Inspec::Backend::Class @transport=Train::Transports::Local::Connection,
   @__resource_name__=:host,
   @host_provider=
    #<Inspec::Resources::DarwinHostProvider:0x00007f87f71e9a20
     @has_nc=true,
     @has_ncat=true,
     @has_net_redirections=true,
     @inspec=
      Inspec::Backend::Class @transport=Train::Transports::Local::Connection>,
   @hostname="example.com",
   @ip_cache=["93.184.216.34", "2606:2800:220:1:248:1893:25c8:1946"],
   @ping_cache=
    {:success=>true,
     :connection=>"Connection to example.com port 80 [tcp/http] succeeded!\n",
     :socket=>""},
   @port=80,
   @protocol="tcp",
   @resource_exception_message=nil,
   @resource_failed=false,
   @resource_skipped=false,
   @supports=[{:platform=>"unix"}, {:platform=>"windows"}]>,
 :expectation_message=>"is expected to be reachable",
 :waiver_data=>nil}
Run Code Online (Sandbox Code Playgroud)

任何有关文档的帮助将非常感激。

Grz*_*orz 6

如果 Kaom Te 没有在这里写的访问器方法/sf/answers/4453669881/,那么使用instance_variable_get如下:

output[:resource_title].instance_variable_get(:@hostname)
Run Code Online (Sandbox Code Playgroud)

但!当心!事实上,有人没有将此访问器作为公共方法提供,这意味着他们想要封装此数据。

因此,如果您正在为某些生产系统执行此操作 - 您可能会惊讶地发现,在下一次 gem 更新后,该gem@hostname已不再存在(名称已更改),或者(更糟糕)它仍然存在,但包含不同的数据。这是一个内部实现细节,可能会发生变化。

另一方面,如果该对象来自开源项目 - 制作 PR 并使其成为公共接口的一部分。