实例方法无法作用于实例变量
Instance method not able to act on instance variable
即使我需要 Nokogiri
并初始化变量,我的方法也无法访问 Nokogiri 方法。我想这样做:
class Requester
require 'nokogiri'
def initialize(body)
@body = body
end
def destination
@body.at_css('destination')
end
end
然后我传递 body
,这是一个 Nokogiri
文档。
mess = Requester.new(body)
当我这样做时,我得到一个 "No Method Error":
mess.destination
我不明白。我认为如果我 require
我的 class 将拥有所有 Nokogiri 方法。
完整错误在 at_css
上,看起来像:
NoMethodError (undefined method `at_css' for #<Requester:0x007f685d971478>
您混淆了 require
和 include
。
require
加载文件或 gem。
include
包含另一个对象的方法。
a.rb
:
module A
def hello
"hello world"
end
end
b.rb
:
require 'a'
class B
include A
end
puts B.new.hello # hello world
但是,您确实需要重新考虑您正在尝试做什么。您不能包含 class - 您扩展了 classes。而你要找的对象是 class Nokogiri::HTML::Document
.
如果您正在尝试构建文档爬虫,您可以使用委托人模式:
require 'nokogiri'
class Requester < Delegator
def initialize(body)
super
@body = body
@doc = Nokogiri::HTML(body)
end
def __getobj__
@doc
end
end
或者您可以创建 Nokogiri::HTML::Document
的子class。
即使我需要 Nokogiri
并初始化变量,我的方法也无法访问 Nokogiri 方法。我想这样做:
class Requester
require 'nokogiri'
def initialize(body)
@body = body
end
def destination
@body.at_css('destination')
end
end
然后我传递 body
,这是一个 Nokogiri
文档。
mess = Requester.new(body)
当我这样做时,我得到一个 "No Method Error":
mess.destination
我不明白。我认为如果我 require
我的 class 将拥有所有 Nokogiri 方法。
完整错误在 at_css
上,看起来像:
NoMethodError (undefined method `at_css' for #<Requester:0x007f685d971478>
您混淆了 require
和 include
。
require
加载文件或 gem。
include
包含另一个对象的方法。
a.rb
:
module A
def hello
"hello world"
end
end
b.rb
:
require 'a'
class B
include A
end
puts B.new.hello # hello world
但是,您确实需要重新考虑您正在尝试做什么。您不能包含 class - 您扩展了 classes。而你要找的对象是 class Nokogiri::HTML::Document
.
如果您正在尝试构建文档爬虫,您可以使用委托人模式:
require 'nokogiri'
class Requester < Delegator
def initialize(body)
super
@body = body
@doc = Nokogiri::HTML(body)
end
def __getobj__
@doc
end
end
或者您可以创建 Nokogiri::HTML::Document
的子class。