TaxArray
класс наследует от Array
класса:рубин метод цепочки ошибок
class TaxArray < Array
# instance methods
def for_region(region_code)
self.select{|tax|tax[:region_code].include?(region_code)}
end
def for_type(type)
self.select{|tax|tax[:type].include?(type)}
end
end
Он содержит hashes
налогов:
@taxes=TaxArray.new
@taxes << {name: "Minnesota Sales", rate: 6.875/100, type: [:food,:liquor], region_code: 'MN'}
@taxes << {name: "Downtown Liquor", rate: 3.0/100, type: [:liquor], region_code: 'MN'}
@taxes << {name: "Downtown Restaurant", rate: 3.0/100, type: [:food], region_code: 'MN'}
# fictitious WI rates
@taxes << {name: "Wisconsin Sales", rate: 5.0/100, type: [:food,:liquor], region_code: 'WI'}
@taxes << {name: "Wisconsin Food", rate: 2.0/100, type: [:food], region_code: 'WI'}
@taxes << {name: "Wisconsin Liquor", rate: 1.0/100, type: [:liquor], region_code: 'WI'}
Метод for_type
работает, как ожидалось:
> @taxes.for_type(:liquor)
=> [{name: "Minnesota Sales", rate: 6.875/100, type: [:food,:liquor], region_code: 'MN'},{name: "Downtown Liquor", rate: 3.0/100, type: [:liquor], region_code: 'MN'},{name: "Wisconsin Sales", rate: 5.0/100, type: [:food,:liquor], region_code: 'WI'},{name: "Wisconsin Liquor", rate: 1.0/100, type: [:liquor], region_code: 'WI'}]
for_region
метод работает, как ожидалось:
> @taxes.for_region('WI')
=> [{:name=>"Wisconsin Sales", :rate=>0.06, :type=>[:food, :liquor], :region_code=>"WI"}, {:name=>"Wisconsin Food", :rate=>0.02, :type=>[:food], :region_code=>"WI"}, {:name=>"Wisconsin Liquor", :rate=>0.01, :type=>[:liquor], :region_code=>"WI"}]
Однако, когда я цепь методы вместе, я получаю сообщение об ошибке:
> @taxes.for_type(:liquor).for_region('WI')
NoMethodError: undefined method `for_region' for #<Array:0x007f90320d7c20>
Каждый метод возвращает Array
, а не TaxArray
.
Должен ли я отбрасывать возвращаемое значение каждого метода на TaxArray
или есть ли другой способ?
вам либо нужно переопределить 'select', или просто явно возвращают новые' TaxArray's из ваших методов. 'select' по умолчанию возвращает новый массив. – roippi
Как бы вы его бросили? В любом случае, если вы хотите, чтобы 'select' возвращал' TaxArray', вам нужно вернуть 'TaxArray', иначе он просто вернет' Array'. –
Обратите внимание, что 'self.select' совпадает с' select', потому что если получатель не указан, 'self' является значением по умолчанию (но' self' * is * необходимо в 'self.class' в ответе @ Zach, для указания ключевого слова 'class' не предусмотрено). –