Skip to content

Ruby 内建函数

Ruby 核心方法 (通常称为内置函数)

Section titled “Ruby 核心方法 (通常称为内置函数)”

Ruby 的 Kernel 模块被 Object 类包含,使其方法几乎在 Ruby 程序的每个部分都可用。这些方法通常可以不带显式接收者调用(例如,puts "hello" 而不是 self.puts "hello"),这让它们看起来像函数。本章概述了常用的 Kernel 方法和其他重要的核心功能。

一些重要的 Kernel 方法精选:

方法签名描述
abort(message=nil)立即终止程序执行。如果给出 message,则打印到 stderr。如果有一个活跃的异常 ($!),则显示其消息。
Array(object)将 object 转换为 Array。如果 to_ary 可用,则调用它,否则调用 to_a。
at_exit { block }注册一个 block,使其在程序退出时执行。多个块按注册的相反顺序执行。
autoload(module_name, filename)注册 filename,使其在 module_name (字符串或符号) 首次被引用时加载 (使用 require)。
binding返回一个 Binding 对象,表示当前的执行上下文 (变量、方法、self)。与 eval 一起使用时很有用。
block_given?如果当前方法被调用时附带了一个 block,则返回 true,否则返回 false。
caller(start=1, length=nil)以 file:line: in method“ 的格式返回当前的执行堆栈 (backtrace),为一个字符串数组。
catch(tag) { block }提供一种从 block 执行非局部退出 (跳转) 的方式。与 throw(tag, value) 一起使用。
eval(string, binding=TOPLEVEL_BINDING, filename="(eval)", lineno=1)执行 string 中的 Ruby 代码。binding 指定上下文。由于处理不可信输入时存在安全风险,请极端谨慎使用。
exec(command, *args)用指定的 command 替换当前进程。如果成功则不返回。
exit(status=true) / exit!(status=true)exit 终止脚本,运行 at_exit 处理程序和 ensure 子句。exit! 立即终止,不运行处理程序。status 可以是一个整数退出码 (0 表示成功) 或 true/false。
Float(arg, exception: true)将 arg 转换为 Float。除非 exception: false,否则失败时抛出异常。
fork { block }创建一个子进程。block 在子进程中执行。在父进程中返回子进程的 PID,在子进程中返回 nil。并非所有平台都可用 (例如,标准的 Windows Ruby)。
format(format_string, *args) / sprintf(format_string, *args)根据 format_string 和 args 返回格式化后的字符串。参见下面的格式化指令。
gets(separator=$/)从标准输入 (或通过命令行指定的 ARGF 文件) 读取下一行。separator 是行结束符。到达 EOF 时返回 nil。
global_variables返回一个符号数组,表示所有已定义的全局变量的名称。
Integer(arg, base=0, exception: true)将 arg 转换为 Integer。base 指定数字基数。除非 exception: false,否则失败时抛出异常。
lambda { block } / proc { block }从 block 创建一个 Proc 对象。lambda 对参数检查更严格,并且与使用 Proc.new 或 proc 关键字创建的 proc 相比,其 return 行为不同。
load(filename, wrap=false)加载并执行 filename 中的 Ruby 程序。与 require 不同,load 可以多次执行一个文件,并且不跟踪已加载的文件。如果 wrap 为 true,则加载到一个匿名模块中。
local_variables返回一个符号数组,表示当前已定义的局部变量的名称。
loop { block }无限重复执行 block,直到被显式中断 (例如,使用 break 或异常)。
open(path, mode="r", &block)以指定的 mode 打开 path 指定的文件。如果给定了 block,文件对象将被传递给 block,并在 block 完成后自动关闭。如果 path 以 | 开头,则被视为用于管道 I/O 的命令。
p(obj1, obj2, ...)对于每个对象,打印 obj.inspect 后跟一个换行符到 $stdout。用于调试。
print(*args)对每个 arg 调用 to_s 后,将其打印到 $stdout。默认不添加换行符。如果没有给出参数,则打印 $_。
printf(format_string, *args) / printf(io, format_string, *args)根据 format_string 格式化参数 (类似于 sprintf),并打印到 $stdout 或指定的 io 对象。
puts(*args)将每个 arg 打印到 $stdout,并在每个参数后添加一个换行符 (除非参数本身是一个数组,在这种情况下每个元素打印在一行上)。对参数调用 to_s。
raise(exception_class, message, backtrace) / fail(...)抛出一个异常。fail 是 raise 的一个旧别名;建议使用 raise。如果在 rescue 子句内调用时不带参数,可以重新抛出当前异常。
rand(max=0.0)生成一个伪随机数。如果 max 是一个大于 0 的整数,则返回一个从 0 到 max-1 的整数。如果 max 是一个 Float 或 0,则返回一个介于 0.0 和 1.0 (不包含 1.0) 之间的浮点数。如果 max 是一个 Range,则返回该范围内的随机元素。
readline(separator=$/)类似于 gets,但在文件末尾抛出 EOFError。
readlines(separator=$/)读取标准输入 (或 ARGF) 中的所有行,并将其作为字符串数组返回。
require(name) / require_relative(name)require 加载给定的库/文件 (name) 一次。它搜索 Ruby 的加载路径。用于加载 gem 和标准库。require_relative 加载相对于当前文件目录的文件。
select(read_array, write_array=nil, error_array=nil, timeout=nil)执行低级 I/O 多路复用。检查 IO 对象数组的 I/O 就绪状态。
sleep(duration)暂停执行 duration 秒 (可以是浮点数)。如果不带参数,则永远睡眠。
String(arg)通过调用 to_s 将 arg 转换为 String。
system(command, *args)在子 shell 中执行 command。如果命令以状态 0 退出,则返回 true,否则返回 false;如果命令执行失败,则返回 nil。退出状态可在 $? 中获取。
test(cmd, file1, file2=nil)执行文件测试。cmd 是指定测试的字符 (例如,?f 表示普通文件)。为了提高可读性,建议使用 File 类方法 (例如,File.file?)。
throw(tag, value=nil)发起一个非局部退出,跳转到匹配 tag 的 catch 块。value 成为 catch 的返回值。
trap(signal, command_or_proc)为操作系统 signal (例如 'INT', 'TERM') 设置一个处理程序。

这些方法可用于数值对象 (Integer, Float 等的实例)。

#!/usr/bin/env ruby
num_i = -10
num_f = 12.75
puts "整数方法:"
puts "#{num_i}.abs: #{num_i.abs}" # => 10 (绝对值)
puts "#{num_i}.even?: #{num_i.even?}" # => true (是否为偶数)
puts "#{num_i}.odd?: #{num_i.odd?}" # => false (是否为奇数)
puts "5.next: #{5.next}" # => 6 (或 5.succ,下一个整数)
puts "5.times { |i| print "#{i} " }: " ; 5.times { |i| print "#{i} " } ; puts
puts "\n浮点数方法:"
puts "#{num_f}.round: #{num_f.round}" # => 13 (四舍五入)
puts "#{num_f}.floor: #{num_f.floor}" # => 12 (向下取整)
puts "#{num_f}.ceil: #{num_f.ceil}" # => 13 (向上取整)
puts "#{num_f}.truncate: #{num_f.truncate}" # => 12 (截断小数)
puts "\n数值方法 (两者都可用):"
puts "#{num_i}.zero?: #{num_i.zero?}" # => false (是否为零)
puts "0.zero?: #{0.zero?}" # => true (是否为零)
puts "#{num_f}.positive?: #{num_f.positive?}" # => true (是否为正数)
puts "#{num_i}.negative?: #{num_i.negative?}" # => true (是否为负数)

精选的 Numeric, Integer, Float 方法:

方法描述
n.abs返回 n 的绝对值。
n.ceil返回大于或等于 n 的最小整数 (Float)。
n.floor返回小于或等于 n 的最大整数 (Float)。
n.round([digits])将 n 四舍五入到最近的整数,或 digits 指定的小数位数 (Float)。
n.truncate([digits])移除小数部分,返回整数,或截断到 digits 指定的位数 (Float)。
n.to_i / n.to_int将 n 转换为 Integer (对 Float 截断小数)。
n.to_f将 n 转换为 Float。
n.integer?如果 n 是 Integer,则返回 true。
n.float?如果 n 是 Float,则返回 true。
n.zero?如果 n 是零,则返回 true。
n.positive?如果 n 大于零,则返回 true。
n.negative?如果 n 小于零,则返回 true。
int.even?如果 int 是偶数整数,则返回 true。
int.odd?如果 int 是奇数整数,则返回 true。
int.next / int.succ返回整数 int + 1。
int.pred返回整数 int - 1。
int.times { |i| ... }迭代 int 次 block,传入当前迭代次数 (从 0 到 int-1)。
num.step(limit, step_value) { |i| ... }从 num 迭代到 (或迭代到) limit,步长为 step_value。
float.finite?如果 float 是有限数,则返回 true。
float.infinite?正无穷返回 1,负无穷返回 -1,否则返回 nil。
float.nan?如果 float 是非数字 (NaN),则返回 true。

Math 模块提供了一系列三角函数、对数函数和其他数学函数。这些函数通常以 Math.函数名(参数) 的形式调用。

函数 (位于 Math 模块)描述
Math.sqrt(x)返回 x 的非负平方根 (x 必须是非负数)。
Math.log(x) / Math.log(x, base)返回 x 的自然对数,或以 base 为底 x 的对数。
Math.log10(x)返回 x 的以 10 为底的对数。
Math.exp(x)返回 e (欧拉数) 的 x 次幂。
Math.sin(x), Math.cos(x), Math.tan(x)x 的三角函数正弦、余弦、正切 (参数单位为弧度)。
Math.asin(x), Math.acos(x), Math.atan(x)反三角函数。
Math.atan2(y, x)y/x 的反正切,使用 x 和 y 的符号确定象限。
Math::PI圆周率 Pi 的常量 (约 3.14159…)。
Math::E欧拉数 E 的常量 (约 2.71828…)。

示例:

#!/usr/bin/env ruby
puts "Square root of 16: #{Math.sqrt(16)}" # => 4.0 (16的平方根)
puts "PI: #{Math::PI}" # => 3.14159... (PI)
puts "Cosine of PI: #{Math.cos(Math::PI)}" # => -1.0 (PI的余弦)

sprintf (或 format) 方法在格式字符串中使用转换说明符来确定参数的格式。说明符以 % 开头,可以包含标志、宽度、精度和类型字符。

常用类型字符:

说明符描述
b二进制整数 (基数 2)。
c字符 (将整数参数视为字符编码)。
d 或 i十进制整数 (基数 10)。
u无符号十进制整数。
o八进制整数 (基数 8)。
x十六进制整数 (小写 a-f)。
X十六进制整数 (大写 A-F)。
f定点表示法浮点数 (例如,123.45)。
e科学记数法浮点数 (例如,1.2345e+02)。
E类似于 e,但使用大写 E。
g使用 %e 或 %f 格式中较短的一个。
G使用 %E 或 %f 格式中较短的一个。
s字符串 (对参数调用 to_s)。
p使用 inspect 打印对象 (Ruby 特有)。
%字面量的百分号 (%%)。

标志、宽度和精度示例:

#!/usr/bin/env ruby
puts sprintf("Number: %d, String: %s", 123, "hello") # => "Number: 123, String: hello" (数字: 123, 字符串: hello)
puts sprintf("Padded: %05d", 42) # => "Padded: 00042" (填充零, 宽度 5)
puts sprintf("Float: %.2f", 123.4567) # => "Float: 123.46" (2位小数)
puts sprintf("Hex: %x", 255) # => "Hex: ff" (十六进制)
puts sprintf("Left-justified: |%-10s|", "text") # => "Left-justified: |text |" (左对齐, 宽度 10)

test 函数参数 (建议使用 File 类方法)

Section titled “test 函数参数 (建议使用 File 类方法)”

test(cmd, file1, file2) 函数执行文件测试。虽然可用,但通常建议使用更具可读性和面向对象风格的 File 类方法(例如,File.readable?(file1), File.exist?(file1))。

有关特定方法的更多详细信息,请始终查阅 Ruby 官方文档中 Kernel, Numeric, Integer, Float, 和 Math 模块/类的说明。(Ruby 核心文档)