Втора задача

  1. Малко пояснение за дефинирането на методи, което не съм сигурен дали е станало напълно ясно от слайдовете.

    Ако имате следния метод

    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
    

    Ако имате въпроси, дори да ви се струва, че са глупави и сме ги казвали - задавайте ги. Няма как да знаем, че не сме обяснили нещо добре, ако не ни питате :)

  2. Rubocop явно има нещо против използването на self, поне на мен ми даваше проблеми докато не направих променлива current = self и оттам използвах current вместо self. Не виждам смисъл в това, но наистина "ми се сърди" като използвам self.

  3. @Лазар, защото може да изпуснеш self-а. Виж втория пример.

    Изключих тази проверка за момента. Би трябвало да се обнови скоро. По принцип ще предпочитаме да няма self, където не е нужен, но за момента няма проблем да ползвате и двата варианта.

  4. Какво става,ако в хеша ,в който искаме да осъществим дълбок достъп в име на негов ключ се съдържа символа "." ,тъй като ние пътя,който му подаваме използваме именно '.' ,за да разграничим различните нива на влагане.Също така ние в този път ,който даваме как след прочитането му ще разбираме дали е символ или стринг: например order.fetch_deep('dessert.variant') от къде знаем ,че variant е символ ,а не стринг или трябва да си правим проверки в какъв вид го имаме като ключ( а ако го имаме веднъж като символ и веднъж като стринг как избираме в кое направление да продължим (рекурсия с връщане назад?))?

  5. Добро утро! Може да провериш дали е стринг или символ със съответните проверки. За това може да се ползва метода is_a? например. Възможно е да направиш точно тази функция и без рекурсия, ако тя те притеснява. Не знам до колко би се толерирало нерекурсивно решение на тази функция, но е съвсем възможно.

  6. @Стамен,

    1. Добър въпрос. Няма да тестваме с точки в имената на ключовете. Вероятно дори в real-world код бихме игнорирали този случай, защото не се среща често. Освен това, ако се срещне - може лесно да се достъпи ключа чрез [].
    2. Може да пробваш и с двете, пък което първо върне резултат.

    @Лазар, търсим най-чистото (просто, разбираемо) решение. Дали ще използвате рекурсия или не си е ваш избор - пробвайте и двата варианта и си изберете това, което ви изглежда по-добре. Не се водете от "това ще е по-бавно, защото ..."

  7. Въпрос относно "дълбоките" hash-ове за reshape - винаги ли ще са hash от hash-ове(и т.н.), или може да имаме и списъци? Пример: order = { dessert: ['cake', 'chocolate'] }

    shape = { food: {type: 'dessert.0', taste: 'dessert.1'} }

    Благодаря предварително.

  8. 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"

  9. @Кузман В проверките за Hash#reshape 2 пъти се опитваш да reshape-ваш hash-а order и поне при мен втория тест даваше failure, докато не cut-нах order-a, който беше написал на реда веднага след describe и го paste-нах по веднъж във всяка от двете проверки, където се опитваше да го reshape-неш

  10. "Добавете метод reshape на всички хешове, който преобразува текущия хеш в нов с различна структура."

    Това означава че reshape трябва да връща същия обект модифициран, а не нов обект нали?

Трябва да сте влезли в системата, за да може да отговаряте на теми.