使用类作为方法

时间:2019-03-14 17:03:33

标签: ruby

我喜欢如何使用URI类的名称实例化URI对象:

uri = URI('https://www.example.com')

非常简洁明了。你怎么做到的?

例如,假设我有一个模块:

module MyModule
   def self.mymethod()
   end
end

MyModule.mymethod是模块中唯一的方法。烦人的是,每当我想要该方法时,我都必须键入:

MyModule.mymethod()

它可以工作,但是似乎多余……这是模块中的唯一方法。有一种方法只需要调用MyModule吗?

MyModule.mymethod()

3 个答案:

答案 0 :(得分:5)

如果您仔细查看源代码,您将find this

module Kernel

  #
  # Returns +uri+ converted to an URI object.
  #
  def URI(uri)
    # ...
  end
  module_function :URI
end

也许会让您失望,但是如果您执行URI('https://www.example.com'),则只需调用从内核继承的方法即可。

答案 1 :(得分:2)

在您的示例中,URI只是一个名为URI的方法。正如idmean在他们的答案中所显示的那样,它在内核中定义为module_function,使其可以在任何地方使用,并且这样做的理由可能很充分,但是将其定义为主要作用域中的普通方法将可以完成大致相同的事情:

def MyModule
  puts "Called MyModule"
end

MyModule()
# => Called MyModule

查看有关repl.it的实际操作:https://repl.it/@jrunning/SnowHauntingLevels

答案 2 :(得分:0)

如果您选择括号而不是括号,则可以执行以下操作。

class Module
  def [](*args, &block)
    public_send(methods.first, *args, &block)
  end
end

module A
  def self.a
    "Called A"
  end
end

A[]
  #=> "Called A"

module B
  def self.b(n)
    yield(n)
  end
end

B[9] { |n| "Cats have #{n} lives." }
  #=> "Cats have 9 lives."