带有引号内变量的Ruby格式字符串

时间:2018-08-29 21:54:24

标签: ruby string formatting string-formatting string-interpolation

如果我愿意

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提交按钮大约三等舱'

2 个答案:

答案 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'" # ↑↑↑↑↑↑↑↑↑↑↑ 形式:

%{}