Jak uzyskać pierwszy znak w ciągu za pomocą Rubiego?
Ostatecznie to, co robię, to wzięcie czyjegoś nazwiska i utworzenie z niego inicjału.
Więc jeśli ciągiem jest „Smith”, chcę tylko „S”.
"Smith".chr #=> "S"
Jak uzyskać pierwszy znak w ciągu za pomocą Rubiego?
Ostatecznie to, co robię, to wzięcie czyjegoś nazwiska i utworzenie z niego inicjału.
Więc jeśli ciągiem jest „Smith”, chcę tylko „S”.
"Smith".chr #=> "S"
Odpowiedzi:
Możesz użyć otwartych klas Rubiego, aby uczynić swój kod bardziej czytelnym. Na przykład to:
class String
def initial
self[0,1]
end
end
pozwoli ci użyć initialmetody na dowolnym łańcuchu. Więc jeśli masz następujące zmienne:
last_name = "Smith"
first_name = "John"
Wtedy możesz uzyskać bardzo wyraźne i czytelne inicjały:
puts first_name.initial # prints J
puts last_name.initial # prints S
Druga wspomniana tutaj metoda nie działa w Ruby 1.8 (nie żebyś i tak już używał 1.8! - ale kiedy opublikowano tę odpowiedź, była nadal dość powszechna):
puts 'Smith'[0] # prints 83
Oczywiście, jeśli nie robisz tego regularnie, zdefiniowanie metody może być przesadą i możesz to zrobić bezpośrednio:
puts last_name[0,1]
Jeśli używasz najnowszej wersji Rubiego (1.9.0 lub nowszej), powinny działać następujące elementy:
'Smith'[0] # => 'S'
Jeśli używasz wersji 1.9.0+ lub 1.8.7, poniższe powinny działać:
'Smith'.chars.first # => 'S'
Jeśli używasz wersji starszej niż 1.8.7, powinno to działać:
'Smith'.split(//).first # => 'S'
Zauważ, że 'Smith'[0,1]nie nie działa na 1.8, to będzie nie daje pierwszy znak, to tylko daje pierwszy bajt .
"Smith"[0]zwróci wartość całkowitą znaku „S”. Obie wersje są posłuszne "Smith"[0,1] == "S".
"Smith"[0,1]działa na 1.8 (zakładając ASCII). Nie jestem pewien, dlaczego zakładasz tak wiele o żądającym, a także o wszystkich innych, którzy chcieliby się czegoś nauczyć z tego pytania. Na przykład Mac OS X jest dostarczany w pakiecie z Ruby 1.8, więc nie jest wymagana instalacja dla tych użytkowników.
"Smith"[0..0]
działa zarówno w Ruby 1.8 jak i Ruby 1.9.
Ze względu na kompletność, ponieważ Ruby 1.9 String # chr zwraca pierwszy znak łańcucha. Jest nadal dostępny w wersjach 2.0 i 2.1.
"Smith".chr #=> "S"
W MRI 1.8.7 lub nowszym:
'foobarbaz'.each_char.first
Spróbuj tego:
>> a = "Smith"
>> a[0]
=> "S"
LUB
>> "Smith".chr
#=> "S"
>> s = 'Smith'
=> "Smith"
>> s[0]
=> "S"
"Smith"[0]zwróci wartość całkowitą znaku „S”. Obie wersje są posłuszne "Smith"[0,1] == "S".
"Smith"[0] == ?Sto prawda na Ruby 1.8 i 1.9
Z powodu irytującego wyboru projektu w Rubim przed wersją 1.9 - some_string[0]zwraca kod pierwszego znaku - najbardziej przenośnym sposobem zapisania tego jest some_string[0,1]polecenie pobrania podciągu o indeksie 0 o długości 1 znaku.
Możesz także użyć truncate
> 'Smith'.truncate(1, omission: '')
#=> "S"
lub do dodatkowego formatowania:
> 'Smith'.truncate(4)
#=> "S..."
> 'Smith'.truncate(2, omission: '.')
#=> "S."
Każda z tych metod będzie działać:
name = 'Smith'
puts name.[0..0] # => S
puts name.[0] # => S
puts name.[0,1] # => S
puts name.[0].chr # => S
.później name. A ostatnia nie jest sensowna, nawet jeśli usuniesz ., ponieważ używa dwóch różnych metod do zrobienia tego samego - [0] i chr() .
'Smith'.first