2009-08-02 11 views

Odpowiedz

28

Konwersja albo do drugiej, więc albo:

val1.to_s == val2 # returns true 

Lub:

val1 == val2.to_i # returns true 

Choć Ruby jest dynamically typed (typ jest znany w środowisku wykonawczym), jest również strongly typed (typ nie robi otrzymujesz domyślnie typecast)

+6

pójdę z pierwszą sugestią (zmiana całkowitą na łańcuch), ponieważ jeśli przekonwertować ciąg jak „9abc” do liczby całkowitej korzystając to_i, dostaniesz z powrotem liczba całkowita 9, która może nie być odpowiednia, i prawdopodobnie prowadzić do błędów, jeśli nie jest to intencją. – ehsanul

3

Zakładając, że nie wiesz, czy jeden z nich byłby zerowy, łańcuch alfanumeryczny lub pusty ciąg, sugeruję konwersję obu stron na łańcuchy i d następnie porównując.

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

Ważnym dodatkiem do tego pytania:

Integer(val1) == Integer(val2) 

Przyszedłem tutaj patrząc na krótki rozwiązanie, nie tak wyraźne, ale to o ile wiem, najbezpieczniejszą drogę.

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

Uważaj! Jeśli nie podasz radix, łańcuchy zaczynające się od "0" będą interpretowane w ósemkowej! https://ruby-doc.org/core-2.2.3/Kernel.html#method-i-Integer –

0

finishing_moves gem ma #same_as metodę, która wykonuje porównania bez konieczności wykonywania jakichkolwiek rzutowania typów.

val1 = 1 
val2 = "1" 

val1.same_as val2 
# => True 

val2.same_as val1 
# => True 
0

Spróbuj

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

Co to oznacza? Jak rozwiązuje problem? – Adam

+0

Proszę dodać więcej informacji do tej odpowiedzi. Co się dzieje? Dlaczego to działa? – Jens

Powiązane problemy