字符串插值不适用于 Ruby heredoc 常量



我有一个很长的常量定义,需要插值(真正的定义要长得多):

const = "This::Is::ThePath::To::MyModule::#{a_variable}".constantize

现在,为了使它更具可读性,我尝试使用 heredocs 创建一个多行字符串:

const = <<-EOT.constantize
  This::Is::ThePath::
  To::MyModule::#{a_variable}
EOT

但是当我执行它时,我得到了一个NameError: wrong constant name.由于第一个示例有效,我假设它与字符串插值有关?

关于哪里出了问题的任何想法?

从此处删除所有空格和换行符-文档

在调用 here-文档之前,

您需要从内插的 here-文档中删除所有空格、制表符和换行符 #constantize。以下自包含示例将起作用:

require 'active_support/inflector'
module This
  module Is
    module ThePath
      module To
        module MyModule
          module Foo
          end
        end
      end
    end
  end
end
a_variable = 'Foo'
const = <<EOT.gsub(/s+/, '').constantize
  This::Is::ThePath::
  To::MyModule::#{a_variable}
EOT
#=> This::Is::ThePath::To::MyModule::Foo

改为:

const = <<-EOT.constantize
  This::Is::ThePath::
  To::MyModule::#{a_variable}
EOT

用:

const = <<-EOT.gsub(/n/, '').constantize
  This::Is::ThePath::
  To::MyModule::#{a_variable}
EOT

这个创建字符串的方法<<-EOF ... EOF n放在行尾,然后constantize无法正常工作。删除了不需要的字符n, t, s,一切都应该可以工作。

看看我的测试用例:

conts = <<-EOF.constantize
=> ActionDispatch::Integration::Session
=> EOF
#> NameError: wrong constant name "Sessionn"
conts = <<-EOF.chomp.constantize
=> ActionDispatch::Integration::Session
=> EOF
#> ActionDispatch::Integration::Session

对于许多行:

conts = <<-EOF
=> ActionDispatch::
=> Integration::
=> Session
=> EOF
=> "ActionDispatch::nIntegration::nSessionn"

修复它:

conts = <<-EOF.gsub(/n/, '').constantize
=> ActionDispatch::
=> Integration::
=> Session
=> EOF
=> ActionDispatch::Integration::Session

相关内容

  • 没有找到相关文章

最新更新