Powiedzmy '123'
, że mam ciąg znaków i chcę go zamienić na liczbę całkowitą 123
.
Wiem, że można po prostu zrobić some_string.to_i
, ale który konwertuje 'lolipops'
do 0
, który nie jest efektem mam na myśli. Chcę, żeby wybuchło mi w twarz, kiedy próbuję przerobić coś nieważnego, na przyjemny i bolesny Exception
. W przeciwnym razie nie mogę odróżnić prawidłowego od 0
czegoś, co w ogóle nie jest liczbą.
EDYCJA: Szukałem standardowego sposobu zrobienia tego, bez sztuczek regex.
^
i$
mają nieco inne znaczenia jako metachary niż w większości innych rodzajów wyrażeń regularnych. Prawdopodobnie masz zamiar użyć\A
i\Z
zamiast tego.\z
zamiast znaku\Z
Z jako opisu zakotwiczenia Z wielką literą: „Dopasowuje koniec ciągu. Jeśli ciąg kończy się znakiem nowej linii, dopasowuje się tuż przed nowąNależy również pamiętać o wpływie, jaki obecnie akceptowane rozwiązanie może mieć na analizę liczb szesnastkowych, ósemkowych i binarnych:
W liczbach Ruby, które rozpoczynają się
0x
lub0X
są hex,0b
albo0B
są binarne, a tylko0
są ósemkowym. Jeśli nie jest to pożądane zachowanie, możesz chcieć połączyć to z niektórymi innymi rozwiązaniami, które najpierw sprawdzają, czy ciąg pasuje do wzorca. Podobnie jak/\d+/
wyrażenia regularne itp.źródło
Kolejne nieoczekiwane zachowanie z zaakceptowanym rozwiązaniem (z 1.8, 1.9 jest ok):
więc jeśli nie masz pewności, co jest przekazywane, dodaj rozszerzenie
.to_s
.źródło
Podoba mi się odpowiedź Myrona, ale cierpi ona na chorobę Ruby: „Nie używam już Java / C #, więc nigdy więcej nie będę używać dziedziczenia” . Otwieranie dowolnej klasy może być najeżone niebezpieczeństwami i powinno być używane oszczędnie, zwłaszcza gdy jest to część podstawowej biblioteki Rubiego. Nie mówię, że nigdy go nie używaj, ale zwykle jest to łatwe do uniknięcia i dostępne są lepsze opcje, np
Wtedy, gdy chcesz użyć łańcucha, który może być liczbą, jasne jest, co robisz i nie przebijasz żadnej klasy podstawowej, np.
Podczas inicjalizacji możesz dodać różnego rodzaju inne sprawdzenia, takie jak sprawdzanie liczb binarnych itp. Najważniejsze jest jednak to, że Ruby jest dla ludzi, a bycie dla ludzi oznacza przejrzystość . Nazywanie obiektu poprzez nazwę jego zmiennej i nazwę klasy sprawia, że wszystko jest dużo jaśniejsze.
źródło
Musiałem sobie z tym poradzić w moim ostatnim projekcie, a moja realizacja była podobna, ale trochę inna:
źródło
Prawdopodobnie nie jest to najczystszy sposób, ale powinien działać.
źródło
Re: odpowiedź Chrisa
Twoja implementacja pozwala na przejście przez takie rzeczy jak „1a” lub „b2”. A może zamiast tego:
To daje:
źródło
\z
zamiast znaku\Z
zakotwiczenia Z wielką literą: „Dopasowuje koniec ciągu. Jeśli ciąg kończy się znakiem nowej linii, pasuje tuż przed nową