Четвърта задача

  1. Не разбирам нещо в следния пример:

    screen = UI::TextScreen.draw do
      label text: 'Something'
      label text: 'else'
    end
    

    Обекта screen се създава в Object. draw се извиква експлицитно като клас метод на UI::TextScreen. Но label, който също е клас метод на UI::TextScreen, се извиква имплицитно, а не експлицитно. Пропускам ли нещо, защото не успявам да свържа label с класа в модула?

  2. Не знам какво имаш предвид имплицитно извикване на метод. Не е казано, че label е класов метод на TextScreen. Очакваме такъв метод да бъде наличен в блока, който подаваме на draw за да можем да го извикаме. Също така държим този метод да не е дефиниран в Object.

  3. И аз разбрах, че въпросният "label" трябва да е или просто метод в UI модула, или клас метод в TextScreen, ако не там просто не знам как да го дефинирам, така че да върши работа и да не е в Object. Ако някой може да разясни къде точно да го дефинираме, ще съм благодарен :)

  4. Имам предвид извикване на метод от namespace (използвам ли правилен термин?) без да е указан абсолютния път до този метод, както е при draw.

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

  5. @Димитър, ще ми трябва време за да „смеля боба“, но няколко лампички започнаха тихо да присвяткват около 20:30... = )

    Обновление: @Димитър, справих се с „инжектирането“ на пътя в ancestors chain-a. Въпреки че е прекалено meta, за да го разбера напълно..

  6. Следващ въпрос:

    screen = UI::TextScreen.draw do
      horizontal style: :upcase do
        label text: 'ha'
        label text: 'HA', style: :downcase
        label text: 'ha'
      end
    end
    

    Резултатът в screen е низът HAhaHA.

    style в label е с по-висок приоритет от style в upcase? Нека блока horizontal е обграден с блок vertical. Тогава style в label отново ли ще е с по-висок приоритет? А style в horizontal (в сравнение с style в label и style в vertical)?

    Струва ми се странно вътрешна оценка да с по-висок приоритет от външна - руши се йерархичната структура. Поне така ми изглежда на мен.

    П.С.: Нали няма ограничение за броя на блоковете, които могат да се влагат един в друг?

  7. @Герасиме, стиловете дефинирани върху вътрешни компоненти доминират над тези приложени върху външни.

    screen = UI::TextScreen.draw do
      horizontal style: :upcase do
        label text: 'ha'
        label text: 'HA', style: :downcase
        label text: 'ha'
      end
    end
    

    upcase се прилага върху трите label компонента, но downcase презаписва стила за втория label тъй като е дефиниран на по-вътрешно ниво.

    Няма значение дали ще ги обградиш с vertical компонент. Правилото за прилагане на стилове се запазва - от най-външния към най-вътрешния стил. Като пак казвам, най-вътрешния (най-конкретния) доминира.

    Това отговори ли на въпроса ти? Останаха ли някакви неясни неща? :)

  8. @Станислав, отговори на въпросите ми, но в условието не са описани всички възможни случаи. Например, какви ключови аргументи приемат horizontal и vertical - дали vertical приема style и т.н. Моля, когато преглеждате решенията, обръщайте внимание дали са проуснати тези детайли, защото аз ги забелязах малко преди да предам решение. И все пак може да съм пропуснал някой. : -)

  9. Това:

    define_singleton_method :horizontal do | args, &block |
    

    Ако го пооправиш да е:

    define_singleton_method :horizontal do |args, &block|
    

    Не минава ли?

    Иначе странно съобщение връща sceptic-a o.O Ама нали знаеш? Истинските мъже правят Pull Request (:

  10. Допълнение към въпроса на @Александър:

    Допустимо ли е да има празни групи?

    Koгато vertical следва horizontal, например:

    UI::TextScreen.draw do
      vertical do
        label text: 'Jabba sends you'
      end
      horizontal do
        label text: 'beer.'
      end
    end
    ,

    нали двата етикета ще се слеят в "Jabba sends you beer."? Ако не - защо?

  11. Разглеждайки още веднъж въпросите на колегите ми изникнаха следните два случая

    
    screen = UI::Textscreen.draw do
      horizontal do
        vertical do
          label text:"one"
          label text:"two"
        end
        horizontal do
          label text:"three"
          label text:"four"
        end
      end 
    end
    
    
    screen = UI::Textscreen.draw do
      horizontal do
        horizontal do
          label text:"one"
          label text:"two"
        end
        vertical do
          label text:"three"
          label text:"four"
        end
      end 
    end
    
  12. Защо резултатът на Герасим трябва да е на един ред? Не трябва ли да е на два:

    Jabba sends you\n
    beer.

    В примера за вертикалната група, резултатът е 1\n2\n3\n (забележете \n накрая), следователно всичко след него ще трябва да почва на нов ред.

  13. Всеки резултат от TextScreen.draw завършва с \n. Това не е някаква особеност на vertical групата.

    Имайте предвид, че в блока, подаден на TextScreen.draw, очакваме само да опишем интерфейса и да запазим това описание в някаква структура от данни. Самото изграждане на текстовия резултат става в самия draw метод.

  14. @Станислав, т.е.

    screen = UI::TextScreen.draw do
      horizontal do
        label text: '1'
        label text: '2'
        label text: '3'
      end
    end
    

    трябва да принтира 123\n, а не просто 123, както е в описанието, така ли да разбирам?

    И още нещо: току що забелязах, че в описанието навсякъде викате screen.to_s. Това означава ли, че draw връща нещо друго и стринг трябва да се връща само при викане на to_s?

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