一般分隔符的输入语法以及它们的作用

159 阅读2分钟

我们有时会看到像%w(some strings)%s(some other strings)%Q(even more #{strings}) 这样的Ruby片段。它可能有点不清楚正在发生什么。% 的语法是什么?不同的字母有什么作用?它们什么时候是大写或小写?

这通常被称为*"一般限定的输入",尽管我也听说这被称为"百分比语法"。*不管怎么说,它都是创建字符串、数组、符号或正则表达式的速记方法。而且,正如我们将在下面看到的,每个不同的字母都会创建一个不同类别的对象。

除了一个例外,小写定界符忽略了插值,而大写定界符计算插值。

一般的分隔符输入最常被用于常数,这些常数是Strings的数组,在喜欢多行字符串语法的代码库中,以及用于重构函数。

让我们来简单了解一下一般分隔符的输入语法,以及它们的作用。

%w() 或 %W() - 字符串的数组

这些语法在空格上分割参数,并创建数组,数组中的每个元素都是一个字符串。

  • %w()没有插值,所以也会在空格处分割 "看起来像插值 "的值:

    %w(some values #{1 + 1})
    => ["some", "values", "\#{1", "+", "1}"]
    
  • %W()有插值:

    %W(some values #{1 + 1})
    => ["some", "values", "2"]
    

%i() 或 %I() - 符号数组

与上述相同,只是每个元素不是字符串,而是一个符号。

  • %i() 没有插值,所以也会在空格处分割插值:

    %i(some values #{1 + 1})
    => [:some, :values, :"\#{1", :+, :"1}"]
    
  • %I() 有插值:

    %I(some values #{1 + 1})
    => [:some, :values, :"2"]
    

%q() 或 %Q() - 字符串

这些将把参数变成一个字符串。

  • %q() 没有插值,所以也会在空间上分割插值:

    %q(some values #{1 + 1})
    => "some values \#{1 + 1}"
    
  • %Q() 有插值:

    %Q(some values #{1 + 1})
    => "some values 2"
    

%s() - 符号

%s() 没有插值,所以也会在空格处分割插值:

%s(some values #{1 + 1})
=> :"some values \#{1 + 1}"

%r() - Regex

%r() 是大写/插值规则的唯一例外。%r()将给我们一个带插值的重词:

%r(some values #{1 + 1})
=> /some values 2/

希望下次你看到,或需要使用一般的分隔符输入时,你现在知道应该使用什么合适的分隔符。

注意:给内容定界的字符(() 在上面的例子中)不一定是小括号,也可以是方括号、大括号、角括号和其他字符--但这是另一个提示。