2016-02-09 48 views
-1

如何在函數定義中聲明變量類型?在函數聲明中定義變量類型Ruby

在下面的代碼:

def f(a, b) 
#... 
end 

我可以用什麼類型,它的工作原理算了。我如何聲明它是一個fixnum?謝謝

+0

Ruby有弱輸入。變量在實例化時的確具有類類型,但您可以自由地將它們重新分配給另一個變量類型。只有存儲這些信息的方法在你的函數的文檔中。 –

回答

-1

查看評論和其他答案,澄清什麼是真正的「類型」。

如何測試一個「變量的類型」(Ruby中的每一個變量引用一個對象,我們不談論類型,但類)

如何測試一類:

variable = MyClass.new 
variable.class # => "MyClass" 
variable.is_a?(MyClass) # => true 

但通常在Ruby中,我們更感興趣的是哪些對象可以做什麼,我們可以與他們無關:

if variable.respond_to?(increment) 
    variable.increment 
else 
    raise "Error : must provide as 'variable' an object that can increment itself" 
end 

現在回答你的問題,我會在福中「聲明」的行爲nction定義/使用RDoc的語法意見

# Description of f 
# Params: 
# +a+:: command line string to be executed by the system 
# +b+:: +Proc+ object that .... 
def f(a, b) 
    # code 
end 
+0

這將*不*告訴你一個「變量的類型」。它將成爲* object *的* class *。 –

+0

@JörgWMittag然後請告訴我對象的類和「變量類型」之間的區別。 在Ruby中,我們操作的所有變量實際上都是「類」,因此談論「類型」是沒有意義的。這或我不理解OP的問題。 –

+0

類不是類型。 *協議*是類型。 *任何說出正確協議的對象都屬於同一類型。在Ruby中沒有相應的類或混入的知名協議的一些例子是我將稱爲** Appendable **協議(由一個名爲'<<'的方法組成,該方法將它的參數附加到它的接收器)或者** Iterable **協議(由一個名爲'each'的方法組成,它依次產生每個接收者的元素)。 [注:我編了這些名字。實際上,這些協議在Ruby文化中如此根深蒂固,甚至連名字都沒有。] –

1

有你的問題的困惑兩點:

  1. 變量沒有類型Ruby的。只有物體可以。
  2. Fixnum不是一個類型,它是一個類。類不是類型。 協議是類型。 任何說出正確協議的對象是相同類型的。在Ruby中沒有相應類或混入的熟知協議的一些示例是我將稱爲可附加協議(由名爲<<的方法組成,其方法名稱將其參數附加到其接收器)或可協議的協議(由名爲each的方法組成,其中yield是其每個接收器的元素)。 [注:我編了這些名字。在現實中,這些協議是如此之深在Ruby中文化根深蒂固,他們甚至沒有名字。]

一般情況下,你會描述的文檔中的協議(S)的方法,從它的參數預計方法,但有時這個描述被省略,如果例如從方法名稱或參數名稱中可以明顯看出。