如果我愿意
template_string = "class=btn submit-button %<additional_classes>"
format(template_string, additional_classes: 'some-class')
有效。但是,如果我这样做
template_string = "class='btn submit-button %<additional_classes>'"
format(template_string, additional_classes: 'some-class')
失败,给出
ArgumentError:
malformed format string - %'
(请注意第二个template_string中类周围的引号-这是Ruby代码的两个块之间的唯一区别)。我该如何运作?换句话说,我该如何产生以下内容?
class ='btn提交按钮某些类'
我不相信只能使用插值,因为有时我需要传递其他变量。换句话说,我做不到
additional_classes = 'some-class'
"class='btn submit-button #{additional_classes}'"
因为有时我想重用相同的字符串“ template”,但传入其他变量,以产生如下字符串:
class ='btn提交按钮其他类'
或
class ='btn提交按钮大约三等舱'
答案 0 :(得分:2)
来自fine manual:
format(format_string [,arguments ...])→字符串
[...]
对于更复杂的格式,Ruby支持按名称引用。%<name>s
样式使用格式样式,但%{name}
样式不使用。
文档不够清晰,但是当您使用%<...>
格式时,期望看到%<name>s
,其中name
是哈希键,{{1 }}是格式类型:s
代表字符串,s
代表数字,... ...如果您说:
d
然后,%<additional_classes>'
将在没有这样的类型说明符的情况下尝试将format
解释为类型,因此您会收到'
,因为格式字符串格式错误。
您可能想使用ArgumentError
表单:
%{...}
答案 1 :(得分:2)
您的格式字符串缺少field type specifier。字段类型说明符是格式字符串中的必需项。
我不清楚为什么第一个示例没有引发错误,因为缺少必需的字段类型说明符。可能是错误,或者我完全误读了文档。
但是,我不清楚您为什么认为此示例有效:
td
如您所见,template_string = "class=btn submit-button %<additional_classes>"
format(template_string, additional_classes: 'some-class')
#=> 'class=btn submit-button %'
# ↑
不会解释为格式字符串的一部分,而是文字%
。我认为这是一个错误,就像第二个示例一样,它应该引发错误。
在第二个示例中,您可以清楚地看到问题所在:
%
由于格式字符串必须具有字段类型说明符,并且ArgumentError: malformed format string - %'
↑
之后的唯一字符(字段名称除外)为%
,因此将其解释为字段类型说明符。而且由于'
不是合法的字段类型,所以'
会引发一个错误,在该错误中它明确告诉您将format
解释为格式字符串的一部分。
由于要格式化字符串,因此应使用'
(字符串)字段类型说明符:
s
或者,您可以使用template_string = "class=btn 'submit-button %<additional_classes>s'"
# ↑
format(template_string, additional_classes: 'some-class')
#=> "class=btn 'submit-button some-class'"
# ↑↑↑↑↑↑↑↑↑↑↑
形式:
%{}