如何在Ruby中转换数据类型

来自菜鸟教程
跳转至:导航、​搜索

介绍

虽然您创建的每个程序都将包含多个 数据类型 ,但请务必记住,您通常会在同一数据类型中执行操作。 也就是说,您将在数字上执行数学运算,或将字符串连接在一起。

有时数据来自外部来源,例如键盘、API 响应或数据库,您需要对其进行转换才能使用它。 Ruby 提供了几种将值从一种数据类型转换为另一种数据类型的方法。 在本教程中,您将字符串转换为数字、对象转换为字符串、字符串转换为数组,以及字符串和符号之间的转换。

将字符串转换为数字

Ruby 提供了 to_ito_f 方法来将字符串转换为数字。 to_i 将字符串转换为整数,to_f 将字符串转换为浮点数。

"5".to_i       # 5
"55.5".to_i    # 55
"55.5".to_f    # 55.5

让我们通过创建一个提示输入两个数字并显示总和的小程序来演示这一点。 使用以下代码创建一个名为 adder.rb 的新 Ruby 程序:

加法器.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
OutputWhat is the first number? 5
What is the second number? 5
55

这个程序说55之和是55。 你知道这是不对的,但计算机在技术上并没有错。 我们的程序提示输入两个数字,但我们在键盘上输入了它们。 我们没有发送号码 5; 我们发送了字符 "5"。 换句话说,我们的程序将两个输入都视为字符串,当您将字符串 "5""5" 相加时,您会得到一个新字符串 "55"

为了避免这种情况,我们必须将两个字符串都转换为数字。 修改您的程序,以便使用 to_f 方法将两个数字转换为浮点数:

加法器.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 运行程序。 这次你会看到这个输出:

OutputWhat is the first number? 5
What is the second number? 5
10.0

当你再次输入55时,这次会得到10.0

当字符串不是数字时,to_ito_f 方法有一些有趣的行为。 看下面的例子:

"123-abc".to_i  # 123

在此示例中,将字符串 "123abc" 转换为整数会得到整数 123to_i 方法在到达第一个非数字字符时停止。 Ruby Web 开发人员通过创建 15-sammy-shark 之类的 URL 来利用这一点,其中 15 是用于查找记录的内部 ID,但 sammy-shark 在 URL 中提供文本描述。 当Ruby用to_i15-sammy-shark转换为整数时,结果是15-sammy-shark部分被截断丢弃。 然后可以使用整数从数据库中检索记录。

这是另一个让你措手不及的整数行为示例:

"abc".to_i     # 0

在此示例中,to_i 方法返回 0,因为字符串中的任何字符都无法转换。 这可能会导致不良行为; 如果用户在您的程序中输入 "abc",并且您将该值转换为整数并将某个数字除以该值,您的程序将崩溃,因为它不能被零除。

Ruby 提供了另一种方法来执行这种转换。 您可以使用 IntegerFloat 方法来转换数据:

Integer("123")  # 123

如果向 Integer 方法传递一个无法转换的值,Ruby 将引发错误:

Integer("123abc")
OutputArgumentError: invalid value for Integer(): "123abc"

然后,您可以处理错误并向用户提供消息,要求他们提供更好的数据。 这种方法不太方便,但它可以带来更好的数据完整性,因为您的数据不会被强制。

接下来我们看看如何将其他类型的数据转换为sttings。

将数据转换为字符串

Ruby 提供了 to_s 方法将任何其他类型转换为字符串:

25.to_s                    # "25"
(25.5).to_s                # "25.5"
["Sammy", "Shark"].to_s    # "[\"Sammy\", \"Shark\"]"

创建程序输出时,您经常将数据转换为字符串。

假设我们想要跟踪一个人在锻炼后每天消耗的卡路里。 我们想向用户展示这个进度,这意味着我们将同时打印出字符串和数值。 使用以下内容创建文件 calories.rb

卡路里.rb

user = "Sammy"
calories = 100

print "Congratulations, " + user + "! You just burned " + calories + " calories during this workout."

我们在这个程序中对名称和卡路里进行了硬编码,但在实际程序中,您会从另一个来源检索这些值。

使用 ruby calories.rb 运行程序。

当你运行这个程序时,你会看到这个错误:

OutputTypeError: no implicit conversion of Integer into String

Ruby 不允许您将 calories 变量添加到输出的其余部分,因为它是一个整数。 我们不能通过在其周围加上引号将其更改为字符串,因为卡路里数据可能来自我们无法控制的某个地方。 相反,我们需要将卡路里数据转换为字符串,以便将其连接到输出的其余部分。

修改输出行,使其使用 to_s 方法将 calories 转换为字符串:

卡路里.rb

user = "Sammy"
calories = 100

print "Congratulations, " + user + "! You just burned " + calories.to_s + " calories during this workout."

再次运行程序,您将看到您期望的输出:

OutputCongratulations, Sammy! You just burned 100 calories during this workout.

Ruby 的 字符串插值 功能会自动为您将对象转换为字符串。 这是在 Ruby 程序中创建输出的首选方法。

重写程序的输出行以改用字符串插值:

卡路里.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   # ["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 alpabetically
sharks = sharks.sort!

# Print out the sharks
sharks.each{|shark| puts shark }

使用 ruby data_import.rb 运行程序,您将看到以下输出:

OutputBullhead
Great White
Hammerhead
Tiger
Whale

Ruby 的数组是强大的数据结构。 这演示了一种使用它们来处理数据的方法。

最后,我们来看看如何在 Strings 和 Symbols 之间进行转换。

字符串和符号之间的转换

您有时希望将 Symbol 转换为 String 以便显示它,有时您希望将 String 转换为 Symbol 以便使用它在 Hash 中查找某些内容。

Ruby 的 to_s 方法也适用于符号,因此您可以将符号转换为字符串。

:language.to_s   # "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   # :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 

您会发现需要进行这些转换的情况,无论是在屏幕上以人类友好的格式显示符号,还是使用字符串在使用符号作为键的散列中查找键。 现在你知道怎么做了。

结论

本教程演示了如何使用内置方法将几种重要的本机数据类型转换为其他数据类型。 您现在可以将数字转换为字符串,将字符串转换为数组,以及在符号和字符串之间进行转换。

查看这些教程以继续探索 Ruby 的数据类型: