ruby - 理解可比较的mixin和可枚举的mixin

标签 ruby mixins comparable enumerable

我是新手,正在学习 ruby​​。想更好地理解所问的问题。我不明白comparable mixin和enumerable mixin的用法。我的意思是,当我们需要使用它们时,我们不会将它们包含在我们的类(class)中,对吗?如果我们想比较两个对象,我们只需写 x > y。那么显式使用它们有什么用呢?

最佳答案

好问题阿卡什!

有时候,如何比较两个对象并不“简单”!如果你有一个 Dog 类怎么办?你如何比较两个 Dog 实例?比较应该基于什么?仅仅比较他们的名字就够了吗?他们的品种?他们的DNA?这真的取决于你。这就是您可以在模型中包含 Comparable 并自己实现必要的最小函数来定义使两个 Dog 实例相同的原因的时候。您定义比较。一旦您在模块中定义了 <=> 比较器,就可以比较您的对象是否相等,或者对其进行排序或排序,因为 ruby​​ 知道如何将一个实例与另一个实例进行比较。

同样,包含 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 }

关于ruby - 理解可比较的mixin和可枚举的mixin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11739628/

相关文章:

ruby - 如何在 ruby​​ 中生成部分重复的排列?

ruby-on-rails - CarrierWave 并根据其内容更正文件扩展名

ruby - 使用 Sinatra/Ruby 在 facebook 身份验证时显示用户唯一信息

css - 在 SCSS 中匹配类名

Java:如何解决缺少 Equatable 接口(interface)的问题?

java - 具有可比接口(interface)的 equals 方法契约

java - 如何使用二分搜索比较 x509 证书

javascript - Ruby 相当于 Javascript 的 'console.log(a,b)'

c++ - 实现 CRTP 链表混合 C++

interface - Typescript-使用类作为接口(interface),为什么我必须实现私有(private)成员/方法?