2013-10-22 68 views
6

我想要實現這樣的日誌功能:如何在Ruby中獲取當前文件和行號?

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

當我打電話mylog

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

我期望輸出:

my.rb:10:hello 

請幫忙給出正確實施mylog功能。

+0

並且順便說一句,這是'__LINE__'返回當前線路(不'__LINENO__') –

回答

5

你將不得不使用caller

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

你可能想知道mylog被調用的文件...

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

這可行,但不是最好的。使用'caller'是老式的。 – sawa

+0

對於未來的讀者是的,但現在我不想承擔Ruby 2.0 – gmalette

+0

'caller_line = caller [0] .split(「:」)[1];放置「#{FILE __}:#{cal }_line}:#{str}」'FYI,您可以遍歷調用堆棧,將此示例中的零遞增爲1,2等。 –

5

正確的變量獲得行號爲__LINE__,使你的函數的正確實施將

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

編輯,以便輸出匹配你

+1

如果是OP的故障有誤導你使用'__FILE__',但給人的文件和行寫'puts'方法的地方。 – sawa

+0

啊,是的,猜測我沒有充分理解他想要的東西,就跳得太快了。 – Teddy

+0

爲了清楚起見,評論與「功能定義」和「功能調用」位置有關。 –

9

使用caller是舊式。相反,使用caller_locations

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

劑量caller_locations需要特定的Ruby版本嗎? – TieDad

+0

是的。它是在Ruby 2.0中引入的。 – sawa

相關問題