Scoped обезьяна-ямочный ремонт класса - PullRequest
0 голосов
/ 15 ноября 2018

Мне нужно пропатчить класс, но я хочу, чтобы патч был локальным для некоторых модулей.В Ruby я бы сделал:

module ArrayExtension
  refine Array do
    def ===(other)
      self.include?(other)
    end
  end
end

module Foo
  using ArrayExtension
  def self.foo
    case 2
    when [1,2] then puts "bingo!"
    end
  end
end

Foo.foo          # => bingo!
puts [1,2] === 2 # => false

Есть ли что-то похожее в Crystal?

1 Ответ

0 голосов
/ 18 ноября 2018

Итак, чтобы переопределить ===, вы просто определяете его снова.

module Foo
  def ===(other)
    self.includes?(other)
  end
end

class CustomArray(T) < Array(T)
  include Foo
end

custom_array = CustomArray(Int32).new

custom_array << 1
custom_array << 2

puts custom_array === 1 # true
puts custom_array === 2 # true
puts custom_array === 3 # false
...