2014-02-20 46 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由于工作原因,我忘了补充,现在我刚刚添加了。谢谢你提醒我.. :-) –