Ak by ste chceli rozdeliť zoznam slov oddelených medzerou, použili by ste
def words(text)
return text.split.map{|word| word.downcase}
end
podobne ako porozumenie zoznamu Pythonu:
words("get out of here")
ktorý sa vracia ["get", "out", "of", "here"]
. Ako môžem použiť blok na každý znak v reťazci?
odpovede:
21 pre odpoveď č. 1použitie String#chars
:
irb> "asdf".chars.map { |ch| ch.upcase }
=> ["A", "S", "D", "F"]
3 pre odpoveď č. 2
Hľadáte niečo takéto?
class String
def map
size.times.with_object("") {|i,s| s << yield(self[i])}
end
end
"ABC".map {|c| c.downcase} #=> "abc"
"ABC".map(&:downcase) #=> "abc"
"abcdef".map {|c| (c.ord+1).chr} #=> "bcdefg"
"abcdef".map {|c| c*3} #=> "aaabbbcccdddeeefff"
2 pre odpoveď č. 3
Myslím si, že krátka odpoveď na vašu otázku je „nie, nič podobné“ map
pre reťazce, ktoré obsluhujú znak súčasne. “Predchádzajúci odpovedač mal v mojej knihe najčistejšie riešenie; jednoducho ho vytvorte pridaním definície funkcie do triedy.
BTW, existuje tiež String#each_char
čo je iterátor naprieč každým znakom reťazca. V tomto prípade String#chars
získa rovnaký výsledok, pretože vráti pole, ktoré tiež reaguje each
(alebo map
), ale myslím, že sa môžu vyskytnúť prípady, keď by bolo potrebné rozlišovať.