未知类型的方法参数

时间:2017-09-09 17:35:39

标签: crystal-lang

我试图编写一个试图在任意对象类型上调用方法的实用程序库。在红宝石中,我会做类似的事情:

def foo(object)
  object.public_send(:bar)
rescue NoMethodError
  raise "Method not defined on object"
end

foo(instance_of_my_arbitrary_class)

我不确定如何在Crystal中执行此操作,因为我们未知的类型,因此我得到Can't infer the type of instance variable 'object'的编译器错误。

如何在不知道将传递的对象类型的情况下完成此操作?

2 个答案:

答案 0 :(得分:1)

我认为通过使用模块并包含它来解决这个问题。

module ArbitraryObject; end

class Arbitrary
  include ArbitraryObject
end

class MyLib
  def foo(object : ArbitraryObject)
    ... Code here ...
  end
end

MyLib.new(Arbitrary.new).foo

答案 1 :(得分:1)

在Crystal中,不能在任意对象上调用任意方法,因为方法在编译时解析,而不是运行时。如果用户尝试使用不兼容类型的库方法,则会出现编译时错误:

def foo(object)
  object.bar
end

class MyObj
  def bar
    puts "bar!"
  end
end

foo(MyObj.new) # => "bar!"

此处可行,因为MyObj的实例具有方法bar。但是如果你使用没有那种方法的东西,用户将得到一个编译时错误:

foo(3) # compile error: undefined method 'bar' for Int32

此错误将在程序执行前显示。