Я новичок и изучаю рубин. Хотелось бы лучше понять заданный вопрос. Я не понимаю использование сопоставимого миксина и перечислимого миксина. Я имею в виду, что мы не включаем их в наш класс, когда нам нужно их использовать, правильно? если мы хотим сравнить два объекта, мы просто пишем x> y. Тогда в чем их явно использовать?понимание сопоставимого mixin и перечислимого mixin
ответ
Пункт обоих этих миксинов состоит в том, что они дают вам целую кучу методов, а только для того, чтобы реализовать один метод самостоятельно.
Без Comparable
Mixin вы хотите определить >
, <
, >=
, <=
и ==
на вашем классе, в то время как если вы включите Comparable
вам нужно только определить <=>
. Comparable
содержит реализации этих других методов, основанных на вашем методе <=>
.
Аналогично с перечислимы вам нужно только определить each
и в ответ вы получите map
, inject
, partition
, reject
и т.д ...
Большой вопрос Акаши!
Иногда это не так просто, как можно сравнить два объекта! Что делать, если у вас есть класс 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 }
Теперь я понимаю гораздо больше. Большое вам спасибо за ваше драгоценное время. Объяснение мне очень помогло. –
или, как Фред, делает это лаконично –
Спасибо, Фред, очень приятно объяснил. Полагаю, теперь я понимаю гораздо больше и ясное понимание темы. Надеюсь, я смогу разумно реализовать его в своих проектах. –