Проблема с \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