如何从Ruby中的不同类中调用对象的方法?

时间:2009-11-08 01:18:07

标签: ruby class

对于问题的措辞感到抱歉,我真的不知道怎么说。我的意思是,我怎么能这样做:

class Test
  def doSomething
    puts "I'm working"
  end
end

class numberTwo
  def doSomethingElse
    subject.doSomething
    puts "Doing other things"
  end
end
subject = Test.new
otherObject = numberTwo.new
otherObject.doSomethingElse

我想要的是当调用otherObject.doSomethingElse时,还要调用subject.doSomething。我不确定你怎么做,或者有可能。 提前谢谢。

6 个答案:

答案 0 :(得分:1)

如果您希望一个类中的方法知道另一个类的实例(当您调用“new”时创建实例,并将其分配给变量,如subject),则该变量需要

a)是全球性的,正如格伦麦克唐纳建议你使用$ subject表示的那样。 $表示全局变量

b)成为您调用的类的成员,因此不会在类外创建。因此subject将是NumberTwo的成员变量,并在NumberTwo的构造函数中初始化

c)作为参数传入。

在我看来,根据你向我们展示的内容,最简单的方法是将主题作为参数传递。

class NumberTwo
  def doSomethingElse(subject)
     subject.doSomething
  end
end

subject = Test.new
otherObject = numberTwo.new
otherObject.doSomethingElse(subject)

答案 1 :(得分:1)

您需要在调用Test实例上的方法或者只是将其作为类方法并调用它之间做出决定。如果它是前者,那么你需要在某处保持一个引用,这样调用方法就可以看到它。有几种方法可以做到这一点。

  • 提供NumberTwo #initialize或其他属性writer
  • 的引用
  • 在NumberTwo
  • 的工厂方法中分配Test
  • 使用全局变量来保存参考

除了工厂方法之外,已有一些例子,所以我会做那个......

class NumberTwo
  def doSomethingElse
    @myTest.doSomething
    puts "Doing other things"
  end
  def testFactory
    @myTest = Test.new
  end
end
otherObject = NumberTwo.new
subject = otherObject.testFactory
otherObject.doSomethingElse

答案 2 :(得分:0)

我不确定这是不是你的意思,但你可以创建一个类方法:

class Test
  def self.doSomething
    puts "I'm working"
  end
end

这应该让你在不实例化对象的情况下调用该方法。但是,您的subject.doSomething行应为Test.doSomething

很抱歉,如果我误解了你的问题。

答案 3 :(得分:0)

将“主题”更改为“$ subject”,您已全部设定。

答案 4 :(得分:0)

如果你想让一个类调用另一个类的成员,你必须使该类成为第一个类的成员,或者从该类派生。

此处numberTwo类尝试在没有引用(subject)的对象上调用方法。

答案 5 :(得分:0)

otherObject对象需要某种方式来了解something对象。您拥有的方法声明的范围可以防止类在创建方法时了解something。这是一个可能的解决方案:

class Foo
  def doSomething
    puts "I'm working"
  end
end
class Bar
  attr_accessor :foo
  def doSomethingElse
    foo.doSomething unless foo.nil?
    puts "Doing other things"
  end
end
foo = Foo.new
bar = Bar.new
bar.foo = foo
bar.doSomethingElse