Czy Ruby ma wbudowaną metodę string.startswith („abc”)?

200

Czy Ruby ma wbudowaną some_string.starts_with("abc")metodę?

Blankman
źródło
Powiązane pytanie: stackoverflow.com/questions/4130364/...
Andrew Grimm
7
Nawiasem mówiąc, pytasz o Ruby, czy o Rails?
Andrew Grimm,

Odpowiedzi:

339

To się nazywa String#start_with?, a nie String#startswith: W Rubim nazwy metod boolowskich kończą się na, ?a słowa w nazwach metod są oddzielane za pomocą _. Nie jestem pewien, dokąd sposzedł, osobiście wolałbym String#starts_with?więcej niż faktycznyString#start_with?

Jörg W Mittag
źródło
9
Matz powiedział, że woli bez s, ponieważ wtedy wygląda to na drugą osobę w liczbie pojedynczej lub trzecią osobę w liczbie mnogiej.
Andrew Grimm,
5
Ciąg # start_with? został wprowadzony w Ruby 1.8.7 i 1.9.0 - dla starszych wersji możesz użyć jednej z wersji wyrażeń regularnych lub indeksowych wymienionych w innych odpowiedziach.
Hamish Downer,
3
w Railsach możesz użyć String # zaczyna_with?
Abdo
3
@anthropomorphic github.com/rails/rails/blob/… ; to jest alias dla String # start_with?
Abdo,
10
@AndrewGrimm Jedynym problemem jest to, że „ciąg znaków” jest liczbą trzecioosobową! (Ergo, „s” nie powinno było zostać usunięte).
user456584
41

Twój tytuł pytania i treść pytania są różne. Ruby nie ma start_with? metoda. Rails , który jest platformą Ruby , robi to jednak , jak stwierdza sepp2k. Zobacz jego komentarz do odpowiedzi na link do dokumentacji na jego temat.

Zawsze możesz jednak użyć wyrażenia regularnego:

if SomeString.match(/^abc/) 
   # SomeString starts with abc

^ oznacza „początek łańcucha” w wyrażeniach regularnych

Alex
źródło
Wziąłem kombinację temat + bods, aby oznaczać „Ruby nie ma metody start_with. Czy szyny?”.
sepp2k
@ sepp2k, ale chodzi ?o tytuł)
Nakilon,
Ciąg ma start_with? od Ruby 1.9 ( eigenclass.org/hiki/Changes+in+Ruby+1.9#l124 )
steenslag
4
@steenslag - Ruby 1.8.7 również ma start_with? - dokumentacja i uwagi do wydania 1.8.7
Hamish Downer,
zachowaj ostrożność przy tworzeniu wyrażeń regularnych z literałów łańcuchowych - pamiętaj, aby uniknąć specjalnych znaków. istnieje funkcja tego fi literały ciągów mogą być nieprzewidywalne
Radu Simionescu,
17

Jeśli dotyczy to projektu innego niż Rails, użyłbym String#index:

"foobar".index("foo") == 0  # => true
Lars Haugseth
źródło
9
Byłoby to jednak bardziej obciążające pod względem wydajności, ponieważ start_with?metoda może po prostu potwierdzić, że początek łańcucha pasuje do podanego łańcucha - przetwarzając w ten sposób co najwyżej n znaków, gdzie n jest długością danego łańcucha - podczas gdy indexbędzie musiał szukać cały ciąg podstawowy. W przypadku awarii starts_with?zajmie jeden dostęp (na ciąg) i porównanie, podczas gdy indexprzejdzie prawie całą długość łańcucha podstawowego.
OldPeculier
5

Możesz użyć String =~ Regex. Zwraca pozycję pełnego dopasowania wyrażenia regularnego w ciągu.

irb> ("abc" =~ %r"abc") == 0
=> true
irb> ("aabc" =~ %r"abc") == 0
=> false
Nakilon
źródło
Proszę używać //zamiast, %rgdy to możliwe.
Cyoce,