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

时间:2011-10-08 06:21:14

标签: ruby

如果ArrayString是类定义,那么这些内容是如何定义的?

def whatever(some_input)
  some_input = Array(some_input)
end

如何调用它?我们可以将这种行为添加到我们自己的类中,还是只针对核心类?

2 个答案:

答案 0 :(得分:5)

它们实际上是Kernel上的方法:

>> Kernel.methods.select { |m| m =~ /^[A-Z]/ }
=> [:Array, :Complex, :Float, :Integer, :Rational, :String, :URI]

Object includes Kernel所以这些方法随处可见。您可以创建名称以大写字母开头的方法,但这并不常见。

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

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

答案 1 :(得分:1)

您可以通过Array(arg)

显示将defined?定义为方法的一种方法
defined?(Integer()) # => "method"