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"