比较数字和它的字符串表示

21
val1 = 1
val2 = "1"

if val1 == val2 #< Question is in this line
end
如何比较数字和它的字符串表示形式?
4个回答

37

将其中一个转换为另一个,因此可以是:

val1.to_s == val2 # returns true

或者:

val1 == val2.to_i # returns true

虽然 Ruby 是动态类型(类型在运行时确定)的,但它也是强类型的(类型不会隐式转换)


11
我会选择第一个建议(将整数更改为字符串),因为如果您使用to_i将字符串例如“9abc”转换为整数,则会返回整数9,这可能不合适,并且可能会导致错误,如果这不是您的意图。 - ehsanul

7
假设您不知道其中任何一个是nil,是一个字母数字字符串还是空字符串,我建议将两个值都转换为字符串,然后进行比较。
val1.to_str    == val2.to_str => true
nil.to_str     == "".to_str   => true
"ab123".to_str == 123.to_str  => false

1
这个问题的一个重要补充:

(保留 HTML 标签)
Integer(val1) == Integer(val2)

我来这里寻找一个简短的解决方案,不是很明确,但据我所知这是最安全的方法。

Integer("123a") # ArgumentError: invalid value for Integer(): "123a"

3
小心!如果你没有指定基数,那么以“0”开头的字符串将被解释为八进制数!https://ruby-doc.org/core-2.2.3/Kernel.html#method-i-Integer - David Winiecki
我猜@david的意思是'123a'也可以是一个有效的整数。考虑'123a'.to_i(16)。一个更好的例子可能是Integer("hello") # ArgumentError: invalid value for Integer(): "hello" - Cadoiz
这是很久以前的事情了,但我记得我指的是这个:Integer('010') 返回 8。(至少在 Ruby 2.7.5 上,可能也适用于其他版本,无论是旧版还是新版。) - David Winiecki

1

finishing_moves gem有一个#same_as方法,可以在不进行任何类型转换的情况下执行比较。

val1 = 1
val2 = "1"

val1.same_as val2
# => True

val2.same_as val1
# => True

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接