ruby这里的文件

Sha*_*abu 2 ruby string heredoc string-interpolation

我正在尝试在Ruby中编写一个方法,该方法使用带有输入变量的HTML代码的here-document并相应地填充它们.

我的方法是:

calcForm(left, op, right, result)
Run Code Online (Sandbox Code Playgroud)

我正在使用的html标签是

<input type="text" name="left" value="?????"> 
<select name="op">
<option value="add" ?????>+</option>
<option value="mul" ?????>*</option> 
</select>
<input type="text" name="right" value="?????"> 
=
?????
Run Code Online (Sandbox Code Playgroud)

到处都有问号,我的方法必须填写变量left,op,right和result.

例如,

calcForm(6, "mul", 7, 42) 
Run Code Online (Sandbox Code Playgroud)

应该返回字符串:

<input type="text" name="left" value="**6**"> 
<select name="op">
<option value="add">+</option>
<option value="mul" **selected**>*</option> 
</select>
<input type="text" name="right" value="**7**"> 
=
**42**
Run Code Online (Sandbox Code Playgroud)

因此,"选择"一词应出现在"添加"或"jul"之后,取决于op的值,左侧和右侧的值应填入value ="...",结果应出现在最后一行.

我是ruby的新手,但到目前为止,这是我对这里文档的了解:

the_tags = <<HERE
<input type="text" name="left" value=#{left}> 
<select name="op">
<option value="add" #{op}>+</option>
<option value="mul" #{op}>*</option> 
</select>
<input type="text" name="right" value=#{right}> 
=
#{result}
HERE

def calcForm(left,op,right,result)
Run Code Online (Sandbox Code Playgroud)

我被困在这一点上.我很困惑如何将我的方法calcForm连接到上面的here文档.

任何有关这方面的帮助将不胜感激!

谢谢!

Jac*_*son 10

看起来你正在考虑将heredoc作为一种模板,你定义一次,内置字符串插值,然后重用.事实并非如此.与任何字符串定义一样,字符串插值在定义变量时即时发生.

所以你会这样做

def calcForm(left,op,right,result)
   <<HERE
     <input type="text" name="left" value=#{left}> 
     <select name="op">
     <option value="add" #{op}>+</option>
     <option value="mul" #{op}>*</option> 
     </select>
     <input type="text" name="right" value=#{right}> 
     =
     #{result}
   HERE
end
Run Code Online (Sandbox Code Playgroud)

然而,对于你正在尝试做的事情,一个更好的方法可能是ERB,它更像你上面的想法; 即它是一个模板.

require 'erb'
template = ERB.new <<HERE
         <input type="text" name="left" value=<%=left%>> 
         <select name="op">
         <option value="add" <%=op%>>+</option>
         <option value="mul" <%=op%>>*</option> 
         </select>
         <input type="text" name="right" value=<%=right%>> 
         =
         <%=result%>
         HERE

def calcForm(left,op,right,result)
   template.result(binding)    
end
Run Code Online (Sandbox Code Playgroud)

请注意,binding这是一个神奇的词,意思是"评估当前上下文中的表达式"; 即使用当前定义的变量(传入的参数).