语法 MODULE::METHODNAME('string') 是如何工作的
How does the syntax MODULE::METHODNAME('string') work
我最近有理由使用 nokogiri gem 来解析 html 但是当我浏览他们的文档时,我遇到了这个我以前从未见过的 ruby 语法
html_doc = Nokogiri::HTML('<html><body><h1>Mr. Belvedere Fan Club</h1></body></html>')
xml_doc = Nokogiri::XML('<root><aliens><alien><name>Alf</name></alien></aliens></root>')
我感兴趣的部分是 Nokogiri::HTML('...')。这看起来很像方法调用,但我知道 ruby 方法名称不能是大写字母。所以我查看了代码文件 nokogiri gem,发现了以下定义
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
# more code
end
我尝试重现相同的代码
module How
class << self
def DOESTHISWORK
puts "In How Method"
end
end
end
How::DOESTHISWORK
但它一直返回错误 "uninitialized constant How::DOESTHISWORK (NameError)"。我知道这与以大写字母开头的方法名称有关,但我一直无法弄清楚它在 nokogiri 中的工作原理。
不同之处在于,在 Nokogiri 示例中,调用方法时使用括号和将其标识为方法调用的参数值。您的 DOESTHISWORK
方法不接受任何参数,但可以使用空括号调用,例如
irb(main):028:0> How::DOESTHISWORK()
In How Method
=> nil
如果您向您的方法添加一个参数,该参数也可以像这样将其识别为一种方法:
irb(main):036:0> How::DOESTHISWORK 'some param'
方法名称以小写字母开头是一种很好的做法,但并未强制执行。以大写字母开头的东西被假定为常量,并且将照此查找,这就是为什么需要括号或参数来指示正在引用的方法。另一个例子:
irb(main):051:0> def Example
irb(main):052:1> puts "An example!"
irb(main):053:1> end
=> nil
irb(main):054:0> Example
NameError: uninitialized constant Example
from (irb):54
from /Users/mike/.rbenv/versions/1.9.3-p194/bin/irb:12:in `<main>'
irb(main):055:0> Example()
An example!
=> nil
我还发现这个 post 非常有帮助
What are the restrictions for method names in Ruby?
It's good practice, while not mandatory, to start the method name with
a lower-case character, because names that start with capital letters
are constants in Ruby. It's still possible to use a constant name for
a method, but you won't be able to invoke it without parentheses,
because the interpeter will look-up for the name as a constant
我最近有理由使用 nokogiri gem 来解析 html 但是当我浏览他们的文档时,我遇到了这个我以前从未见过的 ruby 语法
html_doc = Nokogiri::HTML('<html><body><h1>Mr. Belvedere Fan Club</h1></body></html>')
xml_doc = Nokogiri::XML('<root><aliens><alien><name>Alf</name></alien></aliens></root>')
我感兴趣的部分是 Nokogiri::HTML('...')。这看起来很像方法调用,但我知道 ruby 方法名称不能是大写字母。所以我查看了代码文件 nokogiri gem,发现了以下定义
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
# more code
end
我尝试重现相同的代码
module How
class << self
def DOESTHISWORK
puts "In How Method"
end
end
end
How::DOESTHISWORK
但它一直返回错误 "uninitialized constant How::DOESTHISWORK (NameError)"。我知道这与以大写字母开头的方法名称有关,但我一直无法弄清楚它在 nokogiri 中的工作原理。
不同之处在于,在 Nokogiri 示例中,调用方法时使用括号和将其标识为方法调用的参数值。您的 DOESTHISWORK
方法不接受任何参数,但可以使用空括号调用,例如
irb(main):028:0> How::DOESTHISWORK()
In How Method
=> nil
如果您向您的方法添加一个参数,该参数也可以像这样将其识别为一种方法:
irb(main):036:0> How::DOESTHISWORK 'some param'
方法名称以小写字母开头是一种很好的做法,但并未强制执行。以大写字母开头的东西被假定为常量,并且将照此查找,这就是为什么需要括号或参数来指示正在引用的方法。另一个例子:
irb(main):051:0> def Example
irb(main):052:1> puts "An example!"
irb(main):053:1> end
=> nil
irb(main):054:0> Example
NameError: uninitialized constant Example
from (irb):54
from /Users/mike/.rbenv/versions/1.9.3-p194/bin/irb:12:in `<main>'
irb(main):055:0> Example()
An example!
=> nil
我还发现这个 post 非常有帮助
What are the restrictions for method names in Ruby?
It's good practice, while not mandatory, to start the method name with a lower-case character, because names that start with capital letters are constants in Ruby. It's still possible to use a constant name for a method, but you won't be able to invoke it without parentheses, because the interpeter will look-up for the name as a constant