今天我遇到了Ruby中的Pathname
类,并注意到你可以直接将类本身称为一个方法(它基本上会返回一个新实例):
Pathname("some/path")
# => #<Pathname:some/path>
我一直试图用我的CustomClass
复制同样的东西但是没有成功。我不知道这些方法被调用了什么,我找不到任何可以让我了解如何执行此操作的Ruby代码。 我的问题是如何使用类名作为方法?
到目前为止我尝试过的事情:
self.self()
self.class()
class << self
语法答案 0 :(得分:6)
这不是使用类本身。这是在Kernel
中调用与该类同名的方法。通常不鼓励自己这样做,因为你用新方法污染了几乎所有物体并导致混乱(正如你已经看到的那样)。
答案 1 :(得分:3)
您正在寻找的是转换方法,以强制输入该类实例。
它不是类本身的方法,而是Kernel
模块中的方法。因此,为了能够使用MyClass(value)
的形式,您应该将方法添加到Kernel
模块:
module Kernel
def Foo(value)
# you can implement any logic here
value.is_a?(Foo) ? value : Foo.new(value)
end
module_function :Foo
end
class Foo
def initialize(bar)
@bar = bar
end
end
baz = Foo('bar')
#=> #<Foo:0x007fd4e5070370 @bar="bar">
Foo(baz)
#=> #<Foo:0x007fd4e5070370 @bar="bar">
baz == Foo(baz)
#=> true
答案 2 :(得分:1)
这不是课堂电话,而是快捷方式。最棘手的部分 - 它被定义为Kernel
模块在您指定的表单中随处可用。
请转到official docs的链接。在那里,您可以看到,需要Pathname
模块,它扩展Kernel
模块以添加相同名称的方法。
说实话,我强烈建议您不要使用自己的方法扩展Kernel
。或者至少使用refinements