gpt4 book ai didi

ruby - 是否可以临时更改链式方法调用的实例变量?

转载 作者:太空宇宙 更新时间:2023-11-03 16:48:35 25 4
gpt4 key购买 nike

我有一个类将数据从数据库延迟加载到实例变量中,它们是按数字顺序排列的数组中的事件。该类有几种分析此数组的方法,下面是我如何使用它的示例。

class Foo
def initialize
@a = [1,2,3,4,5] # data from database
end

def analyse
@a.reduce(:+)
end
end

d = Foo.new
result = d.analyse

我希望能够在非常基本的过滤器(例如:<= 3)之后将这些方法应用于数据,并且我想象能够像这样调用它:

d.at(3).analyse

而且 at方法只影响链接的实例变量 analyse称呼。即

d = Foo.new # data loaded into instance var [1,2,3,4,5]
d.analyse # 15
d.at(3).analyse # 6
d.analyse # 15

如果不在 at 调用中重新创建一个全新的对象,我不确定如何才能做到这一点,这感觉效率很低。我有一个解决方法可以改变我对 at 的调用方式方法 - 不是世界末日,但我想知道我想要的东西是否可行,同时保持高效。

最佳答案

I'm not sure how I can do this without re-creating a completely new object within the at call and this feels inefficient.

我不认为创建一个新对象太昂贵。您可以从 at 返回一个新的 Foo,并使用原始数据的子集进行初始化。您将有另一个 Foo 实例和另一个 Array 实例,但数组将包含完全相同的对象:

class Foo
def initialize(a = nil)
@a = a || [1,2,3,4,5] # use a or fetch data from database
end

def analyse
@a.reduce(:+)
end

def at(max)
Foo.new(@a.take_while { |x| x <= max })
end
end

例子:

d = Foo.new
d.analyse #=> 15
d.at(3).analyse #=> 6
d.analyse #=> 15

关于ruby - 是否可以临时更改链式方法调用的实例变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28282203/

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