Errore di conversione


#1

Ciao ragazzi,ho un problema…io ho una frase memorizzara in un array:

result=(Application as TApacheTwoApplication).ProcessRequest

a me interessa l’ “as”,cioè vorrei sapere a che elemento dell’array
corrisponde quella parola,e ho fatto cosi:

if /as/ =~ primariga.to_s
as=primariga.index “as”
puts primariga[as]
end
dove in primariga vi è memorizzata tutta la frase.Successivamente ho
fatto un index in primariga,dandomi come risultato 1 (il che è corretto
in quanto si “as” si trova nell’elemento 1 dell’array).Tuttavia il mio
problema è quando faccio il puts che mi da un errore di conversione da
nil a integer.Cosa sbaglio e come posso risolverlo???


#2

2009/2/27 Stefano De nigris removed_email_address@domain.invalid:

Ciao ragazzi,ho un problema…io ho una frase memorizzara in un array:

result=(Application as TApacheTwoApplication).ProcessRequest

a me interessa l’ “as”,cioè vorrei sapere a che elemento dell’array
corrisponde quella parola,e ho fatto cosi:

if /as/ =~ primariga.to_s

cosa è primariga? parli di frase memorizzata in un array. che vuol dire?

vuol dire questo?

[‘result=(Application as TApacheTwoApplication).ProcessRequest’]

se è così, stiamo cercando la regexp /as/ dentro

‘result=(Application as TApacheTwoApplication).ProcessRequest’

cioè primariga.to_s.

nota: /as/ cerca una a seguita da una s, come in casa. forse cerchi
/\bas\b/ (\b è delimitatore di parola, word delimiter)?

as=primariga.index “as”

ecco, qui è necessario capire cos’è primariga. se è quello che ho
scritto io sopra, primariga.index[‘as’] vale nil, perché non c’è un
elemento ‘as’ nell’array.

puts primariga[as]

ecco, se primariga è un array, e as vale nil, primariga[as] dà
esattamente quell’errore
lì.
ma d’altronde: una volta che fai la ricerca di as, perché fai di nuovo
la ricerca di as?

basterebbe:

if as = /\bas\b/ =~ primariga.to_s
puts as
end

o peggio:

puts as if as = /\bas\b/ =~ primariga.to_s

naturalmente continuo a non sapere com’è fatto primariga, quindi
chissà.
l’unica cosa certa è che l’array primariga non contiene l’elemento ‘as’.

pietro


#3

cosa � primariga? parli di frase memorizzata in un array. che vuol dire?

vuol dire questo?

[‘result=(Application as TApacheTwoApplication).ProcessRequest’]
Si è questo,scusa se non sono abbastanza chiaro ma è colpa del mio
italiano.

se � cos�, stiamo cercando la regexp /as/ dentro
‘result=(Application as TApacheTwoApplication).ProcessRequest’
cio� primariga.to_s.
Infatti sto cercando “as” dentro a primariga.

nota: /as/ cerca una a seguita da una s, come in casa. forse cerchi
/\bas\b/ (\b � delimitatore di parola, word delimiter)?
Se faccio cosi lui mi cercherà solo le parole fatte da “as”???

ecco, qui � necessario capire cos’� primariga. se � quello che ho
scritto io sopra, primariga.index[‘as’] vale nil, perch� non c’� un
elemento ‘as’ nell’array.
Scusa perche non c’è questo elemento???Quando faccio partire il
programma l’if viene eseguito,quindi significa che lo trova “as”.

ma d’altronde: una volta che fai la ricerca di as, perch� fai di nuovo
la ricerca di as?
basterebbe:
if as = /\bas\b/ =~ primariga.to_s
puts as
end
Ma se faccio cosi l’if posso fare poi: puts primariga[as]???

Ciao a tutti!!!


#4

Il 2 marzo 2009 15.56, Stefano De nigris removed_email_address@domain.invalid ha
scritto:

/\bas\b/ (\b � delimitatore di parola, word delimiter)?
Se faccio cosi lui mi cercherà solo le parole fatte da “as”???

esattamente, troverà “Application as blabla”, ma non “ananas assale
casa”.

Scusa perche non c’è questo elemento???Quando faccio partire il
programma l’if viene eseguito,quindi significa che lo trova “as”.

tu lavori su due oggetti completamente diversi: uno è primariga, che è
un array di lunghezza 1, l’altro è una stringa.

ad esempio, 1 e [1] sono diversi, non hanno assolutamente niente in
comune; tanto per dire: 1 + 1 fa 2, [1] + [1] fa [1, 1].

ma d’altronde: una volta che fai la ricerca di as, perch� fai di nuovo
la ricerca di as?
basterebbe:
if as = /\bas\b/ =~ primariga.to_s
puts as
end
Ma se faccio cosi l’if posso fare poi: puts primariga[as]???

no, o meglio: non ha senso, perché primariga è un array con un solo
elemento, quindi solo primariga[0] è definito.

ma è inutile eseguire più volte il metodo to_s sullo stesso oggetto, e
d’altronde è un modo brutto di procedere.

la cosa più semplice è che assegni primariga[0] a qualche variabile, che
so:

riga = primariga[0]

ora riga contiene una stringa, quindi puoi fare:

if as = /\bas\b/ =~ riga
puts riga[as]
end

nota però che il risultato sarà deludente: verrà stampato
97

questo perché riga è una stringa, ma riga[as] è un carattere, e
precisamente il carattere che si trova alla posizione in cui inizia
“as”, ovvero è la lettera a, ovvero il carattere 97.

puoi vederlo eseguendo, in irb:

97.chr

spero di essere stato d’aiuto.

p.s. continuo a sostenere che con le regular expression non è
possibile scrivere un parser degno di questo nome, tanto per dire, non
è possibile controllare il bilanciamento delle parentesi; però, se lo
scopo è solo didattico, senza dubbio è un ottimo esercizio.

pietro


#5

Pietro io ho fatto cosi:

if/\bas\b/ =~ primariga.join(" ") perche se facevo senza il join non
funziona
l’if.In questo modo ho diviso la frase quando c’è uno stapio vuoto
giusto??

Poi dentro l’if ho fatto come hai detto tu:

riga = primariga[0]
ma mi viene stampato solo result=(Application questo perche mi sono
dimenticato di dirti che quando ho creato primariga cosi:

primariga=arr[valore].split(/\s/)
dove arr è un array in cui ci sono memorizzate tutte le frasi che devono
essere tradotte,mentre valore è una variabile che viene incrementata di
volta in volta, in modo tale che in primariga viene memorizzata una
frase per volta, chiaro???
Quindi alla fine mi serve trovare l’elemento “as” che è l’elemento
primariga[1], infatti se faccio il puts di questo elemento mi viene
visualizzato “as”.Essendo che as non si trovera sempre allo stesso
elemento ho usato l’istruzione index,in modo tale che mi trova la parola
in questione:

as=primariga.index"as"

Comunque ora se faccio puts primariga[as] funziona,perche???Io ho solo
modificato l’if come ti ho scritto prima.
Un’altra cosa ma in ruby esiste l’overload e override.Grazie ancora.Ciao