【问题标题】:Is it possible to extend class for limited types only?是否可以仅为有限类型扩展类?
【发布时间】:2019-12-24 19:02:04
【问题描述】:

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

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

p [1, 2].normalize

【问题讨论】:

  • 没有。但是只需为所有数组扩展 if,如果一个类型不支持它,它仍然无法编译。

标签: crystal-lang


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    相关资源
    最近更新 更多