Ci sono diversi modi per accedere al codice sorgente di una libreria da un codice Ruby che richiede/carica quella libreria. Tra questi modi, alcuni leggono direttamente il file della libreria e lo analizzano. Altri accedono al sorgente attraverso alcuni metodi incorporati che forniscono informazioni sull'origine (come l'albero di sintassi astratto). In una situazione in cui non ho accesso alla lettura diretta del contenuto del file (come nei precedenti modi), l'unico modo per accedere alla fonte sarebbe l'accesso ai metodi incorporati che forniscono le informazioni. Ridefinendo questi metodi per fare qualcos'altro, perderò completamente l'accesso al codice sorgente. Quali sono gli insiemi minimi di metodi tali che se li ridefinisco a qualcos'altro, perderò completamente l'accesso al codice sorgente della libreria su un file esterno?Quali metodi consentono di accedere al codice sorgente?
Per riformulare la domanda
Supponiamo:
- C'è un utente che può scrivere alcun codice Ruby in file di A.
- C'è una statica rubino file di B scritto da me, che carica il file A e chiama la routine principale definita in A e definisce anche alcune classi/metodi che l'utente può utilizzare in A.
- L'utente non ha ve + R (lettura) o + w permesso (scrittura) a B.
Quali metodi (Rubino standard) devo ridefinire (annullare) o rimuovere scrivendo così in file di B in modo da rendere impossibile per l'utente di accedere alla fonte scritta nel file B (tramite qualsiasi codice l'utente può scrivere nel file A) quando eseguo il file B?
Ci sono alcune librerie come lo stregone, la leva, che può estrarre il codice sorgente dei metodi a cui ha accesso. Ci devono essere alcuni comandi primitivi all'interno di Ruby che queste librerie fanno affidamento per consentire loro di accedere al codice sorgente. Quali sono i metodi che rendono possibile questo tipo di cose?
Se non si conosce la risposta completa ma si sa come una particolare libreria estrae l'origine di qualche metodo, ciò sarà comunque di aiuto.
penso che si può definire una classe astratta o qualcosa di simile per interfacciare in Java, che non implementa nulla. L'interfaccia accederà pubblicamente dai componenti esterni. Quindi puoi ereditare la classe astratta per implementarla internamente. –
Quando si ridefiniscono questi metodi, si può fare uso del 'Modulo # alias_method' per assicurarsi di avere una" copia "del metodo originale che si sta modificando. http://apidock.com/ruby/Module/alias_method – fmendez
_system_, _backtick_, _fork/exec_, ecc., devono essere disabilitati. –