是否可以仅针对有限类型扩展 class?

Is it possible to extend class for limited types only?

我只想将 normalize 方法添加到数字数组(浮点数和整数),因为它对字符串没有意义。但是它不会编译,这可能吗?

class Array(Number)
  def normalize
    multiplier = 1 / max
    map{ |v| multiplier * v }
  end
end

p [1, 2].normalize

这是不可能的,我相信您已经看到了。因此,您有两个选择。

1) 您可以将 class 扩展为一个只使用您想要的类型的新类型。

class NumberArray < Array(Number)
  # Do something
end

明显的缺点是您不能将 Array(Number) 用作 NumberArray

2) 您可以围绕 normalize 方法编写保护子句,检查数组类型并确保它是一个数字数组。

class Array(T)
  def normalize
    {% unless T < Number %}
      {% raise "Expected Number type for Array#normalize, got #{T}" %}
    {% end %}
    multiplier = 1 / max
    map { |v| multiplier * v }
  end
end