在Julia中添加基本函数与使用唯一函数名称

时间:2019-01-30 05:23:06

标签: julia

我正在将库移植到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)

1 个答案:

答案 0 :(得分:5)

如果扩展基本函数,则应使它们在概念上做相同的事情。同样,您应该只扩展Base函数以在您自己的包中定义的类型上分派。规则是您可以为自己的类型定义外部函数的方法(例如Base或某些其他程序包的函数)。或为外部类型定义自己的函数。但是,为外部类型定义外部函数的方法就是“类型盗版”。

鉴于您将按自己的类型定义它们,只要函数在概念上相同,返回值就不会出现问题。

关于选项2或3,您都可以做。选项3要求您不显式导入Base函数(在这种情况下,您将通过定义新方法而不是使用相同名称定义新函数来扩展它们),不导出它们,并且很可能是您将不会在模块内部使用Base函数(例如,keys的使用非常广泛-您可以使用它,但必须在模块内部以Base.开头)。

选项2始终是安全的,尤其是当您找到比my_keys更好的名称时。但是我认为如果函数在概念上做相同的事情,最好使用相同的名称,因为它可以大大简化用户体验。您可以假设大多数用户都知道基本功能,如果直观的话可以尝试一下。