Ruby HERE-DOC方法参数传递

时间:2013-05-30 09:14:07

标签: ruby heredoc

我正在尝试使用here-doc的自定义方法并希望传递参数(没有商业案例,我只是想学习ruby)。在这种情况下有没有办法传递参数?这是我到目前为止所做的。

简单方法,工作正常。

def meth1
  self.upcase
end

str1 = <<MY.meth1
  i am a small case string
MY

# "I AM A SMALL CASE STRING\n"

现在,我想让我们放下一些参数并尝试不同的变化,并且irb给我一个空白的目光。

#variation 1

def meth2( <<EOF1, <<EOF2 )
  EOF1.upcase + "..." + EOF2.downcase
end

str2 = <<MY.meth2
 some string
EOF1
 ANOTHER STRING
EOF2
MY

3 个答案:

答案 0 :(得分:8)

我的猜测是,这就是你要做的事情:

def meth2(str1, str2)
  str1.upcase + "..." + str2.downcase
end

str2 = meth2(<<EOF1, <<EOF2)
 some string
EOF1
 ANOTHER STRING
EOF2

str2 # => " SOME STRING\n... another string\n"

如果您不打算缩进,请参阅here。 ←在这里看到我的文字游戏?

答案 1 :(得分:2)

按照

的方式尝试
something = "bananas"

str = <<EOF
  this has some #{something} in!
EOF

答案 2 :(得分:2)

尝试这样的事情:

def meth2( item1, item2 )
  item1.upcase + "..." + item2.downcase
end

str2 = meth2 <<EOF1, <<EOF2
 some string
EOF1
 ANOTHER STRING
EOF2

您遇到的问题是由于没有完全理解heredoc样式字符串文字的工作原理。 <<DELIMITER部分只是告诉解析器从它后面的行中获取它的字符串数据。如果一行上有多个<<DELIMITER,则它们会堆叠,并按顺序读入。因此,在这种情况下,上面的代码完全等同于:

def meth2( item1, item2 )
  item1.upcase + "..." + item2.downcase
end

str2 = meth2 " some string\n", " ANOTHER STRING\n"

最重要的是,没有办法将heredoc构建成像你试图那样做的函数......它们只能用于与其他字符串文字相同的位置和方式,例如“双引号”或可以使用'单引号'文字。