Ruby数据类型转换完全指南:从入门到精通
引言在您创建的每个程序中,将包含多种数据类型,但需要牢记的是,通常您将在相同的数据类型中执行操作。也就是说,您将对数字进行数学运算,或将字符串连接在一起。
有时数据来自外部来源,如键盘、API响应或数据库,你需要将其转换以便使用。Ruby提供了几种方法可以将一个数据类型的值转换为另一个数据类型。在本教程中,你将把字符串转换为数字,对象转换为字符串,字符串转换为数组,并在字符串和符号之间进行转换。
将字符串转换为数字Ruby提供了`to_i`和`to_f`方法,用于将字符串转换为数字。`to_i`将字符串转换为整数,`to_f`将字符串转换为浮点数。
"5".to_i # 5
"55.5".to_i # 55
"55.5".to_f # 55.5
"5".to_i # 5
"55.5".to_i # 55
"55.5".to_f # 55.5
为了证明这一点,创建一个小程序,提示输入两个数字并显示它们的和。创建一个名为adder.rb的新的Ruby程序,其中包含以下代码:
print "What is the first number? "
first_number = gets.chop
print "What is the second number? "
second_number = gets.chop
sum = first_number + second_number
print sum
运行程序时,你可能会得到一个意想不到的答案。
- ruby adder.rb
What is the first number? 5 What is the second number? 5 55
这个程序显示5和5的和是55。你知道这是不对的,但从技术上来说,计算机并没有错。程序提示你输入两个数字,但你在键盘上输入了它们。你没有发送数字5,而是发送字符”5″。换句话说,你的程序将你的输入都视为字符串,当你将字符串”5″和”5″相加时,得到的是一个新的字符串”55″。
为了避免这种情况,将这两个字符串转换为数字。通过使用to_f方法,修改你的程序,使其将两个数字都转换为浮点数。
print "What is the first number? "
first_number = gets.chop
print "What is the second number? "
second_number = gets.chop
# convert strings to numbers
first_number = first_number.to_f
second_number = second_number.to_f
sum = first_number + second_number
print sum
再次运行程序
- ruby adder.rb
这一次,结果将会不同。
What is the first number? 5 What is the second number? 5 10.0
当你输入5和再次输入5时,你将得到10.0。
当字符串不是数字时,to_i和to_f方法会有一些有趣的行为。例如:
"123-abc".to_i
123
在这个例子中,将字符串”123-abc”转换为整数将得到整数123。to_i方法在遇到第一个非数字字符时停止。Ruby网络开发者通过创建像15-sammy-shark这样的URL来利用这一点,其中15是用于查找记录的内部ID,而sammy-shark在URL中提供了文本描述。当Ruby将15-sammy-shark转换为整数时,结果是15,而-sammy-shark部分被截断和丢弃。然后可以使用整数从数据库中检索记录。
这是另一个整数行为的例子,它可能会让你措手不及:
"abc".to_i
这是文章《如何在Ruby中进行数据类型转换》的第2部分(共4部分)。
在这个例子中,由于字符串中的字符无法转换,to_i
方法返回0。这可能导致不希望的行为;如果用户在您的程序中输入”abc”,并且您将该值转换为整数并将某个数值除以该值,您的程序将崩溃,因为它无法除以零。
Ruby提供另一种执行此转换的方式。您可以使用Integer
和Float
的方法来转换数据:
Integer("123")
123
如果你给Integer
方法传入一个无法转换的值,Ruby会引发一个错误。
Integer("123abc")
ArgumentError: invalid value for Integer(): "123abc"
您可以处理错误,并向用户提供一条信息,要求他们提供更好的数据。这种方法不太方便,但可以使数据完整性更好,因为您的数据不会被强制改变。
接下来,您将学习如何将其他类型的数据转换为字符串。
将数据转换为字符串
Ruby提供了to_s
方法,将任何其他类型转换为字符串。
25.to_s # "25"
(25.5).to_s # "25.5"
["Sammy", "Shark"].to_s # "[\"Sammy\", \"Shark\"]"
在创建程序输出时,您经常需要将数据转换为字符串。
假设你想在锻炼后追踪一个人每天燃烧的卡路里。你希望将这个进展展示给用户,这意味着你需要同时输出字符串和数字值。
创建一个名为calories.rb
的文件,文件内容如下:
user = "Sammy"
calories = 100
print "恭喜您," + user + "!您刚刚在这次锻炼中燃烧了 " + calories + " 卡路里。"
在这个程序中,你正在硬编码名称和热量,但在真实的程序中,你会从另一个来源(比如数据库或API)中获取这些值。
运行以下程序:
- ruby calories.rb
当你运行这个程序时,你会遇到一个错误信息。
... TypeError: no implicit conversion of Integer into String (TypeError)
Ruby不允许您将卡路里变量添加到其余的输出中,因为它是一个整数。您不能通过在其周围加引号来将其更改为字符串,因为卡路里数据可能来自您无法控制的地方。相反,您需要将卡路里数据转换为字符串,以便将其与其余的输出连接起来。
使用to_s
方法将输出行修改为将卡路里转换为字符串。
user = "Sammy"
calories = 100
print "恭喜您," + user + "!您刚刚在这次锻炼中燃烧了 " + calories.to_s + " 卡路里。"
再次运行程序,你将会得到预期的输出。
恭喜您,Sammy!您刚刚在这次锻炼中燃烧了 100 卡路里。
另一个选择是使用Ruby的字符串插值功能,它会自动将对象转换为字符串。
请使用字符串插值(string interpolation)重写您程序的输出行。
print "恭喜,#{user}!您在这次锻炼中燃烧了#{calories}卡路里。"
重新运行程序。你会注意到使用字符串插值方法的相同输出。
Ruby对象都提供了自己的to_s实现,但这可能不一定适合输出。您可能需要编写自己的代码来获取所需的输出,或者调查其他方法来格式化数据。
注意
将字符串转换为数组
如果你有一个字符串,你可以使用split方法将其转换为数组。
"one two three".split
["one", "two", "three"]
通过将它作为参数传递给拆分方法,您可以指定要用作分隔符的字符。
创建一个名为data_import.rb的程序,其中包含一个由逗号分隔的鲨鱼字符串。该程序将数据转换为数组,进行排序,并将每个元素打印到屏幕上。
data = "Tiger,Great White,Hammerhead,Whale,Bullhead"
# 通过逗号分割将数据转换为数组
sharks = data.split(",")
# 按字母顺序对鲨鱼进行排序
sharks = sharks.sort!
# 通过遍历数组打印出鲨鱼
sharks.each{|shark| puts shark }
运行程序。
ruby data_import.rb
这是输出结果。
Bullhead
Great White
Hammerhead
Tiger
Whale
Ruby的数组是强大的数据结构。这展示了使用数组处理数据的一种方式。
最后,你现在可以学习如何在字符串和符号之间进行转换。
在字符串和符号之间进行转换
有时候您会想要将一个符号转换为字符串以便展示它,有时候您也会想要将一个字符串转换为符号以便在哈希表中查找某个东西。
Ruby的to_s方法也可以用在符号上,因此你可以将符号转换为字符串。
:language.to_s
"language"
如果你需要显示一个符号并且想要改变它的外观,这将非常有用。例如,下面的程序将符号:first_name转换为可读性更高的字符串”名字”。
string = :first_name.to_s
# 用空格替换下划线并首字母大写
string = string.gsub("_"," ").capitalize
要将字符串转换为符号,可以使用 to_sym 方法,像这样:
"first_name".to_sym
:first_name
:first_name
将字符串”First name”转换为符号:first_name,需将所有字母改为小写,并用下划线替换空格。
string = "First name"
# 用下划线替换空格并转换为小写
string = string.gsub(" ","_").downcase
# 转换为符号
symbol = string.to_sym
无论是在屏幕上以人类友好的格式显示符号,还是在使用符号作为键的哈希中通过字符串查找键,您都会发现有时需要进行这些转换。
结论
本教程演示了如何使用内置方法将几种重要的Ruby数据类型转换成其他数据类型。现在您可以把数字转换成字符串,字符串转换成数组,并在符号和字符串之间进行转换。
查看这些教程,以继续探索Ruby的数据类型。
- 如何在Ruby中处理字符串
- 如何在Ruby中处理数组