Публикувахме втора задача. За да я решите ще трябва да си "изцапате ръцете" с масиви, хешове, map и рекурсия. :)
Ако имате въпроси за задачата - пишете тук.
Публикувахме втора задача. За да я решите ще трябва да си "изцапате ръцете" с масиви, хешове, map и рекурсия. :)
Ако имате въпроси за задачата - пишете тук.
Как се тълкува тази грешка от rspec: Array#reshape can rename fields in each element (FAILED - 1)
Какво иска да каже с това ? Това ми е последния от 3те теста и той ми дава, че е провален.
П.с. открих проблема
Това е името на теста, което описва какво може да прави Array#reshape
.
Тълкува се като отвориш кода на теста :)
Отговорих си сам.
@Кузман, какъв беше въпросът? Може да е полезно за другите да напишеш въпроса и отговора :)
Малко пояснение за дефинирането на методи, което не съм сигурен дали е станало напълно ясно от слайдовете.
Ако имате следния метод
class Array
def print_each_element
# код
end
end
и искате вътре в него да извикате масива.each
, може да направите следното:
class Array
def print_each_element
self.each { |element| puts element }
end
end
self
е аналога на this
в другите езици. В Ruby, self
може да се изпусне. Това прави същото:
class Array
def print_each_element
each { |element| puts element }
end
end
Ако имате въпроси, дори да ви се струва, че са глупави и сме ги казвали - задавайте ги. Няма как да знаем, че не сме обяснили нещо добре, ако не ни питате :)
Rubocop явно има нещо против използването на self, поне на мен ми даваше проблеми докато не направих променлива current = self и оттам използвах current вместо self. Не виждам смисъл в това, но наистина "ми се сърди" като използвам self.
@Лазар, защото може да изпуснеш self-а. Виж втория пример.
Изключих тази проверка за момента. Би трябвало да се обнови скоро. По принцип ще предпочитаме да няма self, където не е нужен, но за момента няма проблем да ползвате и двата варианта.
Какво става,ако в хеша ,в който искаме да осъществим дълбок достъп в име на негов ключ се съдържа символа "." ,тъй като ние пътя,който му подаваме използваме именно '.' ,за да разграничим различните нива на влагане.Също така ние в този път ,който даваме как след прочитането му ще разбираме дали е символ или стринг: например order.fetch_deep('dessert.variant') от къде знаем ,че variant е символ ,а не стринг или трябва да си правим проверки в какъв вид го имаме като ключ( а ако го имаме веднъж като символ и веднъж като стринг как избираме в кое направление да продължим (рекурсия с връщане назад?))?
Добро утро! Може да провериш дали е стринг или символ със съответните проверки. За това може да се ползва метода is_a? например. Възможно е да направиш точно тази функция и без рекурсия, ако тя те притеснява. Не знам до колко би се толерирало нерекурсивно решение на тази функция, но е съвсем възможно.
@Стамен,
[]
.@Лазар, търсим най-чистото (просто, разбираемо) решение. Дали ще използвате рекурсия или не си е ваш избор - пробвайте и двата варианта и си изберете това, което ви изглежда по-добре. Не се водете от "това ще е по-бавно, защото ..."
Отново доза тестове: https://gist.github.com/MapTo0/3d62c18a897368aef994c01d2ae64478
Този път моля за контрибюшън, че съм леко безидеен :D
Въпрос относно "дълбоките" hash-ове за reshape - винаги ли ще са hash от hash-ове(и т.н.), или може да имаме и списъци? Пример: order = { dessert: ['cake', 'chocolate'] }
shape = { food: {type: 'dessert.0', taste: 'dessert.1'} }
Благодаря предварително.
@Калоян, може да има такъв пример, да.
order = {
dessert: {
type: 'cake',
comments: [
{text: 'So sweet!'},
{text: 'A perfect blend of milk chocolate and cookies. With a cherry on top.'}
],
hints: ["Batman", "Maynard Keenan"]
}
}
Това валидно извикване ли е? Предполагам, че е.
order.fetch_deep('dessert.hints.0') #=> "Batman"
Задължително ли е shape да се състои само от хешове от хешове и т.н? Или може примерно един ключ на хеш да сочи към масив, който се състои от хешове вече?
@Кузман - да, валидно е.
@Ралица - в shape ще има само хешове.
За Array#reshape
Елементите на масива, с който се извиква само хешове ли ще са както е в примера или може да са и други масиви?
@Светослав, само хешове ще са.
Скромно допълнение към тестовете на Мартин.
https://gist.github.com/Kuz-man/66194b6f19bf264006f7f3878ee2ac34
@Кузман В проверките за Hash#reshape 2 пъти се опитваш да reshape-ваш hash-а order и поне при мен втория тест даваше failure, докато не cut-нах order-a, който беше написал на реда веднага след describe и го paste-нах по веднъж във всяка от двете проверки, където се опитваше да го reshape-неш
Въпрос за #fetch_deep - при прочитането на число в пътя можем ли да считаме, че то отговаря на индекс в масив, или е възможно да имаме стринг или символ, който се записва като число?
@Петър, много добър въпрос. В условието пише, че ако стойността е масив => ключът ще е число. Нищо не е казано за обратното.
Благодаря за оценката! Все пак какъв е отговорът на този въпрос? Може би трябва да постъпя както с едноименните стринг и символ - да пробвам и с трите, пък което първо стане?
Леко допълнение към тестовете
https://gist.github.com/Ted0-F/ec2c457d91dab0bcf000834ca030eb2f
@Петър, няма да има ключове в хеша, които са от тип Integer
- само String
или Symbol
. Но "1"
е String
и е валиден ключ.
Здравейте,
Някой има ли проблем с rubocop. Знам, че не пиша най хубавия код, ама чак rubocop да падне... https://gyazo.com/2b6732041ac80a902a46cfa5e892c435
P.S. Преди 2 часа работеше
@Валентин, погледни тази тема.
Мерси Исма, не съм я видял
"Добавете метод reshape на всички хешове, който преобразува текущия хеш в нов с различна структура."
Това означава че reshape трябва да връща същия обект модифициран, а не нов обект нали?
@Цветан, моето решение е с рекурсия и ако reshape не връща нов обект, получавам безкрайна рекурсия.
Трябва да сте влезли в системата, за да може да отговаряте на теми.