使用heredoc作为哈希值

时间:2015-10-04 20:54:43

标签: ruby

我有一个方法Embed.toggler,它接受​​一个哈希参数。使用以下代码,我试图在哈希中使用heredoc。

                Embed.toggler({
                    title: <<-RUBY 
                        #{entry['time']}
                        #{entry['group']['who']
                        #{entry['name']}
                    RUBY
                    content: content
                })

但是,我收到以下错误跟踪:

syntax error, unexpected ':', expecting tSTRING_DEND
                        content: content
                                ^
can't find string "RUBY" anywhere before EOF
syntax error, unexpected end-of-input, expecting tSTRING_CONTENT or tSTRING_DBEG or tSTRING_DVAR or tSTRING_END
                        title: <<-RUBY 
                                      ^

如何避免出现此错误?

1 个答案:

答案 0 :(得分:20)

<<-RUBY

后添加逗号
Embed.toggler({
    title: <<-RUBY,
        #{entry['time']}
        #{entry['group']['who']
        #{entry['name']}
    RUBY
    content: content
})
  

这确实有效。我不知道为什么它不能在我的代码中工作。

它没有用,因为哈希要求键/值对用逗号分隔,例如{title: 'my title', content: 'my content' },而你的代码只是没有逗号。由于麻烦的HEREDOC语法,很难看出这一点。

  

您知道是否有办法对字符串执行操作?

你正在玩火。提取变量并对变量本身进行后处理总是更安全(通常更干净):

title = <<-RUBY
   #{entry['time']}
   #{entry['group']['who']
   #{entry['name']}
RUBY

Embed.toggler(title: title.upcase, content: content)

但是,如果你今天感到危险,你可以在打开HEREDOC字面后添加操作,就像你已经添加了逗号一样:

Embed.toggler({
    title: <<-RUBY.upcase,
        #{entry['time']}
        #{entry['group']['who']
        #{entry['name']}
    RUBY
    content: content
})

但我劝阻你,因为它破坏了可读性。