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