2009-08-13 9 views
42

Jestem w sytuacji, w której potrzebuję wartości ASCII dla znaku (dla Project Euler question #22, jeśli chcesz uzyskać konkretne) i jestem uruchomiony do problemu.Uzyskiwanie kodu znaków ASCII w Rubim przy użyciu znaku `?` (Znak zapytania) kończy się niepowodzeniem

Będąc nowicjuszem w Ruby, szukałem go w Google i stwierdziłem, że ? było drogą: ?A lub coś innego. Ale kiedy włączam go do mojego kodu, wynikiem tego polecenia jest ciąg znaków "A" -nie kod znaku. Ten sam problem z [0] i slice(0), które powinny teoretycznie zwrócić kod ASCII.

Jedyne, co mogę myśleć, to to, że jest to wersja z rubinem. Używam wersji 1.9.1-p0, która została uaktualniona z wersji 1.8.6 dziś po południu. Oszukałem trochę od działającej wersji Ruby, w tym samym katalogu, doszedłem do wniosku, że prawdopodobnie już miałem pliki, które nie są dołączone do pliku .zip, więc nie pobrałem ich.

Dlaczego więc wszystkie moje kody ASCII są zamieniane na rzeczywiste znaki?

Odpowiedz

62

Rubin przed 1.9 traktował postacie nieco niespójnie. ?a i zwróci liczbę całkowitą reprezentującą wartość ASCII znaku (zwykle nie było to zachowanie, którego ludzie oczekiwali), ale w praktyce znak byłby zwykle reprezentowany przez łańcuch jednoliterowy. W Rubim 1.9 znaki nigdy nie są tajemniczo zamieniane na liczby całkowite. Jeśli chcesz uzyskać wartość ASCII znaku, możesz użyć metody ord, np. ?a.ord (która zwraca 97).

+0

Tylko do ukończenia, wersja 1.9.3 lub nowsza nie potrzebuje "?" podpisać przed literą, możemy uzyskać wartość całkowitą tylko z: a.ord – yat0

+3

@polska: Myślę, że mogłeś źle zrozumieć. ? oznacza, że ​​chcemy, aby znak "a", więc pisanie '? a.ord' daje 97, podczas gdy po prostu pisanie' a.ord' szuka zmiennej lub metody o nazwie 'a' i będzie wywoływać NameError, jeśli nic nie ma z tą nazwą lub NoMethodError, jeśli zmienna "a" nie zawiera ciągu. – Chuck

+1

tak, masz rację ... źle mnie zrozumiałem. Działa z? A.ord lub "a" .ord – yat0

7

Znaleziono rozwiązanie. "string" .ord zwraca kod ascii s. Wygląda na to, że znalezione przeze mnie metody zostały złamane w serii rubinów 1.9.

+1

Zamiast edytować oddzielną odpowiedź na własne pytanie lepiej jest edytować oryginalny wpis. – pierrotlefou

+7

@pierr - Ale jest to odpowiedź na pytanie, a nie tylko aktualizacja pytania – rampion

+5

Metody nie są zepsute. Ruby 1.9 inaczej definiuje ich zachowanie, jak wyjaśnił Chuck. – Telemachus

10

1,8 i 1,9

?a.class == String ? ?a.ord : ?a 

lub

"a".class == String ? "a".ord : "a"[0] 
+1

Ten ostatni błąd dla mnie na 1.8.7: ">>" a ".class == String? "a" .ord: "a" [0] "powoduje błąd ' NoMethodError: niezdefiniowana metoda \ "ord" dla "a": Ciąg od (irb): 3' –

32

Jak o

"a"[0].ord 

1,8/1,9 przenośności.

-2

Jeśli ponownie przeczytasz pytanie 22 z projektu Euler, przekonasz się, że nie szukasz wartości znaków ASCII. Jakie pytanie szuka, za znakiem „A” jest na przykład 1, jego pozycja w alfabecie gdzie jako „A” ma wartość ASCII 65.

+1

Z pewnością można uzyskać pozycję w alfabecie przez odjęcie 64 od wartości ASCII wielkiej litery. Ta odpowiedź powinna być komentarzem. –

+0

@NilsLuxton, Może to powinien być komentarz, ale jest to lepsza odpowiedź na pytanie, którego szukają. Jeśli przeczytasz pytanie dotyczące projektu Eulera, wartość ACSII nie jest tym, czego szuka. Nie zasługiwałem na głosowanie w dół. – Schechter

+2

Pytanie brzmiało "Jak uzyskać wartość ASCII postaci", a nie "Czy ktoś może wyjaśnić # 22 w Projekcie Euler". Wspomnienie problemu jest tylko kontekstem. Ich rozwiązanie może (i prawdopodobnie nie musi) obejmować najpierw znalezienie wartości ASCII i obliczenie od tego momentu. Jestem pewien, że PO docenia twoje wyjaśnienia, ale w obecnej formie nie jest odpowiedzią na zadane pytanie. Prawdopodobnie jestem tu trochę surowy, a jeśli chodzi o zasady, no, ale jeśli ta odpowiedź była komentarzem, otrzymam ode mnie wiadomość. –

4

Ruby Programming/ASCII

w poprzednich wersji rubinowej zanim 1,9 , możesz użyć składni znaku zapytania.

?a 

Po 1,9 używamy zamiast tego ord.

'a'.ord  
Powiązane problemy