在Ruby中,`Float(...)`记录在哪里?

时间:2014-02-20 00:14:08

标签: ruby

在Ruby语言中,您可以像函数一样调用Float以获得稳健的方法,以确保参数是Float或可解析为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)。

我在哪里可以找到此功能的文档?

2 个答案:

答案 0 :(得分:6)

这里定义Kernel#Float。此功能是ruby提供的内置转换功能(由 Avdi Grimm 创造的术语)的一部分。

你真的,真的,想要将输入对象转换为核心类型,无论原始类型是什么。例如,你需要确保任何输入被强制转换为Integer,如果有的话这样做的合理方法 - 传入的数据是Float,nil还是十六进制字符串。自信代码,Avdi Grimm。

例如,使用Kernel#Array转换函数,想象一个占用0个,1个或更多帖子的方法。

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

这在使用不同输入调用方法时提供了一些灵活性:

 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

这一系列功能无疑可以创建灵活的API。

答案 1 :(得分:1)

在您的情况下,您的主要问题是您正在使用某种方法,但您没有实施该方法。每当遇到这种情况时,我都会使用Method#owner#inspect来查找已实现该方法的源类名。在这种特定情况下,这是一种强有力的方法。

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

然后我将ri用作ri 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