通过#{}进行ruby表达式扩展会进行双重扩展吗?

时间:2011-02-18 02:25:24

标签: ruby expression expansion

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

$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。

轻松,

-daniel

2 个答案:

答案 0 :(得分: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书籍以熟悉基础知识。

答案 1 :(得分:0)

您可以使用eval。 只需确保将“XXX”设置为实际消息中出现的非常不可能的字符串。

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

def somefunc
   $funcname = "Something"
   $message = "an important message."
   puts eval("<<XXX\n" + $DebugFormat + "\nXXX\n")
end