2012-07-31 4 views
4

Я новичок и изучаю рубин. Хотелось бы лучше понять заданный вопрос. Я не понимаю использование сопоставимого миксина и перечислимого миксина. Я имею в виду, что мы не включаем их в наш класс, когда нам нужно их использовать, правильно? если мы хотим сравнить два объекта, мы просто пишем x> y. Тогда в чем их явно использовать?понимание сопоставимого mixin и перечислимого mixin

ответ

5

Пункт обоих этих миксинов состоит в том, что они дают вам целую кучу методов, а только для того, чтобы реализовать один метод самостоятельно.

Без Comparable Mixin вы хотите определить >, <, >=, <= и == на вашем классе, в то время как если вы включите Comparable вам нужно только определить <=>. Comparable содержит реализации этих других методов, основанных на вашем методе <=>.

Аналогично с перечислимы вам нужно только определить each и в ответ вы получите map, inject, partition, reject и т.д ...

+0

или, как Фред, делает это лаконично –

+0

Спасибо, Фред, очень приятно объяснил. Полагаю, теперь я понимаю гораздо больше и ясное понимание темы. Надеюсь, я смогу разумно реализовать его в своих проектах. –

6

Большой вопрос Акаши!

Иногда это не так просто, как можно сравнить два объекта! Что делать, если у вас есть класс Dog? Как вы сравниваете два экземпляра Dog? Каким должно быть сравнение на основе? Достаточно ли сравнить их имя? их породы? их ДНК? Это действительно к вам. И тогда, когда вы можете включить Comparable в свою модель и реализовать минимальную функцию, необходимую для определения того, что делает два экземпляра Dog одинаковыми. Вы определяете сравнение. После того как вы определили компаратор < => в своем модуле, ваш объект затем можно сравнить для равенства или отсортировать или упорядочить, потому что рубин будет знать, КАК сравнивать один экземпляр с другим.

Аналогично, в том числе модуль Enumerable позволяет вашему классу выполнять итерацию по коллекции своих экземпляров. После того как вы реализуете каждый метод в своем классе, вы получаете все методы модуля Enumerable, доступные в вашем классе. В вашем классе могут использоваться такие методы, как map/collect и т. Д.

class Dog 
    include Enumerable 

    attr_accessor :puppies, :name 

    def initialize(name) 
    @name = name 
    @puppies = [] 
    end 

    def each(&block) 
    @puppies.each do |puppy| 
     puts "yielding #{puppy}" 
     yield(puppy) 
     puts "just yielded #{puppy}" 
    end 
    end 

end 


tommy = Dog.new("tommy") 
tommy.puppies = ["julie","moti","husky"] 

tommy.each do |p| 
    puts p 
end 

big_puppies = tommy.map{|x| x.titleize } 
+0

Теперь я понимаю гораздо больше. Большое вам спасибо за ваше драгоценное время. Объяснение мне очень помогло. –

 Смежные вопросы

  • Нет связанных вопросов^_^