gpt4 book ai didi

ruby - 续集 gem 身份/自然元素

转载 作者:太空宇宙 更新时间:2023-11-03 17:44:55 24 4
gpt4 key购买 nike

我正在尝试使用 reduce 函数来 &-connect 多个续集表达式。然而,一开始我需要一个自然元素/身份元素续集表达式。即,可以在不改变查询含义的情况下进行 & 连接的表达式。我试过只使用 nil,但这似乎不起作用。有这种事吗^^

想象一下

def reduce(buffer, array, &func)
return buffer if array.empty?

if buffer.nil? # I basically want to get rid of this
reduce(array[0], array[1..-1], &func)
else
reduce(func.call(buffer, array[0]), array[1..-1], &func)
end
end

# to be able to call:
reduce(NATURAL_ELEMENT, array_of_expressions) { |first, second| first & second }

调用Sequel.expr(nil)时我得到一个#<Sequel::SQL::Wrapper @value=>nil>但我不确切知道那有什么影响。这就是我要找的吗?

最佳答案

您想要的是一个通用集,即包含所有可能元素的集合。这是集合交叉点的标识。如果您使用 Sequel.expr(nil),您将得到一个空集。

我不知道 Sequel 中有任何通用集(或其他标识对象),但您可以尝试实现一个。下面是一个示例(使用 Singleton 模块作为衡量标准):

require "singleton"

class UniversalSet
include Singleton

def &(other)
other
end
end

UNIVERSAL_SET = UniversalSet.instance

现在您可以在集合交集操作中使用它。元素的类型无关紧要,因此它也适用于 SQL 对象。

UNIVERSAL_SET & [1, 2, 3]
#=> [1, 2, 3]

如果你愿意,你也可以为通用集实现其他集合操作。

然而,这有一个缺点,即它不可交换。如果你尝试反过来:

[1, 2, 3] & UNIVERSAL_SET

它会抛出一个错误。这是 Ruby 中可用的强制构造的限制。 (目前,您只能为数字交换式重载运算符。)

关于ruby - 续集 gem 身份/自然元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41264845/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com