首页 文章

未知类型的方法参数

提问于
浏览
-1

我正在尝试编写一个实用程序库,它试图在任意对象类型上调用方法 . 在ruby中,我会做类似的事情:

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 回答

  • 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

    在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
    

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

相关问题