实例方法无法作用于实例变量

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>

您混淆了 requireinclude

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。