gpt4 book ai didi

ruby - 在(双引号)heredoc 中使用 `gsub` 不起作用

转载 作者:数据小太阳 更新时间:2023-10-29 08:29:44 25 4
gpt4 key购买 nike

似乎在(双引号)heredoc 中使用 gsub 不会评估 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 里面发生了什么?

最佳答案

问题出在正则表达式中的 \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

Reference

如果您在没有包装的 EOS 的情况下运行上述代码,gsub 将尝试替换 val 中的“D”(字面意思)。看这个:

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

关于ruby - 在(双引号)heredoc 中使用 `gsub` 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53474368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com