Использование `gsub` внутри (двойные кавычки) heredoc не работает - PullRequest
0 голосов
/ 26 ноября 2018

Похоже, что использование gsub внутри (двойных кавычек) heredoc не оценивает результат gsub, как показано ниже:

class Test
  def self.define_phone
    class_eval <<-EOS
      def _phone=(val)
        puts val
        puts val.gsub(/\D/,'')
      end
    EOS
  end
end

Test.define_phone
test = Test.new
test._phone = '123-456-7890'
# >> 123-456-7890
# >> 123-456-7890

Второй puts должен был печатать 1234567890как в этом случае:

'123-456-7890'.gsub(/\D/,'')
 # => "1234567890" 

Что происходит внутри heredoc?

1 Ответ

0 голосов
/ 26 ноября 2018

Проблема с \D в регулярном выражении.Он будет оцениваться, когда heredoc будет оцениваться как строка, что приводит к D:

"\D" # => "D"
eval("/\D/") #=> /D/

С другой стороны, \D внутри одиночной кавычки не будет оцениваться как D:

'\D' # => "\\D"
eval('/\D/') # => /\D/ 

Оберните терминатор heredoc EOS в одну кавычку, чтобы получить то, что вы хотите:

class Test
  def self.define_phone
    class_eval <<-'EOS'
      def _phone=(val)
        puts val
        puts val.gsub(/\D/,'')
      end
    EOS
  end
end

Test.define_phone
test = Test.new
test._phone = '123-456-7890'
# >> 123-456-7890
# >> 1234567890

Ссылка

ЕслиВы запускаете приведенный выше код без переноса EOS, gsub попытается заменить "D" (буквально) на val.Смотрите это:

test._phone = '123-D456-D7890DD'
# >> 123-D456-D7890DD
# >> 123-456-7890
...