2014-02-20 44 views
3

在Ruby語言中,您可以調用Float類似函數的方式來確保參數是浮點型或字符串可解析爲浮點型(包括科學記數法等)。在Ruby中,「Float(...)」記錄在哪裏?

例如:

Float(1.0)  # => 1.0 
Float('1.0') # => 1.0 
Float('-1.23') # => -1.23 
Float('-1e+2') # => -100.0 

然而,Ruby的文檔似乎沒有在任何地方形容這種行爲(Float v2.1.0Float v1.9.3)。

我在哪裏可以找到該功能的文檔?

+0

您是否在尋找[這](http://www.ruby-doc.org/core- 2.1.0/Float.html)? –

+1

@JustinWood:不,我與之相關;我想知道'Float(...)'*函數*在哪裏被記錄。 – maerics

+1

在任何對象中,Ruby允許你有一個名字相同的方法和常量,試探性地確定上下文使用哪一個。例如,'Nokogiri :: XML'模塊與'Nokogiri.XML()'方法不同,儘管它們似乎在相同的命名位置發生衝突。 – Phrogz

回答

6

它在這裏定義爲Kernel#Float。此功能是由ruby提供的內置轉換功能(由Avdi Grimm創建)的一部分。

你確實真的想將輸入對象轉換爲核心類型,無論原始類型是什麼,例如,如果有任何合理的話,你需要確保任何輸入被強制轉換爲Integer這樣做的方式 - 輸入數據是否是浮點數,零或甚至十六進制字符串。自信代碼,Avdi格林。

例如,使用Kernel#Array轉換函數,設想一種方法,該方法需要0個,1個或多個帖子。

process_post("post1") 
process_post(["post1", "post2"]) 
process_post(nil) 

如果我們實現這一點沒有作用,我們可能需要做這樣的事情:

def process_post(post_or_post) 
    if post_or_post # now we have to check for nil 
     # we might have to check for instance of Array to make sure we can iterate now. 
     # etc.. 
    end 
end 

def process_post(post_or_posts) 
    posts = Array(post_or_posts) 
    posts.each do |post| 
     .... # do something post 
    end 
    end 

這個調用便隨着輸入的方法時提供一定的靈活性這一系列功能當然非常方便創建靈活的API。

+0

+1哦,我忘記了Kernel。但現在我對「Float」既是一個類又是一個函數感到困惑...... – maerics

+0

@maerics它是按上下文排序的。 – lurker

+0

@maerics我添加了一些示例用法的更多信息,也許這可以清除它一點。 – fmendez

1

在你的情況下,你的主要問題是你正在使用的方法,但你沒有實現它的地方。每當我遇到這種情況時,我使用Method#owner#inspect來找出已實施該方法的源類名稱。在這個特定情況下,這是一個強大的方法。

method(:Float).owner # => Kernel 
method(:Float).inspect # => "#<Method: Object(Kernel)#Float>" 

然後我用riri Kernel.Float在我的Konsole閱讀:

= Kernel.Float 

(from ruby site) 
------------------------------------------------------------------------------ 
    Float(arg) -> float 

------------------------------------------------------------------------------ 

Returns arg converted to a float. Numeric types are converted directly, 
the rest are converted using arg.to_f. As of Ruby 1.8, converting nil 
generates a TypeError. 

    Float(1)   #=> 1.0 
    Float("123.456") #=> 123.456 
+1

+1整潔,我以前沒見過! – maerics

+0

@maerics由於工作原因,我忘了補充,現在我剛剛添加了。謝謝你提醒我.. :-) –