😺

宇宙船演算子について

2023/10/30に公開

概要

Comparableをインクルードすると、定義した宇宙船演算子を使用する。

やってみる

# frozen_string_literal: true

require 'rspec'

class FrenchFries
  include Comparable

  attr_reader :size

  SIZES = %w[S M L].freeze

  def initialize(size)
    raise ArgumentError unless SIZES.include?(size)

    @size = size
  end

  def <=>(other)
    return nil unless other.is_a?(self.class)

    return 0 if @size == other.size

    return 1 if @size == 'L'

    if @size == 'M'
      return other.size == 'S' ? 1 : -1
    end

    -1
  end
end

RSpec.describe FrenchFries do
  describe '#<=>' do
    let(:s) { described_class.new('S') }
    let(:other_s) { described_class.new('S') }
    let(:m) { described_class.new('M') }
    let(:l) { described_class.new('L') }

    it do
      expect(s == 's').to eq false
      expect(s == other_s).to eq true
      expect(l == m).to eq false
      expect(l > m).to eq true
      expect(l > s).to eq true
    end
  end
end

※比較出来ない場合は、nilを返す。

Discussion