Jump to content

Оцени ову тему

Recommended Posts

То ради исто што и ово. 

let result = reduce(1...100, 0) {
    (result: Int, currentElement: Int) -> Int in
    if (currentElement * currentElement) % 4 == 0 {
        return result + currentElement
    } else {
        return result
    }
}

Кад мало боље размислим, еквивалент овог изнад је заправо:

let result = reduce(1...100, 0) {
     ($1 * $1) % 4 == 0 ? $0 + $1 : $0
}

Едитовао сам већ и пре него што одговориш, јер је сигурно боље од претходне варијанте са нулом. Онда не враћамо нулу, него или досадашњи резултат, или досадашњи резултат + тренутни број,  ако број задовољи услов. Да ли је то довољно добро или мислиш да ипак треба одрадити у два корака:

let filtered = filter(1...100) { 
    ($0 * $0) % 4 == 0 
}

let sum = reduce(filtered, 0) { 
    $0 + $1 
}

Али онда два пута пролазимо кроз низ (тј. кроз једном кроз оригинални низ и једном кроз краћи, филтрирани), што може бити незгодно ако имамо (1...1000000) или тако нешто.

Share this post


Link to post
Share on other sites

Што рече Knuth: "Premature optimization is the root of all evil"... :)
 

let result = reduce(1...100, 0) {
     ($1 * $1) % 4 == 0 ? $0 + $1 : $0
}

Мислим да је ово најбоље. Фора је у томе што овде имаш "мустру" тј. патерн који се понавља у пуно комплекснијим ситуацијама када пролазиш кроз низ објеката и над сваким обављаш операцију да би добио агрегатни резултат. И онда "подметање нул објекта" може да има непредвиђене сајд-ефекте, посебно када после модификујеш класе, а такви багови се по правилу тешко проналазе.
 
Оћу да кажем да није само "чистунство" него стварно има оправдање.

Share this post


Link to post
Share on other sites

Што рече Knuth: "Premature optimization is the root of all evil"... :)

 

let result = reduce(1...100, 0) {
     ($1 * $1) % 4 == 0 ? $0 + $1 : $0
}
Мислим да је ово најбоље. Фора је у томе што овде имаш "мустру" тј. патерн који се понавља у пуно комплекснијим ситуацијама када пролазиш кроз низ објеката и над сваким обављаш операцију да би добио агрегатни резултат. И онда "подметање нул објекта" може да има непредвиђене сајд-ефекте, посебно када после модификујеш класе, а такви багови се по правилу тешко проналазе.

 

Оћу да кажем да није само "чистунство" него стварно има оправдање.

 

 

Па да, оно са нулом сам био баш одвалио. Да сам написао нулу у пуној if/else конструкцији, одмах бих видео  каква је глупост у питању. :)

Share this post


Link to post
Share on other sites

У овом примеру није велика одвала, али за неки сложенији може да буде. Мада стварно кад се напише као цео if/else изгледа необично... :)

 

Овако је елегантније.

Share this post


Link to post
Share on other sites

I koliko to kosta, ako ima da se kupi u Srbiji?

Ima da se kupi ali je skuplje bar 500 evra. Bolje je sjesti na wizair i sprziti do Bazela na jednu noc. Kupis tamo za 1750 evra, i od povrata poreza jedno 5-7% pokrijes avionsku kartu, i platis samo nocenje i malo procunjas gradom. :)

Share this post


Link to post
Share on other sites

Решио сам да пробам мало да пискарам и ево га први текстић о Swift-у.

 

https://medium.com/@ivicamil/higher-order-functions-in-swift-part-1-d8e75f963d13

 

super ti je ovo :)

Share this post


Link to post
Share on other sites

Што рече Knuth: "Premature optimization is the root of all evil"... :)

 

let result = reduce(1...100, 0) {
     ($1 * $1) % 4 == 0 ? $0 + $1 : $0
}

Мислим да је ово најбоље. Фора је у томе што овде имаш "мустру" тј. патерн који се понавља у пуно комплекснијим ситуацијама када пролазиш кроз низ објеката и над сваким обављаш операцију да би добио агрегатни резултат. И онда "подметање нул објекта" може да има непредвиђене сајд-ефекте, посебно када после модификујеш класе, а такви багови се по правилу тешко проналазе.

 

Оћу да кажем да није само "чистунство" него стварно има оправдање.

 

čisto diskusije radi, razmišljam na glas:

 

Slažem se sa primedbom. Ali što se tiče onog closure-a gore, on samo deluje kao generički kod, a u stvari nije. To je funkcija koja ima dva Int parametra, i u punom zapisu bi izgledala ovako nekako:

func nekiNaziv(arg1: Int, arg2: Int) -> Int {
    return (arg1 * arg2) % 4 == 0 ? arg1 + arg1 : arg1
}

Onaj kraći zapis je samo syntactic sugar. I s obzirom da se radi sa integer-ima, nema nikakve veze i ako se sabira nula (iako je nepotrebno). Imalo bi efekta na nekom ogromnom data set-u, ali u tom slučaju svakako ne bi koristio ovu (semi)funkcionalnu paradigmu, već bi pazio na kompleksnost.

Ovaj closure nije reusable, jer se definiše na licu mesta, za nešto što ti samo tu treba i nigde više se ne koristi.

Ne može ni da bude generic zato što pretpostavlja postojanje četiri operatora: *, %, == i +. Da bi postao generic: 1. njegovi parametri bi morali da budu deklarisani kao pripadnici interfejsa koji međusobno implementiraju ove operatore, ili 2. da očekuje da se operatori proslede kao parametri (kao što to generički reduce očekuje).

 

U objc-u se preko null prelazilo bez problema, jednostavno poziv metode na null referenci ne uradi ništa. U swift-u ti pukne bad access pa gledaj šta ćeš :)

 

Tako nekako :)

Share this post


Link to post
Share on other sites

U objc-u se preko null prelazilo bez problema, jednostavno poziv metode na null referenci ne uradi ništa. U swift-u ti pukne bad access pa gledaj šta ćeš :)

 

Зависи. :)

class SomeClass {
    
    func doSomething() {
        
    }
}

class TestClass {
    
    var optionalProperty: SomeClass?
}

let test = TestClass()
test.optionalProperty.doSomething() // Ovo se neće kompajlirati.
test.optionalProperty!.doSomething() // Ovo će eksplodirati.
test.optionalProperty?.doSomething() // Ovo jednostavno ne radi ništa ako je optionalProperty == nil, slično kao u Obj-C.

Share this post


Link to post
Share on other sites

Придружите се разговору

Можете одговорити сада, а касније да се региструјете на Поуке.орг Ако имате налог, пријавите се сада да бисте објавили на свом налогу.

Guest
Имаш нешто да додаш? Одговори на ову тему

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


Све поруке на форуму, осим званичних саопштења Српске Православне Цркве, су искључиво лична мишљења чланова форума 'Живе Речи Утехе' и уредништво не сноси никакву материјалну и кривичну одговорност услед погрешних информација. Објављивање информација са сајта у некомерцијалне сврхе могуће је само уз навођење URL адресе дискусије. За све друге видове дистрибуције потребно је имати изричиту дозволу администратора Поука.орг и/или аутора порука.  Коментари се на сајту Поуке.орг објављују у реалном времену и Администрација се не може сматрати одговорним за написано.  Забрањен је говор мржње, псовање, вређање и клеветање. Такав садржај ће бити избрисан чим буде примећен, а аутори могу бити пријављени надлежним институцијама. Чланови имају опцију пријављивања недоличних порука, те непримерен садржај могу пријавити Администрацији. Такође, ако имате проблема са регистрацијом или заборављеном шифром за сајтове Поуке.орг и Црква.нет, пошаљите нам поруку у контакт форми да Вам помогнемо у решавању проблема.

×
×
  • Create New...