Шест метода Руби низа које требате знати

Низови су једна од основних структура програмирања. Способност брзог манипулисања и читања података из њих је од виталног значаја за успех у стварању ствари помоћу рачунара. Ево шест метода без којих не можете.

Мапа / Свака

Ове две методе су врло сличне. Омогућавају вам да пређете кроз „сваку“ ставку у низу и учините нешто с њом.

Погледајте неки код:

array = [1, 2, 3] effects = array.each # create record from x  added = array.map x + 2 

Ако читамо из added, добићемо [3, 4, 5]. Ако читамо из effects, и даље ћемо добити [1, 2, 3]. Ево разлике између ове две: .mapвратит ће нови модификовани низ, док .eachће вратити изворни низ.

Нежељени ефекти на мапи

Ако сте се навикли на функционално програмирање, Руби'с .mapможе изгледати врло чудно. Погледајте овај пример. EventУ свом пројекту имам једноставну наставу:

# we create an array of records 2.3.0 :025 > array = [e, e2, e3] => [#, #, #] # so far so good 2.3.0 :026 > new_array = array.map => [#, #, #] # uh-oh, that ain't right 2.3.0 :027 > array => [#, #, #]

Могли бисмо очекивати да радимо са неком врстом копије наших записа у низу, али нисмо. То је све само да кажем: будите опрезни. Можете лако створити нежељене ефекте у својим .mapфункцијама.

Ок, полако, то је било тешко. Глатка пловидба одавде надаље.

Изаберите

.selectомогућава вам да „пронађете“ елемент у низу. Морате дати .selectфункцију која враћа тачно или нетачно, тако да зна да ли ће „задржати“ елемент низа или не.

2.3.0 :028 > array = ['hello', 'hi', 'goodbye'] 2.3.0 :029 > array.selectword => ["hello", "goodbye"]

Нешто сложенији пример, вероватно ближи начину на који бисте ово заправо користили. Убацимо .mapна крају за добру меру:

2.3.0 :030 > valid_colors = ['red', 'green', 'blue'] 2.3.0 :031 > cars = [{type: 'porsche', color: 'red'}, {type: 'mustang', color: 'orange'}, {type: 'prius', color: 'blue'}] 2.3.0 :032 > cars.select valid_colors.include?(car[:color]) .map  => ["porsche", "prius"]

Да, људи, можете се придружити овим методама како бисте имали незамисливу моћ. Ок, вероватно можете то да замислите, али је и даље у реду.

Још чишћа синтакса: .мап (&: метода)

Да смо радили са аутомобилским објектима, а не само са једноставним хешом, могли бисмо да користимо чистију синтаксу. Користићу другачији пример за краткоћу. Можда припремамо ову листу аутомобила за слање у АПИ-ју и треба да генеришемо ЈСОН. Можемо користити .to_jsonметоду:

# using regular map syntax 2.3.0 :047 > cars.select .map car.to_json => ["{\"type\":\"porsche\",\"color\":\"red\"}", "{\"type\":\"prius\",\"color\":\"blue\"}"] # using the cleaner syntax 2.3.0 :046 > cars.selectcar.map(&:to_json) => ["{\"type\":\"porsche\",\"color\":\"red\"}", "{\"type\":\"prius\",\"color\":\"blue\"}"]

Одбити

Одбацивање је јин .select-ов ианг-у:

2.3.0 :048 > cars.reject valid_colors.include?(car[:color]) .mapcar => ["mustang"]

Уместо избора за низа ставки желимо, ми ћемо одбацити све што не чини наш повратак функција истина. Запамтите да је функција унутар нашег одбијања та која одређује да ли ће ставка низа бити враћена или не - ако је тачна, ставка се враћа, у супротном не.

Смањите

Редуце има сложенију структуру од осталих метода низа, али се обично користи за прилично једноставне ствари у Руби-у - углавном из математике. Узећемо низ, а затим покренути функцију на свакој ставци у том низу. Овог пута бринемо о томе шта се враћа из осталих ставки низа . Обично збрајамо гомилу бројева:

2.3.0 :049 > array = [1, 2, 3] 2.3.0 :050 > array.reduce => 6

Имајте на уму да са стринговима можемо радити на исти начин:

2.3.0 :053 > array = ['amber', 'scott', 'erica'] 2.3.0 :054 > array.reduce sum + name => "amberscotterica"

Ово би могло бити корисно ако гледамо гомилу евиденција о раду. Ако треба да збројимо укупан број одрађених сати или ако желимо да сазнамо збир свих донација прошлог месеца. Последња напомена о .reduce. Ако радите са нечим другим осим са уобичајеним старим бројевима (или низовима), мораћете да укључите почетну вредност као аргумент:

array = [{weekday: 'Monday', pay: 123}, {weekday: 'Tuedsay', pay: 244}] array.reduce(0)  => 367 array.reduce(100) sum, day => 467

Постоје, наравно, напреднији начини коришћења, .reduceали ово је довољно за почетак.

Придружити

Бацам .joinкао бонус јер је тако корисно. Поново употребимо наше аутомобиле:

2.3.0 :061 > cars.map car[:type].join(', ') => "porsche, mustang, prius"

.joinмного личи, .reduceосим што има супер чисту синтаксу. Потребан је један аргумент: низ који ће бити уметнут између свих елемената низа. .joinкреира један дугачки низ од било чега што му дате, чак и ако је ваш низ гомила не стрингова:

2.3.0 :062 > cars.join(', ') => "{:type=>\"porsche\", :color=>\"red\"}, {:type=>\"mustang\", :color=>\"orange\"}, {:type=>\"prius\", :color=>\"blue\"}" 2.3.0 :065 > events.join(', ') => "#, #, #"

Зашто једноставно не бацити све заједно

Хајде да заједно користимо све методе низа у овом посту! Десет дана послова и насумично је колико ће времена трајати. Желимо да знамо укупно време које ћемо провести на пословима. То је под претпоставком да занемаримо и занемаримо све што траје дуже од 15 минута. Или одложите за неки други дан све што се може учинити за мање од 5:

days = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] days.map{|day| day.odd? ? {task: 'dishes', minutes: Random.rand(20)} : {task: 'sweep', minutes: Random.rand(20)}} .select .rejecttask .reduce(0)  sum + task[:minutes]

Мој одговор је небитан јер ћете добити различите случајне минуте за задатке. Ако је било шта од овога свеже или збуњујуће, запалите Руби конзолу и завртите се.

ПС: Тај ? :посао .mapсе зове а ternary. То је само иф-елсе изјава. Овде га користим само да бих био фенси и све ставио на „једну“ линију. Требали бисте избегавати тако компликоване тернарине у својој бази кода.

Видимо се следећи пут!