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格式字符串,引号内有变量的主要内容,如果未能解决你的问题,请参考以下文章

php 字符串

js单双引号之间的区别

通配符

使用Shell笔记总结

雷林鹏分享:Ruby 字符串(String)

shell基础学习