2013-10-22 11 views
6

Voglio realizzare una funzione di log in questo modo:Come ottenere il file corrente e il numero di riga in Ruby?

def mylog(str) 
    puts __FILE__, ":"__LINENO__, ":", str # Here how to get __FILE__ and __LINENO__ is my question. 
end 

Quando chiamo mylog:

mylog 'hello' # say I call this in my.rb line 10 

mi aspetto di uscita:

my.rb:10:hello 

Si prega di contribuire a dare giusta attuazione mylog funzione .

+0

E una parte, è '__LINE__' che restituisce la riga corrente (non' __LINENO__') –

risposta

5

Dovrete usare caller

def mylog(str) 
    caller_line = caller.first.split(":")[1] 
    puts "#{__FILE__} : #{caller_line} : #{str}" 
end 

Probabilmente vorrai conoscere il file dal quale è stato chiamato anche mylog ...

def mylog(str) 
    caller_infos = caller.first.split(":") 
    puts "#{caller_infos[0]} : #{caller_infos[1]} : #{str}" 
end 
+0

Questo funziona, ma non è il migliore. L'uso di 'caller' è vecchio stile. – sawa

+0

Per i futuri lettori si, ma per ora non volevo assumere Ruby 2.0 – gmalette

+0

'caller_line = caller [0] .split (": ") [1]; inserisce "# {__ FILE __}: # {caller_line}: # {str}" 'FYI, puoi attraversare lo stack di chiamate incrementando lo zero in questo esempio a 1, 2, ecc. –

5

La variabile corretta per ottenere il numero di riga è __LINE__, quindi la corretta attuazione della funzione sarebbe

def mylog(str) 
puts "#{__FILE__}:#{__LINE__}:#{str}" 
end 

Redatta in modo che il risultato corrisponda vostro

+1

Se è colpa del PO di avere indotto in errore per l'utilizzo di '__FILE__', ma che dà il file e la linea dove viene scritto il metodo 'puts'. – sawa

+0

Ahh sì, credo di averlo fatto troppo velocemente senza capire appieno cosa voleva. – Teddy

+0

Per maggiore chiarezza, i commenti riguardano la posizione "Definizione funzione" e "Chiamata funzione". –

9

L'utilizzo di caller è vecchio stile. Piuttosto, utilizzare caller_locations.

def mylog(str) 
    caller_locations(1, 1).first.tap{|loc| puts "#{loc.path}:#{loc.lineno}:#{str}"} 
end 
+0

Le caller_locations di dose richiedono una certa versione di Ruby? – TieDad

+0

Sì. È stato introdotto in Ruby 2.0. – sawa

Problemi correlati