Metodo non riconosciuto

salve lista non vorrei disturbarvi ma non riesco proprio a capire per
quale motivo non riesco a iterare nella mia classe il codice è questo:

class JPages < Array

def self.generate(domain, link = ‘’)
self.push(JPage.new(domain)) if link != ‘’
self.each do |e|
e.list.each do |t|
self.push(JPage.new(t)) if in_domain?(domain,t)
end
self.sort!.uniq
end
end

end

sicuramente ci saranno un sacco di errori ma eseguendo i test che ho
scritto si blocca e mi ritorna

NoMethodError: undefined method `each’ for JPages:Class

ovviamente o la classe JPage nello stesso file

da premettere che ho da poco ricominciato a programmare, vorrei
capire perchè non riconosce il metodo each visto che lo eredita da
Array.

grazie per le eventuali risposte.

luca sabato

nope — the [nomad code]

  self.sort!.uniq
end

end

end

sicuramente ci saranno un sacco di errori ma eseguendo i test che ho
scritto si blocca e mi ritorna

Mi servirebbe qualche info in
più.Primo in che modo chiami la classe e secondo che cosa vorresti ottenere.

Poi vedo se riesco ad aiutarti :slight_smile:

require “net/http”
require “uri”

class JNui

class JPage

attr_accessor :url, :body, :list
include Comparable

def <=>(other)
self.url.to_s <=> other.url.to_s
end

crea una nuova istanza di JPage con un url o un oggetto URI

def initialize(url)
@url = url.class == URI ? url : JLink.uri(url)
@body = JLink.get_page
@list = JLink.get_links(@url)
end

end

class JPages < Array

def self.generate(domain, link = ‘’)
self.push(JPage.new(domain)) if link != ‘’
self.each do |e| #FIXME non riconosce il metodo each perchè???
boh!!!
e.list.each do |t|
self.push(JPage.new(t)) if in_domain?(domain,t)
end
self.sort!.uniq
end
end

end

class JSite
attr_accessor :base_url, :pages

def initialize(base_url)
@base_url = JLink.host(base_url)
@pages = [] #JPages.generate(@base_url) #FIXME modificare il
metodo generate
end

def stampa
puts “base url: #{@base_url}”
puts “pages: #{@pages.to_s}”
end

end

module JLink

def self.uri(uri)
return URI.parse(uri)
end

def self.host(uri)
return uri(uri).host
end

def self.get_page(uri)
return Http.get_response(uri).body
end
#alias_method :page, :get_page

def self.get_links(body, type = /http/)
return Uri.extract(body, type).sort!.uniq
end
#alias_method :links, :get_links

def self.in_domain?(domain, uri)
return uri.host == domain
end
end

end

questo è tutto il file ci saranno una marea di errori, ma sono alle
prime armi e quindi scusatemi :slight_smile:

luca sabato

nope — the [nomad code]
email: [email protected]
pensieri: http://sabatia.it

Il giorno 02/set/08, alle ore 22:15, Luca M. ha scritto:

invece each e’ un metodo di istanza di JPages (ereditato da Array) ma
qui (i.e. dentro a generate) “self” e’ la classe JPages e non una
istanza di JPages per questo non lo trova (non c’e’ :wink: )

grazie per la risposta ma non ho capito la soluzione al problema??? e
poi ho un altra domanda perchè “push” me lo fa utilizzare ed “each” no?
penso di aver capito il problema, vediamo cosa riesco fare. :slight_smile:

luca sabato

nope — the [nomad code]
email: [email protected]
pensieri: http://sabatia.it

Perché invece di definire un metodo generate (che mi pare un
costruttore) non ridefinisci la new di JPages così:

def self.initialize(domain, link = “”)

il codice di generate

end

e poi lo chiami con @pages = JPages.new(@base_url) ?
A questo punto i self si comporteranno come ti attendi e sia il push che
l’each dovrebbero funzionare.

Fai attenzione però a che la new() con un argomento vada davvero a
finire sull’inizialize con l’argomento opzionale che ho suggerito.
Potrebbe andare in conflitto con i vari costruttori di Array

Array.new(size=0, obj=nil)
Array.new(array)
Array.new(size) {|index| block }

anche se quello di JPages dovrebbe aver la precedenza.

On Tue, Sep 2, 2008 at 8:35 PM, luca sabato [email protected] wrote:

class JPages < Array

def self.generate(domain, link = ‘’)

definito cosi generate e’ un metodo di classe di JPages

self.push(JPage.new(domain)) if link != ''
self.each do |e|

invece each e’ un metodo di istanza di JPages (ereditato da Array) ma
qui (i.e. dentro a generate) “self” e’ la classe JPages e non una
istanza di JPages per questo non lo trova (non c’e’ :wink: )

  e.list.each do |t|
    self.push(JPage.new(t)) if in_domain?(domain,t)
  end
  self.sort!.uniq
end

end

end

ciao,
Luca

Il giorno 03/set/08, alle ore 16:33, Paolo M. ha scritto:

Fai attenzione però a che la new() con un argomento vada davvero a
finire sull’inizialize con l’argomento opzionale che ho suggerito.
Potrebbe andare in conflitto con i vari costruttori di Array

Array.new(size=0, obj=nil)
Array.new(array)
Array.new(size) {|index| block }

anche se quello di JPages dovrebbe aver la precedenza.

avevo già provato in questo modo e mi ritorna questo errore

TypeError: no implicit conversion from nil to integer

in pratica non da precedenza al metodo di JPages ma ad Array.new(size)

anche se forzo la chiamata con
JPages.new(@base_url, ‘’)

un altro problema che ho riscontrato e che il metodo JLink::host mi
ritorna sempre un oggetto nil

ho fatto le prove su irb e tutto funge, ma se lo richiamo da
programma, o test no
ho provato a cambiare il metodo get_response con Net.HTTP.get e
get_print ma mi ritorna sempre un oggetto nil

non capisco il motivo, di per se il programmino è molto sutpido ma
non vuole proprio funzionare.

ogni soluzione alternativa è ben accetta, cosi almeno mi mostrate
come si programma bene in ruby :slight_smile:

buona programmazione.
grazie comunque per le risposte :smiley:

luca sabato

nope — the [nomad code]
email: [email protected]

luca sabato wrote:

avevo già provato in questo modo e mi ritorna questo errore
[…]

Fai allora questo tentativo.

def self.generate(domain, link = “”)

jpages = JPages.new
jpages.push(JPage.new(domain)) if link != ‘’
jpages.each do |e|

end
return jpages

end

un altro problema che ho riscontrato e che il metodo JLink::host mi
ritorna sempre un oggetto nil

ho fatto le prove su irb e tutto funge, ma se lo richiamo da
programma, o test no
ho provato a cambiare il metodo get_response con Net.HTTP.get e
get_print ma mi ritorna sempre un oggetto nil

Non saprei, bisognerebbe mettersi a debuggare per bene il programma. Ma
come viene chiamato questo script?

Paolo

grazie mille paolo il tuo consiglio è stato una rivelazione, il mio
script continua a non funzionare però ho fatto un passo avanti :smiley:
adesso ho aggiunto altri test e mi da nuovi errori
ti posto la classe e i test così vediamo se riesci ad indicarmi una
via, ovviamente se vuoi :wink:

classe

class JNui

require “net/http”
require “uri”

class JPage

attr_accessor :url, :body, :list
include Comparable

def <=>(other)
self.url.to_s <=> other.url.to_s
end

crea una nuova istanza di JPage con un url o un oggetto URI

def initialize(url)
@url = url.class == URI.class ? url : JLink.uri(url)
@body = JLink.get_page(@url)
@list = JLink.get_links(@url)
end

#metodo di ausilio per i test
def to_s
return "url: #{@url} "
end

end

class JPages < Array

def self.generate(domain, link = ‘’)
jpages = JPages.new
jpages.push(JPage.new(domain)) if link != ‘’
jpages.each do |e|
e.list.each do |t|
jpages.push(JPage.new(t)) if in_domain?(domain,t)
end
self.sort!.uniq
end
return jpages
end

#metodo di ausilio
def to_s
list = “”
self.each { |e| list += e.to_s }
return list
end

end

class JSite
attr_accessor :base_url, :pages

def initialize(base_url = ‘’)
@base_url = JLink.host(base_url)
@pages = JPages.generate(@base_url, ‘’)
end

#questo metodo serve oslo per ispezionare e di ausilio per i test
def stampa
puts “\nbase url: #{@base_url.class}”
puts “pages class: #{@pages.class}”
puts “pages: #{@pages.to_s}”
puts “pages stampa prima pagina: #{@pages[0].to_s}”
end

end

module JLink

def self.uri(uri)
return URI.parse(uri)
end

def self.host(url)
return URI.parse(url).host
end

def self.get_page(uri)
return Net::HTTP.get_response(uri)
end
#alias_method :page, :get_page

def self.get_links(body, type = /http/)
return URI.extract(body, type).sort!.uniq #FIXME genera un
errore no method
end
#alias_method :links, :get_links

def self.in_domain?(domain, uri)
return uri.host == domain
end
end

end

test, molto semplici

require “test/unit”

require “lib/jnui”

class Test_Jnui < Test::Unit::TestCase
def setup
@js = JNui::JSite.new(‘http://www.google.it’)
@jp = JNui::JPage.new(‘http://www.google.it’)
@jps = JNui::JPages.new.generate(‘http//www.google.it’)
end

def test_jsite
assert(JNui::JSite.new(‘http://www.google.it’), “Classe non
inizializzata.”)
assert_equal(JNui::JSite, @js.class)
end

def test_stampa
@js.stampa
end

def test_Jpage
assert(JNui::JPage.new(‘http://www.google.it’), “jpage non funge.”)
end

def test_jlink
uri = JNui::JLink.uri(“http://www.google.it”)
p uri
assert(uri, “Failure message.”)
end

end

grazie comunque per i consigli :wink:

luca sabato

nope — the [nomad code]
email: [email protected]

ho risolto da solo il problema :slight_smile:

def self.get_page(uri)
return Net::HTTP.get_response(uri).body
end

:smiley:

luca sabato

nope — the [nomad code]
email: [email protected]
pensieri: http://sabatia.it