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

问题描述 投票:1回答:1

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

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

p [1, 2].normalize
crystal-lang
1个回答
0
投票

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

1)您可以将类扩展为只使用所需类型的新类。

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
© www.soinside.com 2019 - 2024. All rights reserved.