我正在尝试使用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
答案 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构建成像你试图那样做的函数......它们只能用于与其他字符串文字相同的位置和方式,例如“双引号”或可以使用'单引号'文字。