簡體   English   中英

Ruby 數據結構@?

[英]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}

任何有關文檔的幫助將不勝感激。

如果沒有 Kaom Te 在這里寫的訪問器方法https://stackoverflow.com/a/63623855/299774 ,那么像這樣使用instance_variable_get

output[:resource_title].instance_variable_get(:@hostname)

但! 當心! 有人沒有將此訪問器作為公共方法提供這一事實意味着他們想要封裝此數據。

因此,如果您正在為某個生產系統執行此操作 - 在下一次 gem 更新后您會驚訝地發現@hostname不再存在(名稱已更改),或者(更糟糕的是)它仍然存在但包含不同的數據。 這是一個內部實現細節,可能會發生變化。

另一方面,如果這個對象來自一個開源項目 - 制作一個 PR 並使其成為公共接口的一部分。

假設您提供的代碼示例是一個散列,並且將散列分配給變量output ,那么可能有兩種方法可以做到這一點,但每種方法都有問題。

首先,讓我們明確您正在嘗試讀取output[:resource_title] ,它是某個類的對象,該類的實例變量@hostname保存值example.com ,並且您想要某種方式來讀取該主機名價值。

output[:resource_title]是某個類的實例。 實例可以有實例變量,在這種情況下它有實例變量@hostname 可以直接在 Ruby 中讀取實例變量,但通常不鼓勵這樣做,因為如果作者希望用戶能夠讀取該值,那么作者會添加一個 getter 方法來允許讀取該值。

我們無法判斷那里是否有 getter 方法,因此最簡單的檢查方法就是嘗試訪問該方法:

output[:resource_title].hostname

如果這會引發類似NoMethodError: undefined method 'hostname'的錯誤,則沒有 getter 方法,您需要直接讀取實例變量。 盡管不鼓勵這樣做,但 Ruby 足夠靈活,可以很容易地做到:

output[:resource_title].instance_variable_get('@hostname')
=> "example.com"

假設數據在變量output並且在鍵 :resource_title 下的對象上有一個hostname訪問器方法,那么代碼將是:

output[:resource_title].hostname

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM