# String to complex object

**URL:** <https://www.ruby-forum.com/t/string-to-complex-object/194904>\
**Category:** IT\
**Created:** [September 13, 2010, 2:12pm UTC](https://www.ruby-forum.com/t/string-to-complex-object/194904 "2010-09-13T14:12:13Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![alesc](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/f19dbf/32.png) [@alesc](https://www.ruby-forum.com/u/alesc)\
**Post date:** [September 13, 2010, 2:12pm UTC](https://www.ruby-forum.com/t/string-to-complex-object/194904/1 "2010-09-13T14:12:13Z")

</div>

ciao!

ho una serie di string ad esempio:

field\_list[:Company][:business\_name]=true  
field\_list[:Company][:email]=true  
field\_list[:Company][:website]=true  
field\_list[:Company][:fiscal\_code]=true  
field\_list[:Company][:vat\_code]=true  
field\_list[:Company][:Address][:street]=true  
field\_list[:Company][:Address][:number]=true  
field\_list[:Company][:Address][:town]=true  
field\_list[:Company][:PhoneNumber][:PhoneType][:value]=true  
field\_list[:Company][:PhoneNumber][:number]=true

(non sono statement sono proprio stringhe)

devo autogenerare la struttura che diverrÃ quindi del tipo

{  
:Company=\> {:fiscal\_code=\>true,  
:PhoneNumber=\>{ :PhoneType=\> { :value=\>true },  
:number=\>true },  
:vat\_code=\>true,  
:Address=\> { :town=\>true,  
:street=\>true,  
:number=\>true },  
:business\_name=\>true,  
:email=\>true,  
:website=\>true }  
}

Qualche suggerimento/idea/plugin ?

---

<div class="post-metadata">

**Author:** ![alesc](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/f19dbf/32.png) [@alesc](https://www.ruby-forum.com/u/alesc)\
**Post date:** [September 13, 2010, 3:13pm UTC](https://www.ruby-forum.com/t/string-to-complex-object/194904/2 "2010-09-13T15:13:39Z")

</div>

così in punta di piedi, direi di usare una eval 😛

A.

Il 13/09/2010 14:12, Alessandro S. ha scritto:

---

<div class="post-metadata">

**Author:** ![alesc](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/f19dbf/32.png) [@alesc](https://www.ruby-forum.com/u/alesc)\
**Post date:** [September 13, 2010, 4:05pm UTC](https://www.ruby-forum.com/t/string-to-complex-object/194904/3 "2010-09-13T16:05:42Z")

</div>

Certo eval funzionerebbe molto bene se non fosse che mancano le  
“inizializzazioni” delle strutture dati (field\_list={} etc… per  
intenderci)

Al momento ho risolto cambiando la generazione delle string (che vengono  
generate da un post http, cosÃ¬ posso usare YAML per salvarmi la  
struttura) resta comunque la curiositÃ …

Andrea P. wrote:

> cosï¿½ in punta di piedi, direi di usare una eval 😛
> 
> A.
> 
> Il 13/09/2010 14:12, Alessandro S. ha scritto:

---

<div class="post-metadata">

**Author:** ![alesc](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/f19dbf/32.png) [@alesc](https://www.ruby-forum.com/u/alesc)\
**Post date:** [September 14, 2010, 8:35pm UTC](https://www.ruby-forum.com/t/string-to-complex-object/194904/4 "2010-09-14T20:35:19Z")

</div>

Ho l’impressione che servirebbe una di queste due cose:

1. Un metodo per convertire un blocco in una stringa, cosÃ¬ potresti  
farne il parsing e generare le definizioni mancanti iniziando con  
field\_list = {}. In pratica Ã¨ l’inverso della eval e se ci fosse  
potresti scrivere qualcosa come

field\_list = Make.hash {  
field\_list[:Company][:business\_name] = true  
field\_list[:Company][:email] = true  
field\_list[:Company][:website] = true  
…  
}

1. Un metodo per avere il testo del codice della linea che ha generato  
un errore. Sapendo che field\_list[:Company][:business\_name] = true ha  
generato un’eccezione potresti fare l’eval di field\_list[:Company] = {}

Ma poichÃ¨ quel codice in qualche modo l’hai generato, perchÃ© non ci hai  
aggiunto giÃ le definizioni degli hash?

Infine, mentre controllavo le possibili soluzioni ho trovato queste due  
cose interessanti:

A) Conoscevate tutti il metodo set\_trace\_func della classe Kernel?  
[http://eigenclass.org/hiki/ruby+backtrace+line+numbers](http://eigenclass.org/hiki/ruby+backtrace+line+numbers)

B) Una spiegazione piÃ¹ chiara del solito di cosa sono i blocchi e le  
Proc e di come li si passano e li si assegnano

> **[The unary ampersand in Ruby](http://weblog.raganwald.com/2008/06/what-does-do-when-used-as-unary.html)**

Ciao  
Paolo

Alessandro S. wrote:

> Certo eval funzionerebbe molto bene se non fosse che mancano le  
> “inizializzazioni” delle strutture dati (field\_list={} etc… per  
> intenderci)
> 
> Al momento ho risolto cambiando la generazione delle string (che vengono  
> generate da un post http, cosÃ¬ posso usare YAML per salvarmi la  
> struttura) resta comunque la curiositÃ …
> 
> Andrea P. wrote:
> 
> > cosÃ¬ in punta di piedi, direi di usare una eval 😛
> > 
> > A.
> > 
> > Il 13/09/2010 14:12, Alessandro S. ha scritto:

---

<div class="post-metadata">

**Author:** ![alesc](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/f19dbf/32.png) [@alesc](https://www.ruby-forum.com/u/alesc)\
**Post date:** [September 15, 2010, 10:10am UTC](https://www.ruby-forum.com/t/string-to-complex-object/194904/5 "2010-09-15T10:10:50Z")

</div>

thanx! nel mio caso ho risolto (come ho scritto sopra) modificando  
appunto la generazione della stringa (che ho trasformato in un oggetto  
tramite javascript), la mia restava proprio una curiositÃ generale, un  
metodo che data una stringa generi un albero “credibile” che potrebbe  
essere di array o hash (magari intelligente in modo che a ogni  
successiva richiesta capisca appunto se si tratta di un array o di una  
hash modificando il risultato)…

Ero giusto per sapere se qualcuno lo aveva giÃ fatto o meno  
(probabilmente lo scriverÃ² io visto che potrebbe servirmi in futuro…  
chi lo sÃ 🙂 )

gabriele renzi wrote:

> 2010/9/14 Paolo M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):
> 
> > Ho l’impressione che servirebbe una di queste due cose:
> > 
> > 1. Un metodo per convertire un blocco in una stringa, cosï¿½ potresti  
> > farne il parsing e generare le definizioni mancanti iniziando con  
> > field\_list = {}. In pratica ï¿½ l’inverso della eval e se ci fosse  
> > potresti scrivere qualcosa come
> 
> SCRIPT\_LINES\_\_ puï¿½ essere tuo amico (la feature meno nota di ruby  
> AFAICT), ma come dici sotto tu, visto che crei programmaticamente sta  
> cosa tanto vale metterci anche i metadati.

---

<div class="post-metadata">

**Author:** ![alesc](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/f19dbf/32.png) [@alesc](https://www.ruby-forum.com/u/alesc)\
**Post date:** [September 15, 2010, 9:08am UTC](https://www.ruby-forum.com/t/string-to-complex-object/194904/6 "2010-09-15T09:08:59Z")

</div>

2010/9/14 Paolo M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> Ho l’impressione che servirebbe una di queste due cose:
> 
> 1. Un metodo per convertire un blocco in una stringa, così potresti  
> farne il parsing e generare le definizioni mancanti iniziando con  
> field\_list = {}. In pratica è l’inverso della eval e se ci fosse  
> potresti scrivere qualcosa come

SCRIPT\_LINES\_\_ può essere tuo amico (la feature meno nota di ruby  
AFAICT), ma come dici sotto tu, visto che crei programmaticamente sta  
cosa tanto vale metterci anche i metadati.

$ cat t.rb  
SCRIPT\_LINES\_\_ = {} #se definito, l’interprete carica hash con coppie  
file/content  
at\_exit do p SCRIPT\_LINES\_\_ end  
$ cat t2.rb  
puts “ciao”  
mecbuc:Cascaad (stable) rff$ ruby -rt.rb t2.rb  
ciao  
{“t2.rb”=\>[“puts "ciao"\n”]}

Anche ripper & parsetree e simili ti permettono di farlo riparsandoti  
il codice (forse evil.rb ?) ma sono hack.

> Infine, mentre controllavo le possibili soluzioni ho trovato queste due  
> cose interessanti:
> 
> A) Conoscevate tutti il metodo set\_trace\_func della classe Kernel?  
> [http://eigenclass.org/hiki/ruby+backtrace+line+numbers](http://eigenclass.org/hiki/ruby+backtrace+line+numbers)

si, ma metteva _molto_ overhead nella 1.8, non so con la 1.9 🙂
