ruby — 解释型面向对象脚本语言
概要
ruby [--copyright] [--version] [-SUacdlnpswvy] [-0[octal]] [-C directory]
[-E external[:internal]] [-F[pattern]] [-I directory] [-K[c]] [-T[level]] [-W[level]]
[-e command] [-i[extension]] [-r library] [-x[directory]] [--{enable|disable}-FEATURE]
[--dump=target] [--verbose] [--crash-report=template] [--] [program_file] [argument ...]
描述
Ruby 是一种解释型脚本语言,用于快速简便的面向对象编程。它具有许多功能,可以处理文本文件并执行系统管理任务(如 Perl)。它简单、直接且可扩展。
如果您需要一种易于进行面向对象编程的语言,或者您不喜欢 Perl 的冗长,或者您喜欢 LISP 的概念,但又不喜欢过多的括号,那么 Ruby 可能是您的首选语言。
特点
Ruby 的特点如下:
解释型 Ruby 是一种解释型语言,因此您无需重新编译用 Ruby 编写的程序即可执行它们。
变量没有类型(动态类型) Ruby 中的变量可以包含任何类型的数据。您无需担心变量类型。因此,它具有较弱的编译时检查。
无需声明 您可以在 Ruby 程序中使用变量而无需任何声明。变量名表示其作用域——全局、类、实例或局部。
简单的语法 Ruby 具有一种简单的语法,略受 Eiffel 的影响。
无需用户级别的内存管理 Ruby 具有自动内存管理。不再从任何地方引用的对象将由内置于解释器中的垃圾回收器自动回收。
所有内容都是对象 Ruby 是一种纯粹的面向对象语言,从其创建之初就是如此。即使是基本数据(如整数)也被视为对象。
类、继承和方法 作为一种面向对象的语言,Ruby 自然具有类、继承和方法等基本功能。
单例方法 Ruby 具有为特定对象定义方法的能力。例如,您可以为特定的按钮定义一个“按下按钮”操作,方法是为该按钮定义一个单例方法。或者,如果您愿意,您可以使用单例方法构建自己的基于原型的对象系统。
通过模块进行混合 Ruby 故意没有多重继承,因为它会引起混淆。相反,Ruby 具有在继承树中共享实现的能力。这通常被称为“混合”。
迭代器 Ruby 具有用于循环抽象的迭代器。
闭包 在 Ruby 中,你可以将过程对象化。
文本处理和正则表达式 Ruby 具有许多文本处理功能,类似于 Perl。
M17N,与字符集无关
Ruby 支持多语言编程。 可以轻松处理用许多不同自然语言编写并以许多不同字符编码的文本,而无需依赖 Unicode。
大整数 借助内置的大整数,你可以计算 factorial(400)。
反射和特定领域语言 类也是 Class 类的实例。 类的定义和方法是一种表达式,就像 1+1 一样。 因此,你的程序甚至可以编写和修改程序。 因此,你可以使用你自己的编程语言在 Ruby 之上编写你的应用程序。
异常处理 与 Java(tm) 类似。
直接访问操作系统 Ruby 可以使用大多数 Unix 系统调用,通常用于系统编程。
动态加载 在大多数 Unix 系统上,你可以将对象文件动态加载到 Ruby 解释器中。
丰富的库 除了与 Ruby 捆绑在一起的“内置库”和“标准库”之外,还有大量的第三方库(“gem”),可通过名为“RubyGems”的包管理系统提供,即 gem(1) 命令。 访问 RubyGems.org (https://rubygems.org/) 以查找你需要的 gem,并访问 GitHub (https://github.com/) 以查看它们是如何开发和使用的。
选项
Ruby 解释器接受以下命令行选项(开关)。 它们与 perl(1) 的选项非常相似。
--copyright 打印版权声明,然后立即退出而不运行任何脚本。
--version 打印 Ruby 解释器的版本,然后立即退出而不运行任何脚本。
-0[octal] (数字“零”)。 将输入记录分隔符 ($/) 指定为八进制数。 如果没有提供数字,则采用空字符作为分隔符。 其他开关可以跟在数字之后。 -00 将 Ruby 转换为段落模式。 -0777 使 Ruby 一次读取整个文件作为单个字符串,因为没有具有该值的有效字符。
-C directory
-X directory 导致 Ruby 切换到目录。
-E external[:internal]
--encoding external[:internal]
指定默认外部编码和内部编码的值。 值应使用冒号 (:) 分隔。
你可以省略内部编码的值,那么 (Encoding.default_internal) 的值将为 nil。
--external-encoding=encoding
--internal-encoding=encoding
指定默认外部或内部字符编码
-F pattern 指定输入字段分隔符 ($;)。
-I directory 用于告诉 Ruby 在哪里加载库脚本。 目录路径将添加到 load-path 变量 ($:) 中。
-K kcode 指定 KANJI(日语)编码。 脚本编码(__ENCODING__)和外部编码(Encoding.default_external)的默认值将是指定的编码。 kcode 可以是以下值之一:
e EUC-JP
s Windows-31J (CP932)
u UTF-8
n ASCII-8BIT (BINARY)
-S 使 Ruby 使用 PATH 环境变量来搜索脚本,除非脚本名称以斜杠开头。这用于模拟 #!,在不支持它的机器上,以如下方式使用:
#! /usr/local/bin/ruby
# 这行代码使下一行在 Ruby 中成为注释
exec /usr/local/bin/ruby -S $0 $*
在某些系统上,$0 并不总是包含完整路径名,因此您需要使用 -S 选项来告诉 Ruby 如果有必要,搜索脚本(以处理嵌入的空格等)。一个比 $* 更好的结构是 ${1+"$@"},但如果脚本由 csh(1) 解释,它将不起作用。
-T[level=1] 以指定的级别(默认为 1)启用 taint 检查。
-U 将默认内部编码(Encoding.default_internal)设置为 UTF-8。
-W[level=2] 以指定的级别启用详细模式,而不打印开头的版本消息。级别可以是:
0 详细模式为“静默”。它将 $VERBOSE 设置为 nil。
1 详细模式为“中等”。它将 $VERBOSE 设置为 false。
2(默认)详细模式为“详细”。它将 $VERBOSE 设置为 true。-W2 与 -w 相同。
-a 在使用 -n 或 -p 时,启用自动拆分模式。在自动拆分模式下,Ruby 将执行 $F = $_.split
在每个循环的开头。
--backtrace-limit=num
将回溯的最大长度限制为 num 行(默认值为 -1,表示无限制)。
-c 使 Ruby 检查脚本的语法并退出,而不执行。如果没有语法错误,Ruby 将在标准输出中打印“Syntax OK”。
-d
--debug 启用调试模式。$DEBUG 将设置为 true。
-e command 指定来自命令行 Script,同时告诉 Ruby 不要从其余参数中搜索脚本文件名。
-h
--help 打印选项摘要。
-i extension 指定就地编辑模式。如果指定了扩展名,则将其添加到旧文件名中,以创建备份副本。例如:
% echo matz > /tmp/junk
% cat /tmp/junk
matz
% ruby -p -i.bak -e '$_.upcase!' /tmp/junk
% cat /tmp/junk
MATZ
% cat /tmp/junk.bak
matz
-l (小写字母“l”)。启用自动行尾处理,这意味着首先将 $\ 设置为 $/ 的值,然后使用 chomp! 剪切读取的每一行。
-n 使 Ruby 假定在脚本周围执行以下循环,从而使其迭代文件名参数,类似于 sed -n 或 awk。
while gets
...
end
-p 与 -n 选项大致相同,但在每个循环的结尾打印变量 $_ 的值。例如:
% echo matz | ruby -p -e '$_.tr! "a-z", "A-Z"'
MATZ
-r library 使用 require 加载库。在使用 -n 或 -p 时很有用。
-s 启用开关解析,用于解析脚本名称后的开关(但在任何文件名参数或 `--` 之前)。找到的任何开关都将被从 ARGV 中移除,并将其对应的变量设置为脚本中的值。例如:
#! /usr/local/bin/ruby -s
# 如果使用 `-xyz` 开关调用,则打印 “true”。
print "true\n" if $xyz
-v 启用详细模式。Ruby 将在开头打印其版本,并将变量 `$VERBOSE` 设置为 true。如果此变量为 true,则某些方法会打印额外的消息。如果提供了此开关,并且没有其他开关,则 Ruby 在打印其版本后退出。
-w 启用详细模式,但不打印开头的版本消息。它将变量 `$VERBOSE` 设置为 true。
-x[directory] 告诉 Ruby 脚本嵌入在消息中。将丢弃前导的垃圾内容,直到找到以“#!”开头且包含字符串“ruby”的行。该行中包含的任何有意义的开关都将被应用。脚本的结尾必须通过以下方式指定:EOF、^D(控制-D)、^Z(控制-Z)或保留字 `__END__`。如果指定了目录名称,Ruby 将在执行脚本之前切换到该目录。
-y
--yydebug 此选项不保证兼容。
启用编译器调试模式。Ruby 将在编译期间打印大量内部状态消息。仅当您要调试 Ruby 解释器时,才指定此开关。
--disable-FEATURE
--enable-FEATURE
禁用(或启用)指定的 FEATURE。
--disable-gems
--enable-gems 禁用(或启用)RubyGems 库。默认情况下,Ruby 会加载每个已安装 gem 的最新版本。如果启用了 RubyGems,则 Gem 常量为 true,否则为 false。
--disable-rubyopt
--enable-rubyopt 忽略(或考虑)RUBYOPT 环境变量。默认情况下,Ruby 会考虑此变量。
--disable-all
--enable-all 禁用(或启用)所有功能。
--dump=target 转储一些信息。
打印指定的 target。target 可以是以下之一:
version 打印版本描述(与 --version 相同)。
usage 打印简短的使用消息(与 -h 相同)。
help 显示完整的帮助消息(与 --help 相同)。
syntax 检查语法(与 -c --yydebug 相同)。
或者,以下是用于调试解释器的选项:
yydebug 启用编译器调试模式(与 --yydebug 相同)。
parsetree 打印 Ruby 程序的 Ruby AST 的文本表示形式。
parsetree_with_comment 打印 Ruby 程序的 Ruby AST 的文本表示形式,并在每个节点中添加相关的 Ruby 源代码。
insns 打印已反汇编的字节码指令列表。
insns_without_opt 在应用各种优化之前,打印已反汇编的字节码指令列表。
--verbose 启用详细模式,但不打印开头的版本消息。它将变量 `$VERBOSE` 设置为 true。如果提供了此开关,并且没有脚本参数(脚本文件或 -e 选项),则 Ruby 立即退出。
--crash-report=template
设置保存崩溃报告的路径名称模板。 详情请参阅 RUBY_CRASH_REPORT 环境变量。
环境变量
RUBYLIB 一个以冒号分隔的目录列表,这些目录会被添加到 Ruby 的库加载路径 ($:) 中。
此环境变量中的目录会在标准加载路径之前被搜索。
例如:
RUBYLIB="$HOME/lib/ruby:$HOME/lib/rubyext"
RUBYOPT 附加的 Ruby 选项。
例如:
RUBYOPT="-w -Ke"
请注意,RUBYOPT 只能包含 -d、-E、-I、-K、-r、-T、-U、-v、-w、-W、--debug、--disable-FEATURE 和 --enable-FEATURE。
RUBYPATH 一个以冒号分隔的目录列表,当指定 -S 标志时,Ruby 会搜索这些目录中的 Ruby 程序。 此变量优先于 PATH 环境变量。
RUBYSHELL 系统 shell 命令的路径。 此环境变量仅对 mswin32、mingw32 和 OS/2 平台启用。 如果未定义此变量,Ruby 将引用 COMSPEC。
PATH Ruby 在调用 Kernel#system 时会引用 PATH 环境变量。
并且,除非禁用 RubyGems,否则 Ruby 依赖于一些与 RubyGems 相关的环境变量。 请参阅 gem(1) 的帮助信息,如下所示。
% gem help
GC 环境变量
Ruby 的垃圾回收器 (GC) 跟踪固定大小的槽中的对象,但每个对象可能都有辅助内存分配,由 C 标准库中的 malloc 系列函数 (malloc(3)、calloc(3) 和 realloc(3)) 处理。 在本文档中,“堆”指的是固定大小槽的 Ruby 对象堆,而“malloc”指的是通常被称为“进程堆”的辅助分配。 因此,至少有两种可能的方式来触发 GC:
1 达到对象限制。
2 达到 malloc 限制。
在 Ruby 2.1 中,引入了分代 GC,并将限制划分为年轻代和旧代,从而提供了两种额外的触发 GC 的方式:
3 达到旧对象限制。
4 达到旧 malloc 限制。
当前,GC 可以通过以下 11 个环境变量在 4 个可能的区域进行调整: RUBY_GC_HEAP_INIT_SLOTS 初始分配槽。 适用于所有槽大小。 引入于 Ruby 2.1,默认值:10000。
RUBY_GC_HEAP_%d_INIT_SLOTS 特定堆中初始分配的槽。 可用堆可以在 `GC.stat_heap` 的键中找到。 引入于 Ruby 3.3。
RUBY_GC_HEAP_FREE_SLOTS GC 之后,至少准备这么多的槽。 如果槽不足,则分配此数量的槽。 引入于 Ruby 2.1,默认值:4096。
RUBY_GC_HEAP_GROWTH_FACTOR 按此因子增加堆槽的分配速率。 引入于 Ruby 2.1,默认值:1.8,最小值:1.0(不增长)。
RUBY_GC_HEAP_GROWTH_MAX_SLOTS 分配速率限制在此数量的槽位内,防止由于
RUBY_GC_HEAP_GROWTH_FACTOR导致过度分配。于 Ruby 2.1 中引入,默认值:0(无限制)
RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR 当旧对象的数量超过 R \* N 时,执行完全 GC,其中 R 是此因子,N 是上次完全 GC 后的旧对象数量。于 Ruby 1.1 中引入,默认值:2.0
RUBY_GC_MALLOC_LIMIT 来自 malloc 系列的年轻代分配的初始限制。当达到此限制时,GC 将开始。默认值:16MB
RUBY_GC_MALLOC_LIMIT_MAX 来自 malloc 的年轻代分配的最大限制,在 GC 开始之前。防止由于 RUBY\_GC\_MALLOC\_LIMIT\_GROWTH\_FACTOR 导致过度 malloc 增长。于 Ruby 2.1 中引入,默认值:32MB。
RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR 增加来自 malloc 的年轻代分配的限制,降低 GC 频率,但增加 malloc 增长,直到
RUBY_GC_MALLOC_LIMIT_MAX 达到。于 Ruby 1 中引入,默认值:1.4,最小值:1.0(无增长)
RUBY_GC_OLDMALLOC_LIMIT 来自 malloc 的旧代分配的初始限制,当达到此限制时,将开始进行完全 GC。于 Ruby 2.1 中引入,默认值:16MB
RUBY_GC_OLDMALLOC_LIMIT_MAX 来自 malloc 的旧代分配的最大限制,在开始进行完全 GC 之前。防止由于 RUBY\_GC\_OLDMALLOC\_LIMIT\_GROWTH\_FACTOR 导致过度 malloc 增长。于 Ruby 2.1 中引入,默认值:128MB
RUBY_GC_OLDMALLOC_LIMIT_GROWTH_FACTOR 增加来自 malloc 的旧代分配的限制,降低完全 GC 的频率,但增加 malloc 增长,直到 RUBY\_GC\_OLDMALLOC\_LIMIT\_MAX 达到。于 Ruby 2.1 中引入,默认值:1.2,最小值:1.0(无增长)
堆栈大小环境变量
堆栈大小环境变量取决于实现,并且可能会随着不同版本的 Ruby 而改变。VM 堆栈用于纯 Ruby 代码,并由虚拟机管理。机器堆栈由操作系统使用,其使用方式取决于 C 扩展以及 C 编译器选项。使用这些环境变量的较低值可能会使应用程序能够运行更多的 Fiber 或线程;但会增加 SystemStackError 异常和段错误(SIGSEGV)的风险。这些环境变量自 Ruby 2.0.0 起可用。所有值都以字节为单位。
RUBY_THREAD_VM_STACK_SIZE VM 堆栈大小,在线程创建时使用。默认值:524288(32 位 CPU)或 1048575(64 位)
RUBY_THREAD_MACHINE_STACK_SIZE 机器堆栈大小,在线程创建时使用。默认值:524288 或 1048575
RUBY_FIBER_VM_STACK_SIZE VM 堆栈大小,在 fiber 创建时使用。默认值:65536 或 131072
RUBY_FIBER_MACHINE_STACK_SIZE 机器堆栈大小,在 fiber 创建时使用。默认值:262144 或 524288
崩溃报告环境变量
RUBY_CRASH_REPORT 用于保存崩溃报告的路径名称的模板。默认值:无
崩溃报告文件的命名
模板可以包含 % 规范符,这些规范符会在创建崩溃报告文件时被以下值替换:
%% 一个百分号字符。
%e 可执行文件的基本名称。
%E 可执行文件的路径名,斜杠 (/) 替换为感叹号 (!)。
%f 程序名称的基本名称,$0。
%F 程序名称的路径名,$0,斜杠 (/) 替换为感叹号 (!)。
%p 转储进程的 PID。
%t 转储时间,以自 1970-01-01 00:00:00 +0000 (UTC) 以来的秒数表示。
%NNN 一个八进制字符代码。
模板末尾的单个 % 会从核心文件名中删除,并且任何以 % 开头,后跟上述列表中任何字符以外的其他字符的组合也会被删除。模板中的所有其他字符都将成为核心文件名的字面部分。模板可以包含 '/' 字符,这些字符将被解释为目录分隔符。
将崩溃报告管道传输到程序
如果该文件的第一个字符是管道符号 (|),则该行的其余部分将被解释为要执行的程序(或脚本)的命令行。
在扩展模板参数之前,管道模板将根据空格拆分为参数列表。
参见
https://www.ruby-lang.org/ 官方网站。
https://www.ruby-toolbox.com/ 全面的 Ruby 库目录。
报告漏洞
安全漏洞应通过电子邮件发送至 _. 报告的问题将在修复后发布。
其他错误和功能请求可以通过 Ruby 问题跟踪系统 (https://bugs.ruby-lang.org/) 报告。请勿通过此系统报告安全漏洞,因为它会立即发布漏洞。
作者
Ruby 由 Yukihiro Matsumoto <_> 设计和实现。
请参阅 ⟨https://github.com/ruby/ruby/graphs/contributors⟩,了解 Ruby 的贡献者。