4
我可以在Python的類實例中存儲類定義中未聲明的任何數量的變量。什麼是Ruby的類似Python的變量,未在類定義中聲明?
我該如何在Ruby中做這樣的事情?
class C:
pass
a = C()
b = C()
a.a = 1
a.b = 2
b.test1 = 11
print a.a, a.b, b.test1
我可以在Python的類實例中存儲類定義中未聲明的任何數量的變量。什麼是Ruby的類似Python的變量,未在類定義中聲明?
我該如何在Ruby中做這樣的事情?
class C:
pass
a = C()
b = C()
a.a = 1
a.b = 2
b.test1 = 11
print a.a, a.b, b.test1
irb(main):001:0> class C
irb(main):002:1> end
=> nil
irb(main):003:0> a = C.new
=> #<C:0xb73aac70>
irb(main):004:0> b = C.new
=> #<C:0xb73a5838>
irb(main):005:0> a.instance_variable_set(:@a, 1)
=> 1
irb(main):006:0> a.instance_variable_set(:@b, 2)
=> 2
irb(main):007:0> b.instance_variable_set(:@test1, 11)
=> 11
irb(main):008:0> a
=> #<C:0xb73aac70 @b=2, @a=1>
irb(main):009:0> b
=> #<C:0xb73a5838 @test1=11>
除非有更多的您的使用情況所呈現的,這似乎是一個好地方,使用OpenStruct:
require 'ostruct'
a = OpenStruct.new
b = OpenStruct.new
a.a = 1
a.b = 2
b.test1 = 11
[a.a, a.b, b.test1]
# => [1, 2, 11]
根據您的使用情況,您可能希望:
require 'ostruct'
class C < OpenStruct
# You may want stuff in here...
end
a = C.new
b = C.new
a.a = 1
a.b = 2
b.test1 = 11
[a.a, a.b, b.test1]
# => [1, 2, 11]
兩種使用OpenStruct的方法都不是Python代碼的精確平行,而是其中一個似乎是li如果您不嚴格需要,請按照比instance_variable_set
更乾淨的方式來執行您想要的任何操作。
這兩個答案都很好,但這與Python的行爲更接近。 – user2398029
Ouch,Ruby是新的Perl。 –
哦,很好,我可以通過instance_variable_get獲得變量 – user1887348