Ruby 中的类型转换

Type-Conversion in Ruby

理论题

我正在尝试寻找新的实用方法将整数转换为字符串,反之亦然。 我只知道 .to_s.to_i; .to_f 方法,想知道是否有其他方法可以在不编写 + 将变量放在一起的情况下进行。例如:

var1 = 16

puts 'I\'m ' + var1.to_s + ' years old.'

在较长的代码中,编写所有这些只是将整数转换为字符串变得很累。

顺便说一下,我还在 Stack 上找到了这个 Timer 程序,#{ 是我正在尝试做的一个例子。在没有 +.to_s 的情况下向字符串添加整数但是我不知道它是如何工作的。

30.downto(0) do |i|
  puts "00:00:#{'%02d' % i}"
  sleep 1
end

提前感谢您的建议!

Ruby 有一个非常强大的字符串插值器功能,使用 #{...} 可以包含相当任意的 Ruby 代码。最终结果总是有效地使用 to_s.

转换为字符串

那就是你可以这样做:

puts "00:00:#{'%02d' % i}"

在其中进行字符串化然后进行插值。

这大致等同于:

i_str = '%02d' % i
puts "00:00:#{i_str}"

有效的地方:

i_str = '%02d' % i
puts "00:00:%s" % i_str

您也可以将其合并为一个操作:

puts "00:00:%02d" % i

你通常使用插值 sprintf 风格的模板字符串,而不是同时使用。它使您的代码更清晰,因为只有一种机制在起作用。

进行连接时需要 .to_s 的唯一原因是 Ruby 对于将两个事物“相加”非常讲究。 x + y 根据 xy 的不同会有完全不同的结果。

考虑:

# Integer + Integer (Integer#+)
1 + 2
# => 3

# Array + Array (Array#+)
[ 1 ] + [ 2 ]
# => [1,2]

# String + String (String#+)
"1" + "2"
# => "12"

请注意,在每种情况下实际上调用的是不同的方法,x + y 的一般形式是:

x.send(:+, y)

所以它实际上是一个方法调用,因此,每个方法都可以通过发出异常来限制它可以操作的内容,如果它不能或不会处理。

这叫做字符串插值。例如:

puts "I\'m #{var1} years old."

它的工作方式是这样的:

  1. 您必须用双引号而不是单引号将字符串括起来。
  2. 你把你的变量放在里面:#{},例如"#{variable}".

这将始终将 non-string 变量转换为字符串,并将它们插入(即插入)到周围的字符串中。