我正在将库移植到Julia,并且很好奇从模块添加Base函数的最佳实践。
此库包含values(t::MyType)
和keys(t::MyType)
之类的函数,它们具有唯一的结构类型,但实际上与基本函数没有做相同的事情或返回相同的类型
在这种情况下,最佳做法是什么?
Base.values(t::MyType)
和Base.keys(t::MyType)
函数,以便可以在没有前缀的情况下使用它们。my_type_keys(t::MyType)
和my_type_values(t::MyType)
MyModule.values(t)
和MyModule.keys(t)
答案 0 :(得分:5)
如果扩展基本函数,则应使它们在概念上做相同的事情。同样,您应该只扩展Base函数以在您自己的包中定义的类型上分派。规则是您可以为自己的类型定义外部函数的方法(例如Base或某些其他程序包的函数)。或为外部类型定义自己的函数。但是,为外部类型定义外部函数的方法就是“类型盗版”。
鉴于您将按自己的类型定义它们,只要函数在概念上相同,返回值就不会出现问题。
关于选项2或3,您都可以做。选项3要求您不显式导入Base函数(在这种情况下,您将通过定义新方法而不是使用相同名称定义新函数来扩展它们),不导出它们,并且很可能是您将不会在模块内部使用Base函数(例如,keys
的使用非常广泛-您可以使用它,但必须在模块内部以Base.
开头)。
选项2始终是安全的,尤其是当您找到比my_keys
更好的名称时。但是我认为如果函数在概念上做相同的事情,最好使用相同的名称,因为它可以大大简化用户体验。您可以假设大多数用户都知道基本功能,如果直观的话可以尝试一下。