Rubyのかくにん。

クロージャ

irb(main):001:0> def mkcounter(x)
irb(main):002:1> proc{x+=1;x}
irb(main):003:1> end
=> nil
irb(main):004:0> c1 = mkcounter(10)
=> #<Proc:0x0319e4e0@(irb):2>
irb(main):005:0> c2 = mkcounter(3)
=> #<Proc:0x0319e4e0@(irb):2>
irb(main):006:0> c1.call
=> 11
irb(main):007:0> c1.call
=> 12
irb(main):008:0> c2.call
=> 4
irb(main):009:0> c1.call
=> 13

簡単にできる。

参照渡し?

irb(main):001:0> a = [1,2,3]
=> [1, 2, 3]
irb(main):002:0> class A
irb(main):003:1> @a
irb(main):004:1> def initialize(a)
irb(main):005:2> @a = a
irb(main):006:2> end
irb(main):007:1> def set(i, v)
irb(main):008:2> @a[i] = v
irb(main):009:2> end
irb(main):010:1> end
=> nil
irb(main):011:0> aa = A.new(a)
=> #<A:0x304b14c @a=[1, 2, 3]>
irb(main):012:0> aa.set(0, 100)
=> 100
irb(main):013:0> a
=> [100, 2, 3]

参照渡し。

test