我喜欢如何使用URI类的名称实例化URI对象:
uri = URI('https://www.example.com')
非常简洁明了。你怎么做到的?
例如,假设我有一个模块:
module MyModule
def self.mymethod()
end
end
MyModule.mymethod是模块中唯一的方法。烦人的是,每当我想要该方法时,我都必须键入:
MyModule.mymethod()
它可以工作,但是似乎多余……这是模块中的唯一方法。有一种方法只需要调用MyModule吗?
MyModule.mymethod()
答案 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."