Ruby格式字符串,引号内有变量
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ruby格式字符串,引号内有变量相关的知识,希望对你有一定的参考价值。
如果我做
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 submit-button some-class'
我不相信我可以只使用插值,因为有时我需要传入其他变量。换句话说,我做不到
additional_classes = 'some-class'
"class='btn submit-button #{additional_classes}'"
因为有时我想重用相同的字符串“template”但传入其他变量,以产生如下字符串:
class ='btn submit-button some-other-class'
要么
class ='btn submit-button some-third-class'
来自fine manual:
format(format_string [,arguments ...])→string [...] 对于更复杂的格式,Ruby支持按名称引用。
%<name>s
风格使用格式风格,但%{name}
风格没有。
文档不是很清楚,但是当你使用%<...>
形式时,它期望看到%<name>s
,其中name
是哈希键,s
是格式类型:s
表示字符串,d
表示数字,...如果你说:
%<additional_classes>'
那么当没有这样的类型说明符时,format
会尝试将'
解释为一种类型,因此你得到一个ArgumentError
,因为格式字符串格式错误。
您可能想要使用%{...}
表单:
template_string = "class='btn submit-button %{additional_classes}'"
#--------------------------------------------^------------------^
您的格式字符串缺少field type specifier。字段类型说明符在格式字符串中是必需的。
我不清楚为什么第一个例子不会引发错误,因为缺少必需的字段类型说明符。它可能是一个错误,或者我完全误读了文档。
但是,我不清楚为什么你认为这个例子有效:
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'"
# ↑↑↑↑↑↑↑↑↑↑↑
或者,您可以使用%{}
表单:
template_string = "class=btn 'submit-button %{additional_classes}'"
# ↑ ↑
format(template_string, additional_classes: 'some-class')
#=> "class=btn 'submit-button some-class'"
# ↑↑↑↑↑↑↑↑↑↑↑
以上是关于Ruby格式字符串,引号内有变量的主要内容,如果未能解决你的问题,请参考以下文章