从书籍"Programming Ruby"了解浮动"method"



我正在阅读《Programming Ruby 1.9 & 2.0》一书。在第 44 页上有这个例子:

class BookInStock
  def inintialize(isbn, price)
    @isbn = isbn
    @price = Float(price)
  end
end

这本书解释说,Float是一种将某些东西变成浮点数的方法。但是方法名称不是以小写开头吗?然后我投资了使用 puts self.methods self的方法,我没有看到任何名为 Float 的方法,self.methods.grep /F/给出了一个空数组。那么这种方法从何而来。或者如果它是一个类,如何以这种方式使用类?

没有什么可以阻止您创建以大写字母开头的方法名称。Ruby 遇到这种情况时所做的是首先检查它是否可以在常量表(即类)中找到它,如果没有,它将检查它是否被定义为一个方法。

在此特定实例中,Float()Kernel模块中定义为一种工厂。对于您在 Ruby 中找到的所有基元类型都存在相同的便利方法,例如 Integer()Array()Hash()

引用

同一本书第8.1章的脚注:

如果方法名称以大写字母开头,则不会立即收到错误,但是当 Ruby 看到您调用该方法时,它可能会猜测它是一个常量,而不是方法调用,因此它可能会错误地解析调用。按照惯例,以大写字母开头的方法名称是 用于类型转换。例如,Integer 方法将其参数转换为整数。

例如ArrayHashStringIntegerFloatRationalComplex等。

方法可以与类同名。所以Float可以定义为像这样的内核方法

def Float(x)
    x.to_f
end

作为这样的班级

class Float
end

当然,这不是 Ruby 中定义它们的方式,但您可以使用另一个类或方法执行此操作。这里有一篇关于此的文章,关于共享相同名称的方法、类和常量。这很有趣。您还会注意到Float是内核的一种方法,因为您可以执行Kernel.Float(x)。这实际上可以通过其他方法完成。例如,puts可以像Kernel.puts(a_string)一样调用

最新更新