0

好的,根据关于澄清意图的建议,我已经重申了这个问题。希望这个例子很清楚。

$funcname = ""
$message = ""
$DebugFormat = "Within #{$funcname} message: #{$message}"


def Something
   $funcname = "Something"
   # .
   # .
   # .
   $message = "an important message."
   puts "#{$DebugFormat}"

end

def Another
   $funcname = "Another"
   # Another method related code ...
   $message = "Result message to output"
   puts "#{$DebugFormat}"
end

因此,我们的想法是在不同的地方使用各种与调试相关的字符串,而无需重复相同的格式等。

无论如何,这不是超级关键,它只是尝试更好地学习 Ruby 的尝试。

放轻松,

-丹尼尔

4

2 回答 2

3

不,正如您所展示的那样,这是不可能的。该#{}语法仅用于字符串插值,因此当您编写时PP = "[#{fname}]",它只是将字符串存储[Empty]在变量中PP。字符串不记得用于生成它们的代码。

目前尚不清楚您试图通过此实现什么,但很可能一种方法比字符串插值更合适。


自您的编辑后更新:您似乎想要创建一种模拟堆栈跟踪。字符串插值仍然没有意义。相反,您可以执行以下操作:

def debug(message)
  puts "#{ caller[0][/`([^']*)'/, 1]}: #{message}"
end

def something
  debug "an important message"
end

def another
  debug "result message to output"
end

something
another

基于您对全局变量和常量的奇怪用法,您似乎正在尝试以不适合 Ruby 的方式应用来自其他语言的想法。我建议您阅读一本 Ruby 书籍以熟悉基础知识。

于 2011-02-18T03:36:47.393 回答
0

您可以为此使用 eval。只需确保使“XXX”成为一个不太可能出现在实际消息中的字符串。

$DebugFormat = 'Within #{$funcname} message: #{$message}'

def somefunc
   $funcname = "Something"
   $message = "an important message."
   puts eval("<<XXX\n" + $DebugFormat + "\nXXX\n")
end
于 2011-05-24T11:32:24.690 回答