我正在阅读《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
方法将其参数转换为整数。
例如Array
、Hash
、String
、Integer
、Float
、Rational
、Complex
等。
方法可以与类同名。所以Float
可以定义为像这样的内核方法
def Float(x)
x.to_f
end
作为这样的班级
class Float
end
当然,这不是 Ruby 中定义它们的方式,但您可以使用另一个类或方法执行此操作。这里有一篇关于此的文章,关于共享相同名称的方法、类和常量。这很有趣。您还会注意到Float
是内核的一种方法,因为您可以执行Kernel.Float(x)
。这实际上可以通过其他方法完成。例如,puts
可以像Kernel.puts(a_string)
一样调用