红宝石中的"$"是什么意思?

fab*_*abi 6 ruby

我偶然发现了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
Run Code Online (Sandbox Code Playgroud)

怎么$,办?我阅读了Regexp文档,但我找不到任何相关内容.

fab*_*abi 5

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

打印的输出字段分隔符.此外,它是Array#join的默认分隔符.(助记符:在您的打印声明中有打印的内容.)

以下代码段显示了效果:

a = [1,2,3]

puts a.join # => 123

$, = ','
puts a.join # => 1,2,3
Run Code Online (Sandbox Code Playgroud)


the*_*Man 5

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

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

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

"英语"模块提供了神秘变量的长版本,使其更具可读性.隐藏变量的使用在Ruby中并不像在Perl中那样惯用,这就是为什么当你遇到它们时它们会更加好奇.

它们来自各种各样的来源:大多数(如果不是全部)都是来自Perl,但Perl从sed,awk和其余的kitchen-sink代码集继承了它们.(这真是一种很棒的语言.)

还有像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.
Run Code Online (Sandbox Code Playgroud)

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