Ruby类在两个类之间传递变量

Ruby类在两个类之间传递变量,ruby,class,Ruby,Class,有没有办法在类之间传递变量? 我有下一个密码 module Test class Super def initialize(name) @name = name end end class Upper def test puts @name end end end a=Test::Super.new('My name') b=Test::Upper.new() b.test() 谢谢大家! 否,因为a是该类的实例。给你

有没有办法在类之间传递变量? 我有下一个密码

module Test
  class Super
    def initialize(name)
      @name = name
    end
  end

  class Upper
    def test
      puts @name
    end
  end
end

a=Test::Super.new('My name')
b=Test::Upper.new()
b.test()
谢谢大家!

否,因为a是该类的实例。给你两个答案

1) 将
a
发送到
b
是更好的编程实践。所以你会这样做;(假设属性读取器:名称)

或者你可以把它作为设置的一部分;我不会给你所有的代码,但下面是它的外观

a = Test::Super.new('My name')
b = Test::Upper.new(a)
b.test
=> 'My name'

这两个例子对于类来说都不是特别好的实践,但我认为您有一个更具体的用例,您正试图实现它,这个用例已经被匿名化,用于这个问题:)

您可以在模块中使用类变量,这是Ruby本机支持的

你可以做:

module Test

  @@name = ''

  class Super
    def initialize(name)
      @@name = name
    end
  end

  class Upper
    def test
      puts @@name
    end
  end
end

a=Test::Super.new('My name')
b=Test::Upper.new()
b.test()

如果出于某种原因,类
Super
的实例需要访问类
Super
实例的内部,则表示存在设计缺陷

一种可能的方法是
Super
需要通过getter公开变量:

module Test
  class Super
    def initialize(name)
      @name = name
    end
    def name
      @name
    end
  end
end
现在,您可以使用
Test::Super.new(“我的名字”).name
获得
名称


另一种可能性是
Upper
实际上是
Super
的一个子类:

class Upper < Super
  def test
    puts @name
  end
end
这将打印:

▶ Test::Super.new("my")
#⇒ #<Test::Super:0x0055dae57fe390>
▶ Test::Upper.new.test
#⇒ "my"
▶ 测试::Super.new(“我的”)
#⇒ #
▶ 测试::Upper.new.Test
#⇒ “我的”

还要避免
Super
,因为它是一个保留的ruby单词
Super
不是一个保留的ruby单词。Ruby是区分大小写的。同意,但是,等他们做类似于
super=Test::super.new的事情时,你会想知道为什么它不起作用。:)请永远不要建议在ruby中使用类变量。由于没有价值,它有许多缺点。最好在类级别的
Test
上使用实例变量。另外,
@@name
的void声明没有意义。您想在哪些类之间共享什么变量?如果您有另一个
Test::Super
实例,例如
a2=Test::Super.new('My other name')
,那么
b.Test()
会返回什么?
module Test
  def self.name=(name)
    @name = name
  end
  def self.name
    @name
  end

  class Super
    def initialize(name)
      Test.name = name
    end
  end

  class Upper
    def test
      puts Test.name
    end
  end
end
▶ Test::Super.new("my")
#⇒ #<Test::Super:0x0055dae57fe390>
▶ Test::Upper.new.test
#⇒ "my"