5

我正在尝试使用带有 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
4

3 回答 3

10

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

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"

如果您不打算缩进,请参见此处。← 看到我的文字游戏了吗?

于 2013-05-30T09:25:01.277 回答
3

尝试一些类似的东西

something = "bananas"

str = <<EOF
  this has some #{something} in!
EOF
于 2013-05-30T09:23:53.353 回答
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构建到一个函数中......它们只能在与其他字符串文字相同的地方和方式中使用,例如“双引号”或“单引号” ' 字面量,可以使用。

于 2013-05-30T09:32:46.113 回答