2015-11-07 45 views
0

比方說一個物體上,我們有兩大類:如何檢查鍵/方法可以是哈希以及其他類

class Test 
end 

class Test2 
    def a 
    end 
end 

,並說我們有一個變量var可以指向的對象這些類或哈希,所以:

var = Test.new 

var = Test1.new 

var = {"a" => 1} 

現在我們需要確保我們在'var'上調用'a',只要它允許(即,如果它指向測試,則不應調用它)。 所以,如果我做的:

var.a 

它給出了一個錯誤的情況下,無功點,測試對象。有什麼辦法可以防止錯誤? (?除了做.is_a測試任何其他解決辦法)

回答

1

你可以使用respond_to?來檢查,如果你可以調用對象的方法:

var.a if var.respond_to? :a 
+0

但這不會工作,如果var是散列,是正確的? –

+0

如果使用[OpenStruct](http://ruby-doc.org/stdlib-2.0.0/libdoc/ostruct/rdoc/OpenStruct.html),它將工作。如果沒有,你需要檢查一下密鑰是否出現在'var.key?('a')' –

+0

那麼,那麼同樣的問題:)。做respond_to? .key會不會爲散列工作.key?將會給Test類帶來錯誤。任何我們可以處理的方式? –

0

您可以從錯誤施救,並返回默認值,像這樣

result = var.a rescue "" 

這裏空字符串作爲默認用於說明目的,你可以選擇一個合理的默認爲您的情況

1

奇怪的問題導致討厭的答案。但至少它的工作:

def a(test) 
    (test.respond_to?(:a) ? test.a : nil) || 
    (test.respond_to?('has_key?') && test.has_key?('a') ? test['a'] : nil) 
end 
相關問題