草庐IT

function - 绑定(bind)到结构的 Golang 函数类型?

coder 2023-06-28 原文

这似乎是一个愚蠢的问题,但我想创建一个包含函数集合的结构,但函数绑定(bind)到该结构。我可以看出这是一个循环,但请用这个例子来逗我:

type FuncType func() error

type FuncSet struct {
  TokenVariable  int
  FuncTyper      FuncType
}

我希望能够创建一个绑定(bind)到 FuncSet 类型的函数,以便它可以对 TokenVariable 进行操作,因此:

func (f *FuncSet) FuncType() error {
  f.TokenVariable = 100
  return nil
}

但是,这会更改类型的签名(我找不到任何有关类型绑定(bind)的信息作为函数类型规范的一部分),因此将此函数分配给结构元素会告诉我未找到此函数/变量。

我可以看到一个简单的解决方法,通过在参数前加上一个指向结构类型的指针,这有点难看。

我四处看了看,发现我正在寻找的东西有点像一个闭包,因为它可以从直接的外部范围传递一个变量但是......好吧,我很高兴得到纠正关于函数类型中缺少类型绑定(bind)的问题,但目前将指针传递给该类型看起来是可行的方法。

我想我找到了解决方案:

type nullTester func(*Bast, uint32) bool

type Bast struct {
  ...
  isNull    nullTester
  ...
 }

func isNull(b *Bast, d uint32) bool {
  return d == 0
}

然后我可以将它绑定(bind)到这样的类型:

func NewBast() (b *Bast) {
  ...
  b.isNull = isNull
  ...
}

// IsNull - tests if a value in the tree is null
func (b *Bast) IsNull(d uint32) bool {
  return b.isNull(b, d)
}

这似乎有点老套,我不确定在我将要编写的第二个库中会发生什么,它为 uint32 参数设置了不同的类型,但是 go vet 很高兴,所以也许这是正确的方法

在我看来,func 类型确实应该在语法中有一个字段来指定绑定(bind)类型,但也许我只是发现了一个可以让我进行多态性的 hack。在调用程序时,他们将看到的只是按计划绑定(bind)到类型的良好导出函数,我获得了可读性以及能够重新定位基础库以存储不同类型的数据。

我认为这是正确的解决方案。我只是找不到任何东西来确认或否认在类型名称函数规范中是否有任何断言类型的方法。它确实不应该匹配,因为绑定(bind)签名的一部分,但是带有函数的类型的语法似乎没有这种类型绑定(bind)。

我的实际代码在这里,您可以通过查看它来了解我的目标: https://github.com/calibrae-project/bast/blob/master/pkg/bast/bast.go

树存储的数据类型之间的差异完全是表面的,因为它主要用于对各种长度的无符号整数进行排序,并且它需要具备的一件重要事情是能够从一个,例如,64 位整数,但仅按前半部分或后半部分排序(因为我有一个更大的项目将这些哈希值视为邻接列表中的坐标)。理论上,它也可以用来代替哈希表查找,由于二叉树结构,查找元素的时间变化很小。

它不是传统的、基于引用向量的树,存储本身是一个数组,具有非常规的二次幂映射,是一棵“密集”树,最重要的是,以这种方式实现的目的是,当树被遍历和旋转,大部分时间它是访问连续的内存块,这应该比传统的二叉树少很多缓存未命中(并且由于这个原因,通常这种类型的应用程序只使用某种像桶排序一样排序)。

最佳答案

您可以将匿名字段与定义您要使用的方法集(可能会更改)的接口(interface)一起使用。

Go playground here

您将定义您的界面

type validator interface {
    IsRightOf(a, b interface{}) bool

    ... // other methods
}

和你的类型:

type Bast struct {
    validator // anonymous interface field

    ... // some fields
}

然后你可以从 Bast 类型访问验证器的方法

b := bast.New()
b.IsRightOf(c, d) // this is valid, you do not need to do b.validator.IsRightOf(...)

因为验证器是一个接口(interface),您可以按照自己的喜好更改这些方法。

关于function - 绑定(bind)到结构的 Golang 函数类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49970715/

有关function - 绑定(bind)到结构的 Golang 函数类型?的更多相关文章

  1. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  2. ruby - ruby 中的 TOPLEVEL_BINDING 是什么? - 2

    它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput

  3. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  4. ruby - Infinity 和 NaN 的类型是什么? - 2

    我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串

  5. ruby - 检查方法参数的类型 - 2

    我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)

  6. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  7. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  8. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  9. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  10. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

随机推荐