如何在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

为了证明这一点,创建一个小程序,提示输入两个数字并显示它们的和。创建一个名为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

运行程序时,你可能会得到一个意想不到的答案。

  1. 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方法,修改你的程序,使其将两个数字都转换为浮点数。

加法器.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

再次运行程序

  1. 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

在这个例子中,将字符串”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
Output

0

在这个例子中,由于字符串中的字符无法转换,to_i方法返回0。这可能导致不希望的行为;如果用户在您的程序中输入”abc”,并且您将该值转换为整数并将某个数值除以该值,您的程序将崩溃,因为它无法除以零。

Ruby提供另一种执行此转换的方式。您可以使用整数和浮点数的方法来转换数据:

Integer("123")
Output

123

如果你给整数方法传入一个无法转换的值,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的文件,文件内容如下:

卡路里.rb
user = "Sammy"
calories = 100

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

在这个程序中,你正在硬编码名称和热量,但在真实的程序中,你会从另一个来源(比如数据库或API)中获取这些值。

运行以下程序:

  1. ruby calories.rb

 

当你运行这个程序时,你会遇到一个错误信息。

Output

… TypeError: no implicit conversion of Integer into String (TypeError)

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

使用to_s方法将输出行修改为将卡路里转换为字符串。

卡路里.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的字符串插值功能,它会自动将对象转换为字符串。

请使用字符串插值(string interpolation)重写您程序的输出行。

卡路里计算器.rb
print "Congratulations, #{user}! You just burned #{calories} calories during this workout."

重新运行程序。你会注意到使用字符串插值方法的相同输出。

Ruby对象都提供了自己的to_s实现,但这可能不一定适合输出。您可能需要编写自己的代码来获取所需的输出,或者调查其他方法来格式化数据。

Note

注意: Ruby对象还提供了inspect方法,这对于调试非常有用。inspect方法的工作原理和to_s方法类似。它通常返回对象及其数据的字符串表示。在生产应用中不会使用inspect,但在编写代码时,可以在查看变量时使用puts和inspect方法。

接下来,你会学习如何将字符串转换为数组。

将字符串转换为数组

如果你有一个字符串,你可以使用split方法将其转换为数组。

"one two three".split
Output

[“one”, “two”, “three”]

通过将它作为参数传递给拆分方法,您可以指定要用作分隔符的字符。

创建一个名为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 }

运行程序。

  1. ruby data_import.rb

 

这是输出结果。

Output

Bullhead Great White Hammerhead Tiger Whale

Ruby的数组是强大的数据结构。这展示了使用数组处理数据的一种方式。

最后,你现在可以学习如何在字符串和符号之间进行转换。

在字符串和符号之间进行转换

有时候您会想要将一个符号转换为字符串以便展示它,有时候您也会想要将一个字符串转换为符号以便在哈希表中查找某个东西。

Ruby的to_s方法也可以用在符号上,因此你可以将符号转换为字符串。

:language.to_s
Output

“language”

如果你需要显示一个符号并且想要改变它的外观,这将非常有用。 例如,下面的程序将符号: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,需将所有字母改为小写,并用下划线替换空格。

string = "First name"

# replace spaces with underscores and convert to lowercase
string = string.gsub(" ","_").downcase

# Convert to symbol
symbol = string.to_sym 

无论是在屏幕上以人类友好的格式显示符号,还是使用字符串在使用符号作为键的哈希中查找键,您会发现有时您需要进行这些转换。

结论是

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

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

  • How to Work with Strings in Ruby
  • How to Work with Arrays in Ruby
发表回复 0

Your email address will not be published. Required fields are marked *


广告
将在 10 秒后关闭
bannerAds