Zadejte hledaný výraz...

Ruby -quot; nil can’t be coerced into Fixnum " Error

Matej Badin
verified
rating uzivatele
(1 hodnocení)
27. 6. 2011 19:27:42
Momentálne pracujem na jednom algoritmickom probléme v Ruby, využívajúc pritom memoizáciu.
Využívam pritom vlastnú funkciu, a tu je kameň úrazu, pretože za určitých okolností mi neviem preťo vráti nil a potom už neprebehne jednoduché sčítanie čísel (ak som to správne vydedukoval z nasledujúcej chyby) :
Tu je môj kód:
Online spustiteľné prostredie: https://ideone.com/uYmam
Existuje nejaký postup, ako to ošetriť, resp. robí funkcia niečo s premennými, čo by nemala?
27. 6. 2011 19:27:42
https://webtrh.cz/diskuse/ruby-quot-nil-cant-be-coerced-into-fixnum-error#reply649719
Chybná logika:
Vrací nil, pokud nenajde příslušný klíč
Správně =>
27. 6. 2011 20:30:54
https://webtrh.cz/diskuse/ruby-quot-nil-cant-be-coerced-into-fixnum-error#reply649718
naniccz
verified
rating uzivatele
(3 hodnocení)
27. 6. 2011 20:59:34
Martin Schlemmer:
O Ruby nic nevim, ale podle me podminka zajisti prave ze se r = $p.key(n) vola pouze pokud klic existuje.
27. 6. 2011 20:59:34
https://webtrh.cz/diskuse/ruby-quot-nil-cant-be-coerced-into-fixnum-error#reply649717
Nemluvím o podmínce
ale o přiřazení v druhé větvi podmínky
To má být
( + Jak by tady pomohly lepší názvy proměnných.)
27. 6. 2011 21:02:51
https://webtrh.cz/diskuse/ruby-quot-nil-cant-be-coerced-into-fixnum-error#reply649716
naniccz
verified
rating uzivatele
(3 hodnocení)
27. 6. 2011 21:09:51
M.S.: No to ja o tom mluvim taky
a taky jsem neprisel, proc by se ten program nemel zacyklit, ale treba je to ucel :-)
---------- Post added 27.6.2011 at 21:15 ----------
Jsem uplne mimo, opravdu po tom prepsani na $p to dobehne, a dokonce se to nezacykli. To je vlivem nejakeho zaokrouhlovani? Ve Schemu to nedobehne.
27. 6. 2011 21:09:51
https://webtrh.cz/diskuse/ruby-quot-nil-cant-be-coerced-into-fixnum-error#reply649715
Ten řádek dělá něco jiného, než si myslíte.
hsh.key(value) -> key
Returns the key for a given value. If not found, returns nil.
Vy ale chcete value, ne key.
Analogie v PHP by vypadala takto
Chyba:
Správně:
27. 6. 2011 21:19:22
https://webtrh.cz/diskuse/ruby-quot-nil-cant-be-coerced-into-fixnum-error#reply649714
naniccz
verified
rating uzivatele
(3 hodnocení)
27. 6. 2011 21:22:28
Aha, moje chyba, vycházel jsem z vašeho tvrzení Vrací nil, pokud nenajde příslušný klíč (místo klíč tedy spíš hodnotu), tak autorův problém je vyřešen. A teď ještě by mě zajímalo, jaktože se to nezacyklí, když pro jiné než nulové číslo to volá samo sebe na poloviční číslo --> tedy se neustále limitně blíží k nule... Předpokládám že to je tedy demonstrace zaokrouhlovací nepřesnosti, resp. nematematičnosti Ruby?
---------- Post added 27.6.2011 at 21:23 ----------
Nebo ještě varianta, že to jsou pouze celá čísla, a pak to je triviální :-)
27. 6. 2011 21:22:28
https://webtrh.cz/diskuse/ruby-quot-nil-cant-be-coerced-into-fixnum-error#reply649713
Vrací nil, pokud nenajde příslušný klíč (místo klíč tedy spíš hodnotu)
Opravdu vrací klíč k příslušné hodnotě, pokud existuje. Ale vy chcete rovnou tu hodnotu. :)
Výsledkem dělení integeru je v Ruby zase integer, proto se to nezacyklí.
Určitě by bylo čistější v té rekurzivní funkci stanovit jednoznačný base case, tohle spoléhá na vlastnost konkrétního jazyka.
27. 6. 2011 21:25:34
https://webtrh.cz/diskuse/ruby-quot-nil-cant-be-coerced-into-fixnum-error#reply649712
naniccz
verified
rating uzivatele
(3 hodnocení)
27. 6. 2011 21:32:44
Nojo, teď už je mi to jasné. Celý zmatek vznikl na tom, že Vrací nil, pokud nenajde příslušný klíč vy chápete jako hledá klíč, který odpovídá hodnotě argumentu (a vrací jej), zatímco já jako že pouze hledá klíč uvedený v argumentu (a vrací hodnotu). Díky za lekci Ruby, a poučení pro příště je, neplést se do diskuse o jazyku, který jsem nikdy neviděl :-)
27. 6. 2011 21:32:44
https://webtrh.cz/diskuse/ruby-quot-nil-cant-be-coerced-into-fixnum-error#reply649711
Nepřesně jsem se vyjádřil a za způsobené nedorozumění se omlouvám.
Pro zajímavost jak ten kód vypadá ve Scheme?
27. 6. 2011 21:35:10
https://webtrh.cz/diskuse/ruby-quot-nil-cant-be-coerced-into-fixnum-error#reply649710
naniccz
verified
rating uzivatele
(3 hodnocení)
27. 6. 2011 21:41:12
Zrovna jsem to zavřel, grr, naštěstí to je na půl minutky:
vypadá takhle (se zaokrouhlováním), aby to vracelo stejné výsledky (jinak by tam nebylo volání floor, a argument by se neustále čtvrtil, půlil a dortíkoval, a sežral celou RAM)
27. 6. 2011 21:41:12
https://webtrh.cz/diskuse/ruby-quot-nil-cant-be-coerced-into-fixnum-error#reply649709
Matej Badin
verified
rating uzivatele
(1 hodnocení)
28. 6. 2011 21:02:20
Ďakujem Martinovi za veľmi dobré objasnenie problému. Keďže v Ruby iba začínam programovať, mal by som si prečítať dôkladnejšie dokumentáciu ;)
28. 6. 2011 21:02:20
https://webtrh.cz/diskuse/ruby-quot-nil-cant-be-coerced-into-fixnum-error#reply649708
Pro odpověď se přihlašte.
Přihlásit