6

我偶然发现了 rails 源代码中的这段代码:

# File actionpack/lib/action_view/helpers/output_safety_helper.rb, line 30
def safe_join(array, sep=$,)
  sep ||= "".html_safe
  sep = ERB::Util.html_escape(sep)

  array.map { |i| ERB::Util.html_escape(i) }.join(sep).html_safe
end

做什么$,?我阅读了Regexp 文档,但找不到任何关于它的信息。

4

2 回答 2

5

系统变量的官方文档位于:

http://www.ruby-doc.org/stdlib-2.0/libdoc/English/rdoc/English.html

许多 Ruby 的特殊变量可以通过各种模块和类中的方法访问,这隐藏了变量是包含值的事实。例如,lineno在 IO 中可用并由 File 继承,是 IO 流读取的最后一行的行号。它依赖于$/$.

“English”模块提供了长版本的神秘变量,使其更具可读性。在 Ruby 中使用隐秘变量不像在 Perl 中那样惯用,这就是为什么当您遇到它们时它们会更加好奇的原因。

它们来自各种来源:大多数(如果不是全部)直接来自 Perl,但 Perl 从 sed、awk 和它的厨房水槽代码集合的其余部分继承了它们。(这是一门很棒的语言,真的。)

还有其他变量由诸如Regexp 之类的类设置,它定义了匹配前后的变量,以及捕获。这是来自文档:

$~ is equivalent to ::last_match;
$& contains the complete matched text;
$` contains string before match;
$' contains string after match;
$1, $2 and so on contain text matching first, second, etc capture group;
$+ contains last capture group.

尽管 Ruby 定义了变量的简短、隐秘的版本,但建议我们使用require "English"长名称来提供。这是一个可读性的东西,它转化为一个长期易于维护的东西。

于 2013-05-29T15:44:14.780 回答
5

我终于自己在这里找到了答案:

打印的输出字段分隔符。此外,它是 Array#join 的默认分隔符。(助记符:当您的打印语句中有 , 时打印的内容。)

下面的代码片段展示了效果:

a = [1,2,3]

puts a.join # => 123

$, = ','
puts a.join # => 1,2,3
于 2013-05-29T15:09:06.123 回答