2012-10-13 11 views
9

Jaka jest różnica między tymi dwoma (String#scan i String#split) w Ruby?Różnica między String.scan i String.split

+0

Jaka jest różnica? Jedyną wspólną cechą jest to, że oba są wywoływane z obiektu 'String' lub klasy potomnej. Co wydawało się takie zagmatwane? To pytanie mogło zostać właśnie rozwiązane przez przyjrzenie się ruby ​​doc. – Shoe

Odpowiedz

19

Służą one całkowicie innym celom. String#scan służy do wyodrębniania dopasowań wyrażenia regularnego z ciągu znaków i zwraca dopasowania w tablicy, podczas gdy String#split ma na celu podział ciągu na tablicę, w oparciu o separator. Separator może być statycznym ciągiem znaków (np. ;, aby podzielić na pojedynczy średnik) lub wyrażeniem regularnym (np. /\s/+, aby podzielić na dowolne białe znaki).

Dane wyjściowe z String#split nie zawierają ogranicznika. Zamiast tego wszystko, z wyjątkiem ogranicznika, zostanie zwrócone w macierzy wyjściowej, podczas gdy wyjście o wartości String#scan będzie zawierać tylko to, co jest dopasowane przez separator.

# A delimited string split on | returns everything surrounding the | delimiters 
"a|delimited|string".split("|") 
# Prints: ["a", "delimited", "string"] 

# The same string scanninng for | only returns the matched | 
"a|delimited|string".scan("|") 
# Prints: ["|", "|"] 

Oba powyższe wyrażenia również przyjmą wyrażenie regularne zamiast prostego ciągu "|".

# Split on everything between and including two t's 
"a|delimited|string".split(/t.+t/) 
# Prints: ["a|delimi", "ring"] 

# Search for everything between and including two t's 
"a|delimited|string".scan(/t.+t/) 
# Prints: ["ted|st"] 
Powiązane problemy