Яни обнови решението на 25.10.2014 10:25 (преди около 10 години)
Здрасти,
Няколко неща, които забелязвам в кода ти:
- НЕ ползвай
self[ *args]
за извикване на анонимна функция.self.call *args
е същото, даже можеш да изпуснешself
. Варианта със счупените скоби е този, който най-малко харесваме от трите. - Пробвай без да monkey patch-ваш
Proc
. Не е добре да променяш обект, който се ползва буквално на всеки втори ред в Ruby. :) - Защо реши да ползваш mixin? Не може ли вместо
FilterBase
модула да имплементираш тези методи въвFilter
и да оставишTypeFilter
иSignFilter
да го наследят? Защоcall
не е част от mixin-а при положение, че се повтаря и в трите? -
@filter = ->(x){ block.call x }
е почти същото като@filter = block
. В твоя случай второто ще работи и ще е малко по-кратко/ясно. -
if ! @data.include? new_element
е другия вариант да напишешunless @data.include? new_element
. По мое мнение второто е по-четимо. - Провери как работи
Array#each
, когато не му подадеш блок. ОчаквамеNumberSet#each
да работи по същия начин.
Също, можеш ли да споделиш какво ти казва skeptic за ->(*args) { self[*args] && other[*args] }
, понеже при мен всичко е ok.
Честно казано и на мен ми се искаше да го направя по друг начин с *args но при опит да махна скобите или да го извикам без self ето какви са ми съответните резултати:
С това се сблъсках още докато го писах, но така и неразбрах защо се получава. Единсвено когато е със self и [] работи нормално. Отлкото за другите забележки, много благодаря, че ги отбелязахте - особено как мога да избегна копирането на "call" чрез наследяването(преди проблема беше че при "include" не се наследяваше правилно и при извикването на call в [] даваше грешка).