2014-01-27 3 views
1

Я пытаюсь написать класс «web» в Ruby 2.0.0, который наследуется от GEXF :: Graph, но я не могу заставить методы Graph, такие как Web.define_node_attribute, работать. Я новый программист на рубине, поэтому я ожидаю, что я делаю что-то глупое. Благодарю.Ruby наследует класс модуля не работает

webrun.rb

require 'rubygems' 
require 'gexf' 
require 'anemone' 
require 'mechanize' 
require_relative 'web' 

web = Web.new 
web.define_node_attribute(:url) 
web.define_node_attribute(:links,  
          :type => GEXF::Attribute::BOOLEAN, 
          :default => true) 

web.rb

require 'rubygems' 
require 'gexf' 
require 'anemone' 
require 'mechanize' 

class Web < GEXF::Graph 

    attr_accessor :root 
    attr_accessor :pages 

    def initialize 
    @pages = Array.new 
    end 

    def pages 
    @pages 
    end 

    def add page 
    @pages << page 
    end 

    def parse uri, protocol = 'http:', domain = 'localhost', file = 'index.html' 
    u = uri.split('/') 
    if n = /^(https?:)/.match(u[0]) 
     protocol = n[0] 
     u.shift() 
    end 
    if u[0] == '' 
     u.shift() 
    end 
    if n = /([\w\.]+\.(org|com|net))/.match(u[0]) 
     domain = n[0] 
     u.shift() 
    end 
    if n = /(.*\.(html?|gif))/.match(u[-1]) 
     file = n[0] 
     u.pop() 
    end 
    cnt = 0 
    while u[cnt] == '..' do 
     cnt = cnt + 1 
     u.shift() 
    end 
    while cnt > 0 do 
     cnt = cnt - 1 
     u.shift() 
    end 
    directory = '/'+u.join('/') 
    puts "protocol: " + protocol + " domain: " + domain + \ 
     " directory: " + directory + " file: " + file 
    protocol + "//" + domain + directory + (directory[-1] == '/' ? '/' : '') + file  
    end 

    def crawl 
    Anemone.crawl(@root) do |anemone| 
     anemone.on_every_page do |sitepage| 
     add sitepage 
     end 
    end 
    end  

    def save file  
    f = File.open(file, mode = "w") 
    f.write(to_xml) 
    f.close() 
    end 

end 
+0

Ну, в коде, который вы поделили, у вас нет определенного класса 'Web', так что это первая проблема, если вы не определили ее и не включил его в свой код. –

+0

Извините, да, я определил класс Web и каждый раз, как я знаю, стараюсь, чтобы он работал. –

+0

показать код, я не вижу проблемы –

ответ

1

Вопрос заключается в том, что вы обезьяна-латание метод GEXF::Graph инициализации без вызова супер на нем. То, что вы сделали, было по существу «переписыванием» метода инициализации, который нужно было назвать. Чтобы исправить это, измените метод инициализации, чтобы сначала вызвать метод супер:

+1

Спасибо! Код работает сейчас. –

Смежные вопросы