Crystal Crystal 随便玩玩

mimosa · 2016年10月26日 · 最后由 dsh0416 回复于 2016年11月10日 · 7597 次阅读
class TestClass
  getter :value

  def initialize(str : String)
    initialize(str.to_i)
  end

  def initialize(@value : Int32)
  end

  def initialize(mixedA : Int32 | String, mixedB : Int32 | String)
    initialize(initialize(mixedA) + initialize(mixedB))
  end

end
icr(0.19.4) > a = TestClass.new(123)
#<TestClass:0x10432bfd0>
 => #<TestClass:0x10432bf80 @value=123>
icr(0.19.4) > b = TestClass.new("123")
#<TestClass:0x10c929fd0>
 => #<TestClass:0x10c929f70 @value=123>
icr(0.19.4) > a.value == b.value
#<TestClass:0x1066fdfd0>
 => true
icr(0.19.4) > 

Crystal for Rubyists

可以用 shards 安装就好了

感觉对显式定义 Type,然后对函数进行重载这种方法确实挺冗余的。虽然说静态类型是能提高代码分析质量的好方法,对提升性能能有很大的帮助。但在这上面还是很难和优雅之间找到一个平衡。比如

class TestClass
  getter :value

  def initialize(str : String)
    initialize(str.to_i)
  end

  def initialize(@value : Int32)
  end

  def initialize(mixedA : Int32 | String, mixedB : Int32 | String)
    initialize(initialize(mixedA) + initialize(mixedB))
  end

end

用 Ruby 来实现的话可以写成

class TestClass
  attr_reader :value
  def initialize(*args)
    @value = args.map { |v| v.to_i }.reduce(:+)
  end
end

更新: 我错了,没想到 Crystal 完全支持这种写法。。。

class TestClass
  getter :value
  def initialize(*args)
    @value = args.map { |v| v.to_i }.reduce(:+)
  end
end

只是说性能没有完全定义全那么好。。。我觉得 Crystal 符合 matz 想在 Ruby 3 中实现的 Soft Type。也就是能类型推断的就推,不能推断的就不推。Crystal 里还是保留了 *args 这种写法的兼容,我要收回之前的批评。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号