我通过bin文件夹在本地运行我的程序;这只是一个小型的CLI项目。我试图剥离并将字符串推入数组。
这是我的代码:
require 'nokogiri'
require 'open-uri'
module BestPlaces
class Places
attr_accessor :name, :population, :places
def initialize
@places = []
end
def self.scrape_places
doc = Nokogiri::HTML(open("https://nomadlist.com/best-cities-to-live"))
places = doc.search("div.text h2.itemName")
ranks = doc.search("div.rank")
places.each{|e| @places << e.text.strip}
@places.each do |place|
i = @places.index(place)
puts "#{ranks[i].text}. #{place}"
end
end
end
class CLI
def list_places
puts "Welcome to the best places on Earth!"
BestPlaces::Places.scrape_places
end
def call
list_places
menu
goodbye
end
end
end
当我运行程序时,出现错误:
block in scrape_places': undefined method `<<' for nil:NilClass (NoMethodError)
非常感谢任何建议。
答案 0 :(得分:2)
简而言之:您获得undefined method '<<' for nil:NilClass
,因为您尝试操纵类实例变量 @places
,其值为nil
。
方法@places
中的第一个initialize
是一个对象实例变量,您将其值设置为[]
,但是类方法{{1}中的第二个@places
是一个类实例变量,你没有给它任何值,所以它默认为零。请注意两个变量不相同。由于您认为它们是相同的,因此您可能希望将self.scrape_places
更改为def self.scrape_places
,那么它们将是相同的对象实例变量。
另见: