跳到主要内容

Ruby 数据类型概览

Ruby 是动态类型语言。变量没有固定类型,但对象有类型。你写 Ruby 时,不需要先声明变量类型,但要知道对象支持哪些方法。

查看对象类型

puts 42.class
puts 3.14.class
puts "hello".class
puts :name.class
puts [1, 2, 3].class
puts({ name: "Ruby" }.class)
puts nil.class

输出会显示这些对象所属的类,例如 IntegerFloatStringSymbolArrayHash

常见类型

数字:

age = 18
price = 19.99

字符串:

name = "Ruby"

符号:

status = :ok

数组:

numbers = [1, 2, 3]

哈希:

user = { name: "Alice", age: 18 }

布尔值和 nil:

active = true
deleted = false
value = nil

类型判断

value = "ruby"

puts value.is_a?(String)
puts value.respond_to?(:upcase)

is_a? 判断对象是否属于某个类或其子类。respond_to? 判断对象是否能响应某个方法。

在 Ruby 中,很多时候问“它能不能响应这个方法”比问“它是不是某个具体类”更有用。

类型转换

"42".to_i
"3.14".to_f
42.to_s
:name.to_s
"name".to_sym

Ruby 不会在所有地方自动转换类型:

# "age: " + 18 会报错
puts "age: " + 18.to_s

更常用字符串插值:

age = 18
puts "age: #{age}"

强类型是什么意思

Ruby 是动态类型,但也是强类型。它不会偷偷把所有东西都转换成你想要的类型。

# 不能直接把 String 和 Integer 相加
"1" + 2

这会报错。你需要明确转换:

"1".to_i + 2

小练习

  1. 在 IRB 中分别查看整数、字符串、数组、哈希的 class
  2. respond_to? 判断字符串是否有 upcase 方法。
  3. 把字符串 "100" 转成数字后加 20。

小结

Ruby 变量不固定类型,但对象有类型。写 Ruby 时,你要关注对象能响应哪些方法,并在需要时显式转换类型。