Finally, успяхме да публикуваме четвърта задача. Можете да си говорите за нея тук.
Срокът е до следващата сряда. :)
Finally, успяхме да публикуваме четвърта задача. Можете да си говорите за нея тук.
Срокът е до следващата сряда. :)
Не разбирам нещо в следния пример:
screen = UI::TextScreen.draw do
label text: 'Something'
label text: 'else'
end
Обекта screen
се създава в Object. draw се извиква експлицитно като клас метод на UI::TextScreen. Но label
, който също е клас метод на UI::TextScreen, се извиква имплицитно, а не експлицитно. Пропускам ли нещо, защото не успявам да свържа label
с класа в модула?
Не знам какво имаш предвид имплицитно извикване на метод. Не е казано, че label
е класов метод на TextScreen
. Очакваме такъв метод да бъде наличен в блока, който подаваме на draw
за да можем да го извикаме. Също така държим този метод да не е дефиниран в Object
.
И аз разбрах, че въпросният "label" трябва да е или просто метод в UI модула, или клас метод в TextScreen, ако не там просто не знам как да го дефинирам, така че да върши работа и да не е в Object. Ако някой може да разясни къде точно да го дефинираме, ще съм благодарен :)
Имам предвид извикване на метод от namespace (използвам ли правилен термин?) без да е указан абсолютния път до този метод, както е при draw
.
@Атанас, мисля, че разяснението, къде да го поставим, ще бъде разчетено като подсказване. А и, както сам посочи, може да е на поне две места. Надявам се някой да ме обори. : -)
@Герасим, кажи ми дали въпросът ти е все още валиден след днешната лекция.
@Димитър, ще ми трябва време за да „смеля боба“, но няколко лампички започнаха тихо да присвяткват около 20:30... = )
Обновление: @Димитър, справих се с „инжектирането“ на пътя в ancestors chain-a. Въпреки че е прекалено meta, за да го разбера напълно..
Следващ въпрос:
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
)?
Струва ми се странно вътрешна оценка да с по-висок приоритет от външна - руши се йерархичната структура. Поне така ми изглежда на мен.
П.С.: Нали няма ограничение за броя на блоковете, които могат да се влагат един в друг?
Един въпрос и от мен... в полето text на label ще има ли "\n"? Трябва ли да правим проверки или е легален символ или не трябва да се притесняваме за такъв случай?
Един въпрос и от мен. Ако label е метод, аргумента с който го викаме е text: 'Something', или? Не ми е ясно защо ни е text:?
@Екатерина - не, текстът на label няма да съдържа "\n" в нашите тестове.
@Людмила - text:
е именован параметър на label
. Такива са и style:
, и border:
. :)
@Людмила, аргумента text:
е keyword аргумент. Т.е. при рефериране на text
в метода label
получаваш стойността за символа - в случая "Something".
@Герасим, схванах, благодаря ти :)))
@Герасиме, стиловете дефинирани върху вътрешни компоненти доминират над тези приложени върху външни.
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
компонент. Правилото за прилагане на стилове се запазва - от най-външния към най-вътрешния стил. Като пак казвам, най-вътрешния (най-конкретния) доминира.
Това отговори ли на въпроса ти? Останаха ли някакви неясни неща? :)
@Станислав, отговори на въпросите ми, но в условието не са описани всички възможни случаи. Например, какви ключови аргументи приемат horizontal
и vertical
- дали vertical
приема style
и т.н. Моля, когато преглеждате решенията, обръщайте внимание дали са проуснати тези детайли, защото аз ги забелязах малко преди да предам решение. И все пак може да съм пропуснал някой. : -)
Имам едно въпросче относно sceptic - следното парче код:
19 define_singleton_method :horizontal do | args, &block |
предизвиква
20 temp << format_horizontal(args, &block)
21 end
Spaces around operators
* no spaces around & on line 19
На мен ми прилича на дефект в библиотеката?
Това:
define_singleton_method :horizontal do | args, &block |
Ако го пооправиш да е:
define_singleton_method :horizontal do |args, &block|
Не минава ли?
Иначе странно съобщение връща sceptic-a o.O Ама нали знаеш? Истинските мъже правят Pull Request (:
Има проблем, ще го разгледаме и поправим. :)
@Христо: без спейсовете го направил оригинално, но тогава се сърдеше че нямало спейсове около оператор |
Въпрос:
screen = UI::Textscreen.draw do
horizontal do
vertical do
label text:"one"
label text:"two"
end
vertical do
label text:"three"
label text:"four"
end
end
end
Tрябва да върне:
one three
two four ?
Допълнение към въпроса на @Александър:
Допустимо ли е да има празни групи?
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."? Ако не - защо?
А на мен ми е интересно какъв ще е резултатът от следния код:
screen = UI::TextScreen.draw do
vertical border: '|' do
label text: 'ha'
label text: 'haha', border: '|'
label text: 'hahahaha'
end
end
puts screen
@Александър:
onethree
twofour
@Герасим:
Допустимо е да има празни групи и резултатът от това, което си пратил трябва да е:
Jabba sends youbeer.
@Дамян:
|ha |
||haha| |
|hahahaha|
Разглеждайки още веднъж въпросите на колегите ми изникнаха следните два случая
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
onethreefour
two
и
onetwothree
four
P.S: TextScreen
е с главно "S".
А резултатът от това
UI::TextScreen.draw do
horizontal border: '|' do
vertical do
label text: 'one'
label text: 'two'
end
vertical do
label text: 'three'
label text: 'four'
label text: 'five'
end
end
end
трябва да е това ?
|onethree|
|twofour |
| five |
Правилно.
Защо резултатът на Герасим трябва да е на един ред? Не трябва ли да е на два:
Jabba sends you\n
beer.
В примера за вертикалната група, резултатът е 1\n2\n3\n (забележете \n накрая), следователно всичко след него ще трябва да почва на нов ред.
Всеки резултат от TextScreen.draw
завършва с \n
. Това не е някаква особеност на vertical
групата.
Имайте предвид, че в блока, подаден на TextScreen.draw
, очакваме само да опишем интерфейса и да запазим това описание в някаква структура от данни. Самото изграждане на текстовия резултат става в самия draw
метод.
@Станислав, т.е.
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?
Резултатът трябва да е "123\n".
Трябва да сте влезли в системата, за да може да отговаряте на теми.