Ruby 是否可以临时更改链式方法调用的实例变量?
我有一个类,它将数据从数据库惰性地加载到实例变量中,它们是数组中以数字顺序排列的事件。这个类有几个方法来分析这个数组,下面是一个我如何使用它的例子Ruby 是否可以临时更改链式方法调用的实例变量?,ruby,Ruby,我有一个类,它将数据从数据库惰性地加载到实例变量中,它们是数组中以数字顺序排列的事件。这个类有几个方法来分析这个数组,下面是一个我如何使用它的例子 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 我希望能够在一个非常基本的过滤器之后将这些方法应用
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
我希望能够在一个非常基本的过滤器之后将这些方法应用于数据(例如:
您可以准备另一个实例变量,该变量由在
处设置,定义时覆盖@a
,并由分析
重置
class Foo
def initialize
@a = [1,2,3,4,5]
end
def at i
@b = @a.select{|e| e <= i}
self
end
def array
if instance_variable_defined?(:@b)
@b.tap{remove_instance_variable(:@b)}
else
@a
end
end
def analyse
array.reduce(:+)
end
end
class-Foo
def初始化
@a=[1,2,3,4,5]
结束
def在i
@b=@a.select{e}e
我不知道如何在不在at调用中重新创建一个全新的对象的情况下做到这一点,这感觉效率很低
我认为创建一个新对象并不太昂贵。您可以从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
我想“但是数组将包含完全相同的对象”是我需要听到的。
class Foo
def initialize
@a = [1,2,3,4,5]
end
def at i
@b = @a.select{|e| e <= i}
self
end
def array
if instance_variable_defined?(:@b)
@b.tap{remove_instance_variable(:@b)}
else
@a
end
end
def analyse
array.reduce(:+)
end
end
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