【问题标题】:Type-Conversion in RubyRuby 中的类型转换
【发布时间】:2020-10-01 22:14:39
【问题描述】:

理论问题

我正在尝试寻找新的实用方法将整数转换为字符串,反之亦然。 我只知道.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

提前感谢您的建议!

【问题讨论】:

  • string literals 的文档值得一读。它解释了转义序列、插值、'...'"..." 之间的区别,介绍了%q(...)%Q(...) 等等。

标签: ruby string type-conversion integer


【解决方案1】:

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-style 模板字符串,而不是同时使用两者。它使您的代码更简洁,因为只有一种机制在起作用。

在进行连接时需要.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)

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

【讨论】:

  • 哦,所以'%02d'字符串插值无关
  • 从技术上讲,实际上这是一种形式的插值,但不使用#{...} 字符串插值机制。 Ruby 与 C、Python、Perl 等一样,在使用String#% method 时支持字符串的printf 表示法。它的作用是让您更好地控制该值如何根据模板进行插值。 #{...} 方法要求您自己进行所有格式化。
  • 但我唯一缺少的是d 代表什么?
  • 如果您点击该文档链接,它会链接到full table of placeholders,其中d 表示“作为十进制数的参数”。
  • 另外,我们可以强制一个字符串/整数组合,例如class String;def coerce(other); [other.to_s,self];end;end 然后1 + "s" #=> "1s"(显式强制)或者class Integer; alias_method :to_str, :to_s;end 然后"s" + 1 #=> "s1"(隐式强制)
【解决方案2】:

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

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

它的工作方式是这样的:

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

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

【讨论】:

  • 所以双引号很重要,我不知道。谢谢!
  • 使用双引号时不必转义单引号。 (使字符串更容易阅读)
  • @Stefan 对,你可以在双引号中使用单引号,也可以在单引号中使用双引号,而不需要转义。
猜你喜欢
  • 2018-06-21
  • 1970-01-01
  • 2011-07-31
  • 1970-01-01
  • 2018-09-08
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多