Ruby类之间传递变量

时间:2017-12-21 07:44:18

标签: 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()

谢谢!

3 个答案:

答案 0 :(得分:1)

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

1)将parents.computeIfPresent(child.getParentId(), (k, v) -> { v.removeChild(); return v; }); 发送到a是一种更好的编程习惯。所以你要做这样的事情; (假设b

attr_reader :name

或者你可以让它成为设置的一部分;我不会给你所有的代码,但这是它的外观

class Upper
  def test(s)
    s.name
  end
end

a = Test::Super.new('My Name')
u = Test::Upper.new
u.test(a)

这些示例都不是针对类的特别好的做法,但我想你有一个更具体的用例,你试图实现这个用于此问题的匿名用法:)

答案 1 :(得分:1)

如果出于某种原因,类Upper的实例需要访问类Super实例的内部,则意味着您存在设计缺陷。

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

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

现在,您可以使用name获取Test::Super.new("my name").name

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

class Upper < Super
  def test
    puts @name
  end
end

现在Test::Upper.new("my name").test将打印"my name",因为Upper Super派生实施。

此外,可以在封闭模块级别使用实例变量:

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"

答案 2 :(得分:-1)

您可以在模块中使用类变量,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()