2009-08-02 3 views

ответ

28

Преобразовать либо другой, так как:

val1.to_s == val2 # returns true 

Или:

val1 == val2.to_i # returns true 

Хотя рубин dynamically typed (тип известен во время выполнения), это также strongly typed (тип Безразлично 't получить неявно typecast)

+6

Я бы с первым предложением (изменение целого числа в строку), потому что если вы преобразовать строку как «9abc» в целое число с помощью to_i, вы получаете назад целое число 9, что может оказаться неприемлемым, и, возможно, привести к ошибкам, если это не намерение. – ehsanul

3

Предполагая, что вы не знаете, будет ли один из них ниль, алфавитно-цифровая строка или пустая строка, я предлагаю преобразовать обе стороны в строки и d, затем сравнивая.

val1.to_str == val2.to_str => true 
nil.to_str  == "".to_str => true 
"ab123".to_str == 123.to_str => false 
0

Важное дополнение к этому вопросу:

Integer(val1) == Integer(val2) 

Я приехал сюда в поисках короткого решения, а не как явное, но это, насколько я знаю, самый безопасный способ.

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

Будьте осторожны! Если вы не укажете radix, строки, начинающиеся с «0», будут интерпретироваться в восьмеричном! https://ruby-doc.org/core-2.2.3/Kernel.html#method-i-Integer –

0

finishing_moves камень имеет #same_as метод, который выполняет сравнение без необходимости делать какие-либо типажей.

val1 = 1 
val2 = "1" 

val1.same_as val2 
# => True 

val2.same_as val1 
# => True 
0

Попробуйте

true if Integer(val1) == Integer(val2) rescue false 
+1

Что это делает? Как это решить проблему? – Adam

+0

Пожалуйста, добавьте дополнительную информацию к этому ответу. Что происходит? Почему это работает? – Jens

Смежные вопросы