2011-10-13 124 views

回答

149

我認爲您正在尋找instance_of?is_a?kind_of?將從派生類的實例返回true。

class X < String 
end 

foo = X.new 

foo.is_a? String   # true 
foo.kind_of? String  # true 
foo.instance_of? String # false 
foo.instance_of? X  # true 
+6

不知道問題的意圖,我認爲對於大多數現實世界的編程情況,「is_a?」實際上是更合適的用法(並且經常像安德魯格林提到的鴨式輸入檢查更好)。嚴格的類比較通常是一種代碼味道。 HTTP://en.wikipedia。org/wiki/Liskov_substitution_principle – mahemoff

16

你可以這樣做:

foo.instance_of?(String) 

而且更普遍的:

foo.kind_of?(String) 
+3

是什麼讓'kind_of'更普遍?它們似乎是同義詞:['is_a'](http://ruby-doc.org/docs/ProgrammingRuby/html/ref_c_object.html#Object.is_a_qm)。 – davidchambers

+2

@Davidchambers你說得對,'kind_of?'是'is_a?'的同義詞。 – steenslag

+0

@davidchambers:你說得對,我的意思是'instance_of?'而不是'is_a?'。 –

6
foo.instance_of? String 

foo.kind_of? String 

如果你O只有關心,如果它是從String derrived從它的繼承鏈的某處

24

更鴨打字的方法是說

foo.respond_to?(:to_str) 

to_str表明一個對象的類可能不是字符串的實際後裔,但對象本身是非常弦(弦?)。

+0

很酷。在這種情況下,我碰巧知道'foo'將會是'true','false'或香草串,但是學習更通用的解決方案是很好的。 – davidchambers

+0

在檢查對象是否響應之後,將它與to_s調用結合起來,並且爲自己創建了一個字符串! – seanmakesgames

+1

@seanmakesgames你的意思是'to_str'還是'to_s'?兩者略有不同。 –

2

除了其他答案,Class定義了方法===來測試一個對象是否是該類的一個實例。

  • o.class o類。
  • o.instance_of? c確定是否o.class == c
  • o.is_a? c o是c還是它的任何子類的實例?
  • o.kind_of? c * is_a *的同義詞*
  • c === o對於類或模塊,確定是否* o.is_a? C *(串=== 「S」返回true)
0

我認爲更好的辦法是創建一些謂詞的方法。 這也將節省您的「單點控制」。

class Object 
def is_string? 
    false 
end 
end 

class String 
def is_string? 
    true 
end 
end 

print "test".is_string? #=> true 
print 1.is_string?  #=> false 

更鴨打字的方式;)

+1

「string」.is_a?(String)'有什麼問題?看起來你正在重新發明輪子。還有'class','instance_of','kind_of'等等......不好意思去猴子修補Object類,更不用說它是不必要的。 – Mohamad

+0

我完全同意你的觀點:)如果你只關注primitve類型,並且你知道你的項目需求與原始類型相關的將永遠不會改變(確定它通常是這種情況;))你很好。但是在需求改變爲擁有「單一控制點」的情況下。例如在你的項目環境中,你有很多預先檢查(1000以上)。 'pre_check(「test」.is_string?)' 現在你的項目需求會改變,每個包含三個或更多字符的字符串不再被定義爲字符串(我知道它的不尋常;)) 現在你可以輕鬆地改變你自己的方法。 – schlegel11

相關問題