Trywialne pytanie. Chcę zamienić znak na jego kod byte:
c = ‘a’
W ruby 1.8 można zrobić tak:
i = c[0]
=>97
Ale coś mi się obiło o uszy, że w R1.9 już tak nie można. W takim razie jak to jest w R1.9? Ta konstrukcja z R1.8 też jakaś dziwaczna. Czy nie ma jakiejś metody typu c.ord lub c.to_ascii. Godzinę już szukam w ref i nie widzę
oki@wifi ~/ruby/ruby_1_9 (svn::trunk/) $ ./ruby -e ‘puts “a”.ord; x = “a”; puts x.ord’
Eee, u mnie dziala
i
http://radarek.jogger.pl/2008/11/30/nowosci-i-zmiany-w-ruby-1-9/
No tak. W R1.9 jest ord, a w R1.8 nie ma ale jest …[0]
Czyli aby mieć przenośny (uniwersalny) kod to muszę pisać
c = ‘a’
i = c.respond_to?(:ord) ? c.ord : c[0]
W 1.8 działa. A 1.9 nie ma więc nie sprawdzę. Może ktoś sprawdzi .
Trochę to mało eleganckie rozwiązanie.
Cóż, to konsekwencja tego, że w ruby1.8 znaki==bajty. Gdybyś miał string “ą” w utf8 (2 bajty) to odwołując się do “ą”[0] dostałbyś jakiś śmieć (a dokładnie znak o kodzie 196) zamiast poprawnej litery. Stąd podejście, żeby zwracać bajty.
[quote=lsbb]No tak. W R1.9 jest ord, a w R1.8 nie ma ale jest …[0]
Czyli aby mieć przenośny (uniwersalny) kod to muszę pisać
c = ‘a’
i = c.respond_to?(:ord) ? c.ord : c[0]
W 1.8 działa. A 1.9 nie ma więc nie sprawdzę. Może ktoś sprawdzi .
Trochę to mało eleganckie rozwiązanie.[/quote]
Tak, działa. Ale może sobie ułatwić trochę życie.
[code=ruby]if “foo”.respond_to?(:ord)
raise “This is wroooong!” if “a”.ord != 97
else
class String
def ord
return self[0]
end
end
end
puts “b”.ord[/code]
Zwracam uwagę, na to, że robię test na funkcjonalność (i przy okazji sprawdzam, czy ta istniejąca jest zgodna z naszymi oczekiwaniami), a nie na wersję rubiego. W ten sposób jest to bardziej uniwersalne.
Jeśli nie chcesz ryzykować jakiejś kolizji (szansa na to, że ktoś inny doda taką metodę, ale o innym znaczeniu jest znikoma) możesz napisać sobie własną metodę np “my_ord” etc i tam schować tą logikę.