Задача 2: Въпроси

  1. Тук задавайте въпроси по втора задача. Ползвайте темата за въпроси, а не подсказки.

    Публикувано преди повече от 4 години
  2. Може би не разбриам нещо, но в първия хак какво трябва да се предефинира, двойките редове си правят едно и също нещо?

    irb(main):028:0> array=[1,3,4]
    => [1, 3, 4]
    irb(main):029:0> array.map { |item| item.methods } == array.map(&:methods)
    => true

    edit: Доколкото намерих информация, явно имам някакъв extension, защото в онлайн интерпретатора това не работи :D

    Публикувано преди повече от 4 години
  3. Така си е, в чисто irb не сработва:

    irb(main):001:0> [1, 2, 3].inject(&:+)
    TypeError: wrong argument type Symbol (expected Proc)
            from (irb):1

    Публикувано преди повече от 4 години
  4. Едно въпросче което не знам дали ще се интерпретира като въпрос или подсказка:
    Как да направя блок с променящ се брой аргументи и въобще това възможно ли е?

    edit:Само да кажа че открих отговора на загадката си и той не е много учудващ:
    {|t,*args| } ни позволява да зададем произволен брой(поне един де) аргументи на блок. Общо взето е същата работа като за подаване на произволен брой аргументи на метод.

    Публикувано преди повече от 4 години
  5. 6.0 * 9.0 = ?

    Освен това – по хак 3 – доста неща всъщност имат предефиниран метод &, включително Array(има го в примерния тест). Какво правим тогава?

    Публикувано преди повече от 4 години
  6. 6.0 * 9.0 – не ни интересува.

    По хак 3: правиш така, че методите продължават да работят както по стария, така и по новия начин. Т.е., очаквам да мога са правя както [].&.size, така и [1, 2] & [2, 3].

    Публикувано преди повече от 4 години
  7. Искам да питам за хакчето swap_methods.Какъв очакваме да е резултата на:
    test = “text1”
    text = “text2”
    test.swap_methods :upcase,:downcase
    puts test.downcase
    puts text.downcase

    Публикувано преди повече от 4 години
  8. За хак 10: променлива, която има стойност nil (не е инициализирана), не се брои за инстанционна променлива,нали?
    class Foo
    @bar
    end
    Foo.new.expose_all.bar # undefined method `bar’?

    Публикувано преди повече от 4 години
  9. По хак 10: (малко допълнение към предното питане):
    Идеята е тази функция да генерира методи за access на всички променливи, в момента на викане на функцията, или на всички променливи в бъдеще. Т.е ако след време (след викането на expose_all) се появи нова променлива, трябва ли да може да я достъпваме и нея?

    Публикувано преди повече от 4 години
  10. По хак 5: (малко допълнение към това на близнака)
    Ако първо swap-на :upcase, :downcase и после :upcase :to_i нали трябва
    :upcase -> :to_i, to_i -> :downcase :downcase -> :upcase ?
    Т.е размяната е супер transparent :)

    EDIT::
    По хак 6: Ако направим around_method 2 пъти на един и същи метод, трябва да around-нем новия или оригиналния метод? (логично би било да се изпълнява върху новия и все пак)

    Публикувано преди повече от 4 години
  11. И аз да се включа за 5тия хак :). В теста има следния assert:

    assert_equal "COLTRANE", "Coltrane".upcase

    Това ваша грешка ли е, или аз нещо не чаткам правилата?

    EDIT: Май се досетих, че може би не съм схванал добре условието. Идеята е да се разменят методите за конкретната инстанция, а не на класа?

    И за последния EDIT, на Искрен, предполагам, че питаш за 4ти хак, но въпроса е доста интересен.

    EDIT2: По хак 3: nil.&.class какво трябва да върне ?

    Публикувано преди повече от 4 години
  12. Намерих доста интересна и не много кратка лекция за Метапрограмирането във Руби. Може да ви помогне за втората задача… но ще трябва да отделите един час то живота си за нея :)

    http://www.infoq.com/presentations/metaprogramming-ruby

    Публикувано преди повече от 4 години
  13. @Ивайло:

    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 години
  14. Някой друг да има проблеми с unit_test-ването на around_method? Когато тествам един и същи код извън unit_test -овете и в тях, в първия случай всичко е ОК, а във втория програмата зацикля. Ако можете дайте идея защо може да става това.

    Публикувано преди повече от 4 години
  15. По хак 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 години
  16. @Димитър
    в условието се казва “На всяка стойност от стария хеш съпоставя ..”
    в стария хеш имаш двойка ’a’ => [1,2]; нищо не се казва за промяна на старите стойности (разбиване на масивите на съставни части) – те просто стават ключове; мисля, че верния output в твоя пример е 2)

    Публикувано преди повече от 4 години
  17. @Димитър: Помисли малко. Кое сме имали предвид?

    Публикувано преди повече от 4 години
  18. Здрасти лек тафтологичен въпрос. В случая за 7ми хак.

    p = Proxy.new("Pineapple")
    p.class # => Proxy

    или

    p.class # => String

    Публикувано преди повече от 4 години
  19. Мъдър въпрос. Аз бих върнал Proxy понеже това е нещо, което изглежда като низ, но не е низ.

    Естествено, за нашите тестове няма никакво значение.

    Публикувано преди повече от 4 години
  20. Здрасти, сигурно вече ставам досаден, но бях фрустриран когато осъзнах, че:

    obj = Object.new
    obj.send(:y),

    хвърля AruementError, а не NoMethodError. Трябваха ми няколко минути, за да се отърся и да разбера, че по някаква неведума причина Object има private метод y. :) Така че да не се стряскате ако не ви мине 10тия тест.

    А за Proxy-то, предполагам това важи и за всички методи които наследява от Object като ==, например.

    Публикувано преди повече от 4 години
  21. Относно точка 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 години
  22. @Dejo, няма противоречие; точката, която си цитирал, има сила само в едната посока, тоест: “ако по-късият масив се съдържа в началото на по-дългия => е по-малък”, но не е вярно, че “ако по-късият масив не се съдържа в началото на дългия => е по-голям или равен”.

    Това описание на лексикографската наредба там е “за пълнота на изложението” :) Така или иначе, тя е достатъчно интуитивна наредба :)

    Публикувано преди повече от 4 години
  23. Пак искам да питам за една аномалия която наблюдавах във връзка със around_method:

    забелязах че във вашите тестове викате around_method не на Array а на MyArray, който е негов наследник.
    Така тестовете ми минаха и нямаше проблем. Това обаче ми бъркаше в здравето затова махнах MyArray и извиках around директно на Array. Така получих необясним безкраен цикъл. Много си блъсках главата и не знам защо става.
    Затова върнах кода както си беше и пак го стартирах. Шокирах се доста като видях че сега старите unit_test – ове(т.е. с MyArray) също зациклят. Не мога да си обясня как един и същи код в началото вървеше а сега зацикля и ЗАЩО ВЪОБЩЕ ЗАЦИКЛЯ.
    @Денислав: чети внимателно – пише преминавате към а[ 1] и b[ 1] после към a[ 2] и b[ 2] в примера който даваш още от тук сравнението ще върне истина.

    Публикувано преди повече от 4 години
  24. @Денислав

    [1,2] < [1,2] # false
    [1,2] == [1,2] # true
    [1,2] > [1,2] # false

    поне аз така разбирам условието – иска се python style сравняване, или греша?

    @Матей
    ползвай незамърсено с ‘wirble’ irb

    Публикувано преди повече от 4 години
  25. @Точо

    Точо вервай ми че ползвам “незамърсено” irb, понеже съм под уиндоус и wirble-а не ми върши работа.

    EDIT2 Е явно е “замърсен” с нещо все пак, в онлайн интерпретатора не работи ;)

    @Ивайло

    Човече и при мен става точно същото с around_method. В irb си бачка но иначе зацикля. Единствената разлика е че като върна MyArray и се нормализира.

    EDIT Като коментирам всички хакове си бачка обаче ;) Т.е. в някой от тях нещо се омазва. След малко може и да разбера кой точно. Ясно :)

    Публикувано преди повече от 4 години
  26. Това което го казах че като върна MyArray не работи не е вярно. Бях направил друга грешка. Колкото до това защо зацикля ако си използваш Array, стигнах до извода че нещо се сърди в теста на прокси както и на рани места където използвам метода <<. Т.е. според мен решението си ми е вярно – човек наистина може да around-не метода << на Array, но само ако е готов да си понесе последствията.
    Публикувано преди повече от 4 години
  27. Само искам да обърна внимание на нещо, което лично мен доста ме озадачи:

    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 години
  28. Блах. Това и мен озадачи. Ще го разгледам по-късно и ще ти кажа защо…

    Публикувано преди повече от 4 години
    1. 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 години
  29. @Искрен

    недей така, че на тази задача ако почнем да събмитваме тестове ще има 1-2 със 100%… :)

    не че ми пука, ама тогава хората, които се борят за 50% ще имат 10…

    Публикувано преди повече от 4 години
  30. @Искрен: Не. Нашите тестове са нежни. Не целят до проверят дали сте измислили всеки детайл, а дали сте решили задачата си.

    Публикувано преди повече от 4 години

Нов отговор

Трябва да сте вътре за да отговаряте.