2012-03-12 7 views
15

dire che sono in esecuzione IRB e scrivo questo nella console:Se ho definito un metodo Ruby in IRB, come posso modificare quel metodo senza dover scrivere di nuovo tutto?

def full_name(first, last) 
    puts "Your full name is: #{first, ' ', last}" 
end 

Say, che ho voluto modificare che per includere il parametro middle, come potrei solo portare back up che lo stesso metodo e modificare il parametro elencare e modificare la dichiarazione puts senza dover ridigitare l'intero metodo?

P.S. So che questo esempio è semplice e potrei facilmente ridigitare il metodo, ma ho metodi molto più ampi che sto sperimentando e sto usando questo per brevità.

Grazie.

+0

io non penso che sia possibile. è solo un interprete, che esegue il codice riga per riga. –

risposta

14

Non è possibile. Oltre a ridigitare/ripubblicare, o premere per ottenere tutte le dichiarazioni precedenti, ma per metodi più lunghi questo può essere molto confuso.

Perché non digitare il codice in un editor e quindi fare load 'mycode.rb' in IRb? Ciò equivale essenzialmente a copiare e incollare il testo dentro e chiamando di nuovo load 'myfile.rb', come al solito, sovrascrive le definizioni del metodo esistente.

O, ancora meglio, utilizzare Pry invece di IRB come suggested by bannister below (ho completamente sostituito IRB con Pry molto tempo fa me stesso).

+0

Questo è perfetto. Esiste comunque la possibilità di forzare IRB a ricaricare il mio file dopo aver apportato una modifica e averlo salvato nel mio editor di testo? O devo "ricaricarlo"? – marcamillion

+0

@marcamillion Non che io sappia, probabilmente dovresti fare in modo che l'IRb patch scimmia faccia qualcosa del genere a meno che non ci sia già un Gemma per farlo. –

+0

@marcamillion: è possibile utilizzare un hack come eseguire IRB in una sessione di schermo GNU e fare in modo che l'editor inietti il ​​codice dopo ogni salvataggio. [Le persone l'hanno fatto] (http://www.ruby-forum.com/topic/465509). –

6

Non penso che tu abbia molte opzioni qui. Quello che faccio di solito è mettere il codice con cui sto giocando in un file e usare load '/path/to/file.rb' per ricaricarlo ogni volta che cambio qualcosa.

È inoltre possibile provare la gemma interactive_editor che consente di utilizzare un editor di testo completo per la modifica del testo all'interno di una sessione IRB.

+0

L'uso di 'load' funziona perfettamente. Grazie. – marcamillion

+0

+1 Poiché le nostre risposte erano essenzialmente uguali e allo stesso tempo ':)'. –

+0

@Niklas, per un'alternativa all'IRB che supporta naturalmente questo tipo di cose (e molto più potente di 'interactive_editor') check out [Pry] (http://pry.github.com) – horseyguy

3

Scopri la gemma pry - un ottimo sostituto per IRB. Questa funzionalità potrebbe essere utile:

  • hist - riproduzione cronologia dei comandi
  • amend-line - cambiare una linea in una voce di mulit-line

Essi sono ben documentati sul pry wiki

+0

tuttavia non supporta il montaggio multilinea. –

+0

@Niklas non vuole 'editing multilinea' vuole modificare di nuovo una definizione di metodo. 'edit-method' gli consente di farlo. Sembra essere esattamente quello che vuole. – horseyguy

+0

@banister: Penso che quello che vuole veramente sia qualcosa di simile al montaggio di editing multilinea di tipo zsh o IPython, non usando un editor esterno. Né IRB né Pry supportano questo (e anche questa risposta non menziona nemmeno 'edit-method', quindi non è molto utile). –

12

È è possibile farlo facilmente in Pry (un'alternativa molto più potente all'IRB), utilizzare semplicemente il comando edit-method per riaprire il metodo in un editor come indicato di seguito:

[19] (pry) main: 0> def full_name(first, last) 
[19] (pry) main: 0* puts "Your full name is: #{first + '' + last}" 
[19] (pry) main: 0* end 
=> nil 
[20] (pry) main: 0> edit full_name 
Waiting for Emacs... 
=> nil 
[21] (pry) main: 0> show-method full_name 

From: (pry) @ line 32: 
Number of lines: 3 
Owner: Object 
Visibility: public 

def full_name(first, middle, last) 
    puts "Your full name is: #{first + middle + last}" 
end 
[22] (pry) main: 0> full_name "Stephen ", "william ", "Hawking" 
Your full name is: Stephen william Hawking 
=> nil 
[23] (pry) main: 0> 

leva ricarica automaticamente il metodo dopo la modifica è completa (gli usi redattore di leva può anche essere configured)

1

È possibile modificare questa via IRB o fare leva (che consiglio vivamente) - ma dovrete bisogno di ridigitare il tutto. Se ci pensi, un metodo non è così difficile da scrivere: P Tuttavia, se hai più di un metodo racchiuso in una classe, può essere molto noioso ridigitare l'intera classe e i metodi corrispondenti. Quello che puoi fare in quel caso è usare class_evals.

Class Name 
    def full_name(first, last) 
     puts "Your full name is: #{first + ' ' + last}" 
    end 
end 

# NEW Edited Code 

Name.class_eval do 
    def full_name(first, middle, last) 
    puts "Your full name is: #{first + ' ' + middle + ' ' + last}" 
    end 
end 

Here's a good resource to read about re-opening classes/monkeypatching e here's another that warns about the bad effects of monkeypatching

Problemi correlati