使用Class本身作为方法

时间:2016-12-19 06:55:38

标签: ruby

今天我遇到了Ruby中的Pathname类,并注意到你可以直接将类本身称为一个方法(它基本上会返回一个新实例):

Pathname("some/path")
# => #<Pathname:some/path>

我一直试图用我的CustomClass复制同样的东西但是没有成功。我不知道这些方法被调用了什么,我找不到任何可以让我了解如何执行此操作的Ruby代码。 我的问题是如何使用类名作为方法?

到目前为止我尝试过的事情:

  • 定义self.self()
  • 定义self.class()
  • 使用class << self语法
  • 谷歌搜索 - 但它只返回类方法与实例方法的比较

3 个答案:

答案 0 :(得分:6)

这不是使用类本身。这是在Kernel中调用与该类同名的方法。通常不鼓励自己这样做,因为你用新方法污染了几乎所有物体并导致混乱(正如你已经看到的那样)。

Here是该方法的文档。其他一些内容包括ArrayHashStringetc

答案 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