Николай обнови решението на 13.10.2012 00:13 (преди около 12 години)
- Не знам как идентираш, но определено не е със интервали. Това ти струва една точка.
- Дефинирането на един метод в друг е тъпа идея, понеже не прави каквото си мислиш.
- Бих оставил още коментари, но разместения ти код ме отказва. Съветвам те да разгледаш други решения.
Изпревариха ме, но все пак :
Като цяло return
ще ти се налага да ползваш сравнително рядко. Обикновено имаш начин да заобиколиш, като например
(2..(self / 2)).all? do |number| remainder(number).zero?
или
(1..self.abs).select { |number| number.prime? and self.remainder(number) == 0 }
* select { |x| x == elem }.size
е малко дълъг начин да пишеш count value
(http://www.ted.com/talks/terry_moore_why_is_x_the_unknown.html :) )
@Стефан Идентирането ми е точно с интервали, както пише в гайда, или поне съм се старал да е така, макар кодът да не изглежда пригледно, както беше в текстовия ми редактор. Грешката ми е, че не съм се сетил (тъпа глава) да проверя четимостта след като paste-нах кода си в сайта. Дефинирането на метод в друг съм го заимствал от Scheme, явно ще трябва да си преосмисля гледната точка.
Проблема с дефинирането на метода е, че не работи така както очакваш. Вложения define се изпълнява всеки път, когато се изпълни външния. Това което прави, е да дефинира метод върху същия клас. Демек, след като изпълниш prime_divisors
върху число, всички Integer-и ще имат метод prime?
.
Метода не е локален, което е половината причина да го правиш така в Scheme. Другата половин причина е, че имаш closure - променливите на външната функция се виждат във вътрешната. Което също не е вярно за Ruby.
С други думи, взел си идиом от Scheme и си го приложил във Ruby без да се замислиш дали наистина е приложим. Не се заяждам. Просто изтъквам, че това е ужасно грешен начин на мислене и трябва да му обърнеш внимание :)