Задача 2: Въпроси
-
Тук задавайте въпроси по втора задача. Ползвайте темата за въпроси, а не подсказки.
Публикувано преди повече от 4 години -
Може би не разбриам нещо, но в първия хак какво трябва да се предефинира, двойките редове си правят едно и също нещо?
irb(main):028:0> array=[1,3,4]
=> [1, 3, 4]
irb(main):029:0> array.map { |item| item.methods } == array.map(&:methods)
=> trueedit: Доколкото намерих информация, явно имам някакъв extension, защото в онлайн интерпретатора това не работи :D
Публикувано преди повече от 4 години -
Така си е, в чисто irb не сработва:
irb(main):001:0> [1, 2, 3].inject(&:+) TypeError: wrong argument type Symbol (expected Proc) from (irb):1
Публикувано преди повече от 4 години -
Едно въпросче което не знам дали ще се интерпретира като въпрос или подсказка:
Как да направя блок с променящ се брой аргументи и въобще това възможно ли е?edit:Само да кажа че открих отговора на загадката си и той не е много учудващ:
{|t,*args| } ни позволява да зададем произволен брой(поне един де) аргументи на блок. Общо взето е същата работа като за подаване на произволен брой аргументи на метод.Публикувано преди повече от 4 години -
6.0 * 9.0 = ?
Освен това – по хак 3 – доста неща всъщност имат предефиниран метод &, включително Array(има го в примерния тест). Какво правим тогава?
Публикувано преди повече от 4 години -
6.0 * 9.0 – не ни интересува.
По хак 3: правиш така, че методите продължават да работят както по стария, така и по новия начин. Т.е., очаквам да мога са правя както
[].&.size
, така и[1, 2] & [2, 3]
.Публикувано преди повече от 4 години -
Искам да питам за хакчето swap_methods.Какъв очакваме да е резултата на:
test = “text1”
text = “text2”
test.swap_methods :upcase,:downcase
puts test.downcase
puts text.downcaseПубликувано преди повече от 4 години -
За хак 10: променлива, която има стойност nil (не е инициализирана), не се брои за инстанционна променлива,нали?
class Foo
@bar
end
Foo.new.expose_all.bar # undefined method `bar’?Публикувано преди повече от 4 години -
По хак 10: (малко допълнение към предното питане):
Идеята е тази функция да генерира методи за access на всички променливи, в момента на викане на функцията, или на всички променливи в бъдеще. Т.е ако след време (след викането на expose_all) се появи нова променлива, трябва ли да може да я достъпваме и нея?Публикувано преди повече от 4 години -
По хак 5: (малко допълнение към това на близнака)
Ако първо swap-на :upcase, :downcase и после :upcase :to_i нали трябва
:upcase -> :to_i, to_i -> :downcase :downcase -> :upcase ?
Т.е размяната е супер transparent :)EDIT::
По хак 6: Ако направим around_method 2 пъти на един и същи метод, трябва да around-нем новия или оригиналния метод? (логично би било да се изпълнява върху новия и все пак)Публикувано преди повече от 4 години -
И аз да се включа за 5тия хак :). В теста има следния assert:
assert_equal "COLTRANE", "Coltrane".upcase
Това ваша грешка ли е, или аз нещо не чаткам правилата?EDIT: Май се досетих, че може би не съм схванал добре условието. Идеята е да се разменят методите за конкретната инстанция, а не на класа?
И за последния EDIT, на Искрен, предполагам, че питаш за 4ти хак, но въпроса е доста интересен.
EDIT2: По хак 3: nil.&.class какво трябва да върне ?
Публикувано преди повече от 4 години -
Намерих доста интересна и не много кратка лекция за Метапрограмирането във Руби. Може да ви помогне за втората задача… но ще трябва да отделите един час то живота си за нея :)
http://www.infoq.com/presentations/metaprogramming-ruby
Публикувано преди повече от 4 години -
@Ивайло:
foo, bar = "Text", "Text" foo.swap_methods :upcase, :downcase puts foo.upcase, bar.upcase # text TEXT
@Емил:
Има разлика между неинициализирана променлива и такава със стойност
nil
. Неинициализираните не трябва да излизат отвън. Инициализираните – да.@Искрен:
expose_all
показва всички променливи на инстанцията в момента. Бъдещите не ни интересуват.foo = "Larodi" foo.swap_methods :upcase, :downcase foo.swap_methods :upcase, :to_i foo.to_i # String#downcase foo.downcase # String#upcase foo.upcase # String#to_i
Демек, размяната е супер-дупер-мега-гига-ултра-убер прозрачна. Transparent. Нали.
@Матей:
Правилно си схванал, че не си схванал правилно условието първия път. Работи върху инстанция, не върху класа.
Хехех.
nil.&.class
трябва да върнеnil
, но би било трудно. Все ни е едно как го нарпавите.around_method
трябва да сеstack
-ва. Ако обвиеш обвит метод, запазват се и двете обвивки. Тъй де, прозрачно.Публикувано преди повече от 4 години -
Някой друг да има проблеми с unit_test-ването на around_method? Когато тествам един и същи код извън unit_test -овете и в тях, в първия случай всичко е ОК, а във втория програмата зацикля. Ако можете дайте идея защо може да става това.
Публикувано преди повече от 4 години -
По хак 9 (Hash#multi_invert). Ако имаме:
{’a’ => [1,2], ‘b’ => 2, [‘c’, ‘n’] => 3, ‘d’ => 1, 1 => 1, 3 => 3}.multi_invert
Какъв трябва да е резултатът според зададеното условие?
1) {1=>[“d”, 1, “a”], 2=>[“b”, “a”], 3=>[3, “c”, “n”]}
или
2) {1=>[“d”, 1], 2=>[“b”], 3=>[3,[“c”, “n”]], [1,2]=>[“a”]}Публикувано преди повече от 4 години -
@Димитър
в условието се казва “На всяка стойност от стария хеш съпоставя ..”
в стария хеш имаш двойка ’a’ => [1,2]; нищо не се казва за промяна на старите стойности (разбиване на масивите на съставни части) – те просто стават ключове; мисля, че верния output в твоя пример е 2)Публикувано преди повече от 4 години -
@Димитър: Помисли малко. Кое сме имали предвид?
Публикувано преди повече от 4 години -
Здрасти лек тафтологичен въпрос. В случая за 7ми хак.
p = Proxy.new("Pineapple") p.class # => Proxy
или
p.class # => String
Публикувано преди повече от 4 години -
Мъдър въпрос. Аз бих върнал
Proxy
понеже това е нещо, което изглежда като низ, но не е низ.Естествено, за нашите тестове няма никакво значение.
Публикувано преди повече от 4 години -
Здрасти, сигурно вече ставам досаден, но бях фрустриран когато осъзнах, че:
obj = Object.new obj.send(:y),
хвърля AruementError, а не NoMethodError. Трябваха ми няколко минути, за да се отърся и да разбера, че по някаква неведума причина Object има private метод y. :) Така че да не се стряскате ако не ви мине 10тия тест.
А за Proxy-то, предполагам това важи и за всички методи които наследява от Object като ==, например.
Публикувано преди повече от 4 години -
Относно точка 8 – Array.
Според мен има неточност в дадения алгоритъм за сравнение.
“Ако по-дългият масив съдържа по-късия в началото си, то късият е по-малкия.”
[1,2] < [1,3] #true
[1,3] < [1,3,4] #true=> [1,2] < [1,3,4] #?
Лексикографската наредба е пълна наредба и има свойството
транзитивност => [1,2] < [1,3,4] е true,
но според алгоритъма в условието [1,2] не се съдържа в началото на [1,3,4] и трябва да е false.
Кое да възприемаме за вярно?Публикувано преди повече от 4 години -
@Dejo, няма противоречие; точката, която си цитирал, има сила само в едната посока, тоест: “ако по-късият масив се съдържа в началото на по-дългия => е по-малък”, но не е вярно, че “ако по-късият масив не се съдържа в началото на дългия => е по-голям или равен”.
Това описание на лексикографската наредба там е “за пълнота на изложението” :) Така или иначе, тя е достатъчно интуитивна наредба :)
Публикувано преди повече от 4 години -
Пак искам да питам за една аномалия която наблюдавах във връзка със around_method:
забелязах че във вашите тестове викате around_method не на Array а на MyArray, който е негов наследник.
Така тестовете ми минаха и нямаше проблем. Това обаче ми бъркаше в здравето затова махнах MyArray и извиках around директно на Array. Така получих необясним безкраен цикъл. Много си блъсках главата и не знам защо става.
Затова върнах кода както си беше и пак го стартирах. Шокирах се доста като видях че сега старите unit_test – ове(т.е. с MyArray) също зациклят. Не мога да си обясня как един и същи код в началото вървеше а сега зацикля и ЗАЩО ВЪОБЩЕ ЗАЦИКЛЯ.
@Денислав: чети внимателно – пише преминавате към а[ 1] и b[ 1] после към a[ 2] и b[ 2] в примера който даваш още от тук сравнението ще върне истина.Публикувано преди повече от 4 години -
@Денислав
[1,2] < [1,2] # false
[1,2] == [1,2] # true
[1,2] > [1,2] # falseпоне аз така разбирам условието – иска се python style сравняване, или греша?
@Матей
ползвай незамърсено с ‘wirble’ irbПубликувано преди повече от 4 години -
@Точо
Точо вервай ми че ползвам “незамърсено” irb, понеже съм под уиндоус и wirble-а не ми върши работа.
EDIT2 Е явно е “замърсен” с нещо все пак, в онлайн интерпретатора не работи ;)
@Ивайло
Човече и при мен става точно същото с around_method. В irb си бачка но иначе зацикля. Единствената разлика е че като върна MyArray и се нормализира.
EDIT Като коментирам всички хакове си бачка обаче ;) Т.е. в някой от тях нещо се омазва. След малко може и да разбера кой точно. Ясно :)
Публикувано преди повече от 4 години -
Това което го казах че като върна MyArray не работи не е вярно. Бях направил друга грешка. Колкото до това защо зацикля ако си използваш Array, стигнах до извода че нещо се сърди в теста на прокси както и на рани места където използвам метода <<. Т.е. според мен решението си ми е вярно – човек наистина може да around-не метода << на Array, но само ако е готов да си понесе последствията.Публикувано преди повече от 4 години
-
Само искам да обърна внимание на нещо, което лично мен доста ме озадачи:
irb(main):007:0> p=Proc.new {|arg,*more| puts “arg: #{arg.inspect} ; more: #{more.inspect}”}
=> #<Proc:0×00007fcf18296c58@(irb):7>
irb(main):008:0> p[[‘x’]] #не би ли било нормално да очакваме ‘arg: [’x’]‘?
arg: “x” ; more: []
=> nil
irb(main):009:0> p[[]] #’arg: []’?
arg: nil ; more: []
=> nil
Edit: свързано е с първия хак, затова го пиша в тази темаПубликувано преди повече от 4 години -
Блах. Това и мен озадачи. Ще го разгледам по-късно и ще ти кажа защо…
Публикувано преди повече от 4 години -
- izvinete za 6liokavicata
ako uspeem da s4upim razni re6eniq na 2 ra zada4a 6te davate li bonus to4ki (t.e ako izmislim test, za koito dadena programa ne raboti a spored va6ite testove raboti)
Публикувано преди повече от 4 години -
@Искрен
недей така, че на тази задача ако почнем да събмитваме тестове ще има 1-2 със 100%… :)
не че ми пука, ама тогава хората, които се борят за 50% ще имат 10…
Публикувано преди повече от 4 години -
@Искрен: Не. Нашите тестове са нежни. Не целят до проверят дали сте измислили всеки детайл, а дали сте решили задачата си.
Публикувано преди повече от 4 години
Нов отговор
Трябва да сте вътре за да отговаряте.