如何定义像Array(arg)和String(arg)这样的快捷方式?

d11*_*wtq 2 ruby

如果是ArrayString类定义,这些东西是如何定义的?

def whatever(some_input)
  some_input = Array(some_input)
end
Run Code Online (Sandbox Code Playgroud)

如何调用它?我们可以将此行为添加到我们自己的类中,还是仅适用于核心类?

mu *_*ort 5

它们实际上是内核上的方法:

>> Kernel.methods.select { |m| m =~ /^[A-Z]/ }
=> [:Array, :Complex, :Float, :Integer, :Rational, :String, :URI]
Run Code Online (Sandbox Code Playgroud)

Object包含内核,所以这些方法随处可用.您可以创建名称以大写字母开头的方法,但这并不常见.

NokogiriNokogiri::HTMLNokogiri::XML构造函数做类似的事情.例如,在Nokogiri你会发现:

module Nokogiri
  class << self
    ###   
    # Parse HTML.  Convenience method for Nokogiri::HTML::Document.parse
    def HTML thing, url = nil, encoding = nil, options = XML::ParseOptions::DEFAULT_HTML, &block
      Nokogiri::HTML::Document.parse(thing, url, encoding, options, &block)
    end
  end  
  #...
end
Run Code Online (Sandbox Code Playgroud)

所以HTML只是一个非标准名称的标准方法.