😺
宇宙船演算子について
概要
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