添加基函数vs在Julia中使用唯一函数名

添加基函数vs在Julia中使用唯一函数名,julia,Julia,我正在向Julia移植一个库,我很好奇从模块中添加基函数的最佳实践是什么 此库包含诸如values(t::MyType)和keys(t::MyType)之类的函数,这些函数采用唯一的结构类型,但实际上不执行与基函数相同的操作或返回与基函数相同的类型 在这种情况下,最佳做法是什么 只需添加Base.values(t::MyType)和Base.keys(t::MyType)函数,就可以不用前缀使用它们 将函数名更改为MyType\u键(t::MyType)和MyType\u值(t::MyType

我正在向Julia移植一个库,我很好奇从模块中添加基函数的最佳实践是什么

此库包含诸如
values(t::MyType)
keys(t::MyType)
之类的函数,这些函数采用唯一的结构类型,但实际上不执行与基函数相同的操作或返回与基函数相同的类型

在这种情况下,最佳做法是什么

  • 只需添加
    Base.values(t::MyType)
    Base.keys(t::MyType)
    函数,就可以不用前缀使用它们
  • 将函数名更改为
    MyType\u键(t::MyType)
    MyType\u值(t::MyType)
  • 使用它们的原始名称,并要求它们的前缀为
    MyModule.values(t)
    MyModule.keys(t)

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

考虑到您将在自己的类型上定义它们,只要函数在概念上是相同的,返回值不同就不是问题

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


选项2总是安全的,特别是如果你能找到一个比“我的钥匙”更好的名字的话。但是我认为如果函数在概念上做着相同的事情,最好使用相同的名字,因为它可以大大简化用户体验。你可以假设大多数用户都知道基本函数,如果这是直观的,可以尝试它们。

扩展基函数您应该让它们在概念上做同样的事情。此外,您应该只扩展基函数,以便在您自己的包中定义的类型上进行分派。规则是您可以为外部(例如,基或其他包)定义方法为自己的类型定义函数。或者为外部类型定义自己的函数。但为外部类型上的外部函数定义方法是“类型盗版”

考虑到您将在自己的类型上定义它们,只要函数在概念上是相同的,返回值不同就不是问题

对于选项2或选项3,您可以同时执行这两项操作。选项3要求您不显式导入基函数(在这种情况下,您将通过定义新方法而不是定义同名的新函数来扩展基函数),不导出基函数,并且很可能不在模块内使用基函数(例如,
keys
确实被广泛使用-您可以使用它,但必须在模块内部以
Base.
作为它的开头)

选项2总是安全的,特别是如果你能找到一个比
my_keys
更好的名称。但是我认为如果函数在概念上做相同的事情,最好使用相同的名称,因为它可以大大简化用户体验。你可以假设大多数用户都知道基本函数,如果这是直观的,可以尝试它们