2016-01-10 56 views
-4

我想知道是否有任何ruby函數或方法來找出對象的類型(IntegerString,Symbol等)。在Ruby中查找對象類型的函數

+1

Like'1.class'? –

+0

@Yu Hao:我做了'y = x ** 0.5'然後'如果y.class == Fixnum返回true否則返回false end'並且我得到假的完美方塊 –

+3

@JohnDoe您能否問一下關於您的直接問題代碼,而不是問一個普遍的問題? –

回答

3

您所做的假設是,如果數學運算返回的值是整數,則該值的類將爲Fixnum。這是不正確的。

請看:

a = 5 
puts a.class 
# => Fixnum 

b = 5.0 
puts b.class 
# => Float 

數學上講,圖5和5.0是相同的數目,這個數字是一個整數。但Ruby中的5和5.0(與許多其他編程語言一樣)並不相同。一個是fixed-point值(ergo Fixnum),另一個是floating-point值(Float)。 Fixnum只能表示整數,但Float可以表示整數和分數(但是,我應該提及not all fractions)。

在Ruby中,當你做一個數學運算兩種Fixnums,一個Fixnum將返回:

a = 4 
puts a.class # => Fixnum 

x = a ** 2 
puts x  # => 16 
puts x.class # => Fixnum 

然而,如果其中一個號碼是浮動,則返回一個浮點數:

a = 4 

x = a ** 2.0 
puts x  # => 16.0 
puts x.class # => Float 

b = 4.0 
puts b.class # => Float 

y = b ** 2 
puts y  # => 16.0 
puts y.class # => Float 

y = b ** 2.0 
puts y  # => 16.0 
puts y.class # => Float 

你問如何「找到一個對象的類型」,並且該問題的答案是使用Object#class方法,如上所述。但是,正如你所看到的,「對象是一個Fixnum?」和「對象是整數嗎?」是兩個不同的問題。

如果你想知道的話,Ruby的一個數字是,即使它是一個浮動的整數,是指以優良的回答這個問題:Checking if a Float is equivalent to an integer value in Ruby

+0

'(4.0).integer?'returns' false' – Stefan

+0

@Stefan:你是對的。我已經更新了我的答案,並提供了關於該主題的鏈接。 –

+0

@Stefan簡而言之,Ruby中的整數和浮點數並不相同。如果你想用int + float做數學運算,你需要首先轉換它們中的一個。 – Kunok

3

你可以在對象

obj.class 

調用class method對於實例

:test_1.class => Symbol 

或者你也可以使用:instance_of? Method

puts 10.instance_of? Fixnum #=> True 
puts [1,2].instance_of? Array #=> True 

更多的信息你可以determining-type-of-an-object-in-ruby看到這個

希望這對你有幫助!

+0

我想找出一個變量'x'是否是一個整數,所以我把如果x.class ==整數 –

+0

是的! 'x = 1'; 'x.instance_of? Fixnum' =>'true'。 – VKatz

+0

如果你不明白這個fixnum業務:請注意,在Ruby中,一切都是一個對象,每個對象都是類的實例。所以就像整數是對象,他們的類是Fixnum。所以如果你寫'x.class',它會返回你的Fixnum值。如果你想做一些檢查,就像「放」它的號碼一樣!「如果x.class == Fixnum' – Kunok

0

關於你actual problem

我試圖找出輸入是否是一個完美的正方形。

def is_square(x) 
    y = x ** 0.5 
    if y.instance_of?(Fixnum) 
    return true 
    else 
    return false 
    end 
end 

我不斷收到false甚至完全平方

a ** b只返回一個Integer如果兩者ab是整數:

4 ** 1 #=> 4 

如果a和/或b是它將返回一個Float

4 ** 1.0 #=> 4.0 
4.0 ** 1 #=> 4.0 
4.0 ** 1.0 #=> 4.0 

而且,由於你的論點0.5Float,它會返回一個Float不管x

2 ** 0.5 #=> 1.4142135623730951 
4 ** 0.5 #=> 2.0 

因此,y.instance_of?(Fixnum)永遠不會成爲true

您可以將您的支票更改爲類似:

def perfect_square?(x) 
    y = (x ** 0.5).floor 
    y * y == x 
end 

perfect_square? 2 #=> false 
perfect_square? 4 #=> true 

它也可以,如果輸入的是Float

perfect_square? 2.0 #=> false 
perfect_square? 4.0 #=> true 
+0

上意識到這是雅這是問題 –

0

42Fixnum一個實例,FixnumNumeric一個子類。 4.2Float的實例,Float也是Numeric的子類。

42.kind_of? Numeric 
=> true 

(4.2).kind_of Numeric 
=> true