如何将Ruby中的实例/访问器变量传递给另一个类,并获取存储在相应变量中的数据?

时间:2019-03-04 17:51:14

标签: ruby-on-rails ruby

参考下面的代码,有一种方法可以将变量rowclass A传递到class B#kick并获取存储的数据?

class A
  attr_accessor :row

  def fetch
    B.new.kick(self.row)
    puts row.inspect
  end
end

class B
  def kick(x)
    x = [3,4]
  end
end

@test = A.new.fetch
expect(@test.row).to eql([3,4])

当前O / P => nil

但是,如果我通过self并分配有效的方法,但是我不想使用这种方法: 工作代码

class A
  attr_accessor :row

  def fetch
    B.new.kick(self)
    puts row.inspect
  end
end

class B
  def kick(x)
    x.row = [3,4]
  end
end

@test = A.new.fetch
#=> [3, 4]

1 个答案:

答案 0 :(得分:3)

简短版本:
x = [3, 4]将创建新的数组实例并将其保存到x变量中,其中row仍将引用原始值(或没有值nil)。

另一种方法可以是kick方法来返回“被踢”的值。

class A
  def fetch
    @row = B.new.kick
    puts row.inspect
  end
end

class B
  def kick(x)
    [3,4]
  end
end

如果要遵循面向对象的编程原理“告诉我,不要问”,则可以尝试访问者模式方法。

class A
  def fetch
    B.new.kick(self)
    puts row.inspect
  end

  def save(row)
    @row = row
  end
end

class B
  def kick(x)
    x.save([3,4])
  end
end