简介
虽然你创建的每个程序都会包含多种数据类型,但重要的是要记住,你一般会在同一数据类型中进行操作。也就是说,你将对数字进行数学运算,或将字符串连接在一起。
有时,数据来自外部来源,如键盘、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
为了证明这一点,创建一个小程序,提示两个数字并显示其总和。创建一个名为adder.rb 的新Ruby程序,代码如下。
adder.rb
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
Output
What is the first number? 5
What is the second number? 5
55
这个程序说,5 和5 的总和是55 。你知道这是不对的,但计算机在技术上并没有错。程序提示了两个数字,但你在键盘上输入了它们。你并没有发送数字5 ;你发送的是字符"5" 。换句话说,你的程序把你的两个输入都看作是字符串,当你把字符串"5" 和"5" 加在一起时,你得到一个新的字符串,"55" 。
为了避免这种情况,将这两个字符串转换为数字。修改你的程序,使其通过使用to_f 方法将两个数字转换为浮点数。
adder.rb
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
这一次,输出会有所不同。
Output
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
Output
123
在这个例子中,将字符串"123abc" 转换为整数的结果是整数123 。to_i 方法一旦到达第一个非数字字符就会停止。 Ruby网络开发者利用这一点,创建了类似于15-sammy-shark 的URL,其中15 是一个内部ID,用于查询记录,但sammy-shark 在URL中给出了一个文本描述。当Ruby用to_i 将15-sammy-shark 转换为整数时,其结果是15 ,而-sammy-shark 部分被截断并丢弃了。然后,这个整数可以用来从数据库中检索该记录。
下面是另一个整数行为的例子,可以让你措手不及。
"abc".to_i
Output
0
在这个例子中,to_i 方法返回0 ,因为字符串中没有一个字符可以被转换。这可能会导致不受欢迎的行为;如果用户在你的程序中输入"abc" ,而你将该值转换为整数并以该值除以某个数字,你的程序就会崩溃,因为它不能除以0。
Ruby提供了另一种方法来执行这种转换。你可以使用Integer 和Float 方法来代替转换数据。
Integer("123")
Output
123
如果你传递给Integer 方法一个不能被转换的值,Ruby将引发一个错误。
Integer("123abc")
Output
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 的文件,内容如下。
calories.rb
user = "Sammy"
calories = 100
print "Congratulations, " + user + "! You just burned " + calories + " calories during this workout."
你在这个程序中硬编码了名字和卡路里,但在真正的程序中,你会从另一个来源检索这些值。
运行下面的程序。
ruby calories.rb
当你运行这个程序时,你会遇到一个错误信息。
Output
...
TypeError: no implicit conversion of Integer into String (TypeError)
Ruby不会让你把calories 这个变量添加到其余的输出中,因为它是一个整数。你不能通过在它周围加引号把它改成一个字符串,因为卡路里数据可能来自你不控制的地方。相反,你需要把卡路里数据转换为字符串,这样你就可以把它和其他的输出连接起来。
修改输出行,使其通过使用to_s 方法将calories 转换为字符串。
calories.rb
user = "Sammy"
calories = 100
print "Congratulations, " + user + "! You just burned " + calories.to_s + " calories during this workout."
再次运行该程序,你会收到你所期望的输出。
Output
Congratulations, Sammy! You just burned 100 calories during this workout.
另一个选择是使用Ruby的字符串插值功能,它可以为你自动将对象转换为字符串。
重写你的程序的输出行,用字符串插值代替。
calories.rb
print "Congratulations, #{user}! You just burned #{calories} calories during this workout."
再次运行该程序。你会注意到使用字符串插值方法的输出是一样的。
Ruby对象都提供了他们自己的to_s 实现,这对输出来说可能是足够的,也可能不是。你可能要写自己的代码来获得你所寻找的输出,或者研究其他方法来格式化数据。
注意:Ruby对象也提供了inspect 方法,这对于调试来说是非常好的。inspect 方法的工作原理与to_s 一样。它通常返回对象及其数据的一个字符串表示。你不会在生产应用中使用inspect ,但当你在写代码时查看一个变量时,你可以和puts 一起使用它。
接下来,你将学习如何将字符串转换为数组。
将字符串转换为数组
如果你有一个字符串,你可以使用split 方法将其转换为数组。
"one two three".split
Output
["one", "two", "three"]
你可以通过将字符作为参数传给split 方法来指定你要使用的分隔符。
创建一个名为data_import.rb 的程序,其中包含一串鲨鱼,用逗号分隔。该程序接收数据,将其转换为数组,对其进行排序,并将每个元素打印到屏幕上。
data = "Tiger,Great White,Hammerhead,Whale,Bullhead"
# Convert data to an array by splitting on commas
sharks = data.split(",")
# Sort the sharks alphabetically
sharks = sharks.sort!
# Print out the sharks by iterating through the array
sharks.each{|shark| puts shark }
运行该程序。
ruby data_import.rb
这就是输出结果。
Output
Bullhead
Great White
Hammerhead
Tiger
Whale
Ruby的数组是强大的数据结构。这展示了使用它们来处理数据的一种方法。
最后,你现在可以学习如何在字符串和符号之间转换。
在字符串和符号之间进行转换
偶尔你会想把一个符号转换成一个字符串,这样你就可以显示它,有时你会想把一个字符串转换成一个符号,这样你就可以用它来在哈希中查找一些东西。
Ruby的to_s 方法也适用于符号,所以你可以将符号转换成字符串。
:language.to_s
Output
"language"
如果你需要显示一个符号并想改变它的显示方式,这就很方便了。例如,下面的程序将符号:first_name ,并将其转换为字符串"First name" ,这更便于人类阅读。
string = :first_name.to_s
# replace underscore with a space and capitalize
string = string.gsub("_"," ").capitalize
要将一个字符串转换为一个符号,请使用to_sym 方法,像这样。
"first_name".to_sym
Output
:first_name
要将字符串"First name" ,并将其转换为符号:first_name ,你要将所有的字母小写,并用下划线代替空格。
string = "First name"
# replace spaces with underscores and convert to lowercase
string = string.gsub(" ","_").downcase
# Convert to symbol
symbol = string.to_sym
你会发现你想做这些转换的情况,无论是在屏幕上以人性化的格式显示一个符号,还是在一个使用符号的哈希中使用一个字符串来查询一个键。
总结
本教程演示了如何使用内置方法将几种重要的本地数据类型转换为其他数据类型。现在你可以将数字转换为字符串,将字符串转换为数组,并在符号和字符串之间进行转换。