Uzyskanie kodu znaków ASCII w Ruby przy użyciu `?"(question mark) fails

Jestem w sytuacji, gdy potrzebuję wartości ASCII znaku (dla projektu Euler pytanie #22, jeśli chcesz uzyskać konkretne) i mam problem.

Będąc nowy w ruby, wygooglowałem go i stwierdziłem, że ? to była droga do zrobienia: ?A czy cokolwiek innego. Ale kiedy włączam go do mojego kodu, rezultatem tego stwierdzenia jest łańcuch "A" - Brak kodu znakowego. Ten sam problem z [0] i slice(0), które teoretycznie powinny zwracać kod ASCII.

The only myślę, że jest to kwestia wersji ruby. Używam 1.9.1-p0, po aktualizacji z 1.8.6 dziś po południu. Oszukałem trochę wychodząc z działającej wersji Ruby, w tym samym katalogu, pomyślałem, że prawdopodobnie już mam pliki, które nie są dołączone do .plik zip, więc ich nie ściągnąłem.

Więc dlaczego dokładnie wszystkie moje kody ASCII są zamieniane na rzeczywiste znaki?

Author: Andrew Marshall, 2009-08-13

6 answers

Ruby przed 1.9 traktował znaki nieco niekonsekwentnie. ?a i "a"[0] zwracają liczbę całkowitą reprezentującą wartość ASCII znaku (która zwykle nie była zachowaniem, którego ludzie szukali), ale w praktycznym użyciu znaki zwykle reprezentowane są przez jednoznakowy ciąg znaków. W Ruby 1.9 znaki nigdy nie są tajemniczo zamieniane w liczby całkowite. Jeśli chcesz uzyskać wartość ASCII znaku, możesz użyć metody ord, takiej jak ?a.ord (która zwraca 97).

 65
Author: Chuck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-13 05:53:56

A może

"a"[0].ord

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

 33
Author: Ryan Calhoun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-15 18:34:53

Dla 1.8 i 1.9

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

Lub

"a".class == String ? "a".ord : "a"[0]
 11
Author: mark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-23 19:11:57

Znalazłem rozwiązanie. / align = "left" / ord zwraca kod ascii s. Wygląda na to, że metody, które znalazłem, są złamane w serii 1.9 ruby.

 7
Author: dorr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-13 05:51:42

Programowanie w Ruby / ASCII

W poprzedniej wersji Rubiego przed 1.9, możesz użyć składni znaku zapytania.

?a

Po 1.9 zamiast tego używamy ord.

'a'.ord    
 6
Author: hiveer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-02 03:01:55

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

 -2
Author: Schechter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-04 02:09:13