Ruby Замена переменной внутри другой переменной - PullRequest
1 голос
/ 22 апреля 2020

У меня есть переменная ruby, созданная из сложного кода, но я не могу заменить переменную, объявленную внутри моей основной переменной. Вот пример, он может быть простым, но я не смог изменить процедуру объявления основной переменной.

irb(main):065:0> p msg
"My name is \#{name}"
irb(main):066:0> puts name
Foo
irb(main):067:0> puts msg
My name is #{name}
irb(main):068:0> puts "#{msg}"
My name is #{name}

Я хочу вывод типа «Меня зовут Foo»; Это должно быть достигнуто, учитывая, что я не могу контролировать формат содержимого переменной 'msg'

Ответы [ 2 ]

2 голосов
/ 22 апреля 2020

Вы можете создать свой собственный класс String с подстановкой во время выполнения.

class StringInterpollator < String
  def replace(bind)
    gsub(/\\*#\{(\w+)\}/) do |m|
      eval($1, bind)
    end
  end
end

msg = 'My name is \#{name}'
name = "Foo"

StringInterpollator.new(msg).replace binding #My name is Foo

EDIT: здесь версия, которая принимает обе локальные переменные в качестве переменных экземпляра

class StringInterpollator < String
  def replace(bind)
    gsub(/\\*#\{?([\w@]+)\}?/){ |m| eval($1, bind)}
  end
end
0 голосов
/ 22 апреля 2020

Один простой подход заключается в использовании подстановки строк с помощью метода sub, подобного этому

name = "Foo"
msg.sub('#{name}', name) # => "My name is Foo" 

Однако предполагается, что msg всегда содержит текст \#{name}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...