Расширяет ли выражение ruby ​​через # {} двойное расширение? - PullRequest
0 голосов
/ 18 февраля 2011

Хорошо, в соответствии с предложениями по уточнению намерения я переформулировал вопрос. Надеюсь, этот пример понятен.

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

3 голосов
/ 18 февраля 2011

Нет, это невозможно, как вы показали.синтаксис #{} предназначен только для интерполяции строк, поэтому, когда вы пишете 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, чтобы ознакомиться с основами.

0 голосов
/ 24 мая 2011

Вы можете использовать eval для этого. Просто убедитесь, что строка "XXX" очень маловероятна для появления в реальном сообщении.

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

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